Engee中的面向对象编程:结构与方法
面向对象编程(oop)是一种基于"对象"概念的编程范例,可以包含数据(以字段或属性的形式)和代码(以方法的形式)。 OOP的基本原则包括:
- 封装-在一个结构中结合数据和处理它们的方法
- 继承-基于现有类创建新类的能力
- *多态性—-不同类的对象响应相同消息的能力
Engee是一种编程语言,最初是为高性能计算而开发的,并不是纯粹的面向对象语言。 但是,它通过以下方式支持一些OOP概念:
-自定义类型(结构)
-Multiple dispatch(类方法更强大的替代方案)
-组成(而不是继承)
Engee的方法与Python或Java等语言中的传统OOP不同,但它允许您以更灵活的方式实现类似的结果。
Engee的OOP风格特别有用。:
-处理复杂数据结构时
-当需要对具有明确实体的主题区域进行建模时
-用于在大型项目中组织代码
-当需要函数的多态行为时
虽然Engee不是纯粹的面向对象语言,但它为组织OOP风格的代码提供了强大的工具。 结构与多个调度相结合的使用为传统的OOP提供了一个灵活的替代方案,它可以在科学计算和Engee创建的其他领域中更具表现力和生产力。
代码示例分析
让我们来看看这个示例,它演示了Engee中OOP的基本功能。:
struct Person # Определяем тип (аналог класса)
    name::String
    age::Int
end
在这里我们创建一个结构 Person 有两个字段: name (字符串)和 age (整数)。 在OOP术语中,这类似于创建具有属性的类。
function greet(person::Person) # Метод для типа Person (аналог метода класса)
    println("Привет, меня зовут $(person.name), мне $(person.age) лет!")
end
这是一个专门用于处理类型的函数 Person. 在Engee中,方法不像传统的OOP那样"属于"对象,但是由于多次调度,我们可以为不同类型创建函数的专门版本。
function test_person()
    person = Person("Анна", 25)
    
    @assert person.name == "Анна"
    @assert person.age == 25
    
    println("Тест метода greet():")
    greet(person)
    
    println("Тест пройден успешно!")
end
在测试函数中,我们创建一个结构的实例 Person,检查其字段并调用该方法 greet.
扩展示例:员工管理系统
让我们将示例扩展到更实际的应用程序。 此代码是在Engee中使用面向对象方法的简单员工管理系统的实现。 该系统基于两种用户类型: Employee (雇员)及 Manager (经理)。 类型 Employee 包含基本字段:identifier(id),名字(name)、系(department)和工资(salary). 类型 Manager 使用包含对象的合成 Employee 并通过添加经理特定的字段,团队的规模(team_size)和奖金(bonus).
该代码通过几个专门的功能演示了OOP的关键原则。 功能 annual_salary 它有两种实现方式—对于普通员工(简单地将月薪乘以12)和经理(在年薪上增加奖金)。 功能 print_info 它还为不同类型的员工重载,提供多态行为-根据对象的类型输出不同的信息。 功能 give_raise! 通过指定的百分比修改员工的工资,使用可变数据演示工作(函数名称中的感叹号是具有副作用的函数的Engee约定)。
测试功能 test_employee_system 创建员工和经理的实例,演示所有方法的操作。 实现的一个特点是Engee对OOP的方法-而不是经典的继承,使用组合(管理器包含一个employee对象),通过多次调度(不同类型的参数的不同函数实现)实现多态性。 该代码说明了如何在Engee中组织数据结构和OOP风格的行为,同时保持语言的高性能。
mutable struct Employee
    id::Int
    name::String
    department::String
    salary::Float64
end
struct Manager
    employee::Employee 
    team_size::Int
    bonus::Float64
end
function annual_salary(emp::Employee)
    emp.salary * 12
end
function annual_salary(mgr::Manager)
    (mgr.employee.salary * 12) + mgr.bonus
end
function print_info(emp::Employee)
    println("""
    Сотрудник: $(emp.name)
    ID: $(emp.id)
    Отдел: $(emp.department)
    Месячная зарплата: $(emp.salary)
    Годовая зарплата: $(annual_salary(emp))
    """)
end
function print_info(mgr::Manager)
    println("""
    Менеджер: $(mgr.employee.name)
    ID: $(mgr.employee.id)
    Отдел: $(mgr.employee.department)
    Размер команды: $(mgr.team_size)
    Месячная зарплата: $(mgr.employee.salary)
    Бонус: $(mgr.bonus)
    Годовая зарплата: $(annual_salary(mgr))
    """)
end
function give_raise!(emp::Employee, percent::Float64)
    emp.salary *= (1 + percent/100)
    println("Зарплата $(emp.name) повышена на $percent%")
end
# Создаем обычного сотрудника
emp1 = Employee(101, "Иван Петров", "IT", 1500.0)
# Создаем менеджера (который содержит сотрудника)
mgr1 = Manager(Employee(201, "Анна Сидорова", "IT", 2500.0), 5, 5000.0)
# Выводим информацию
println("\nИнформация о сотруднике:")
print_info(emp1)
println("\nИнформация о менеджере:")
print_info(mgr1)
# Повышаем зарплату
give_raise!(emp1, 10.0)
give_raise!(mgr1.employee, 8.0)  # Обращаемся к вложенному сотруднику
# Проверяем новые зарплаты
println("\nПосле повышения:")
print_info(emp1)
print_info(mgr1)
println("\nТест завершен успешно!")
结论
总而言之,值得再次弄清楚Engee中函数式编程的哪些类似物和特性可以用来实现面向对象的方法。
工程中OOP的主要概念
- 
结构而不是类:Engee使用结构( struct)来创建可以包含数据但不能包含方法的自定义类型(函数是单独定义的)。
- 
多重调度:与传统的OOP不同,方法"属于"对象,在Engee中函数是独立定义的,并且根据所有参数的类型选择特定的实现。 
- 
组合而不是继承:Engee不支持经典继承。 相反,建议使用组合(在另一个对象中包含一个对象),如示例中所示 Manager,含Employee.
- 
封装:默认情况下,Engee中结构的所有字段都是公共的。 模块或命名约定可用于封装(例如,用下划线开始私有字段)。 
- 
多态性:通过多个调度实现-同一函数的不同方法可以根据参数的类型调用。 
Engee方法对巴解组织的优点****
- 
灵活性:多重调度比经典的OOP更强大,因为它允许您根据所有参数选择方法的实现,而不仅仅是第一个参数(如Python或Java)。 
- 
性能:Engee类型系统和编译器针对结构进行了优化,可确保高性能。 
- 
代码清晰:分离数据(结构)和行为(方法)可以使代码更清晰,更易于维护。