加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 面向对象编程:分离数据和行为

发布时间:2020-12-15 06:45:33 所属栏目:百科 来源:网络整理
导读:最近我们在类中讨论了数据和行为分离.数据和行为分离的概念是通过将域模型及其行为放在单独的类中来实现的. 不过,我不相信这种做法的好处.即使它可能是由“伟大的”造成的(我认为是马丁福勒,虽然我不知道).我在这里提供一个简单的例子.假设我有一个Person类,
最近我们在类中讨论了数据和行为分离.数据和行为分离的概念是通过将域模型及其行为放在单独的类中来实现的.
不过,我不相信这种做法的好处.即使它可能是由“伟大的”造成的(我认为是马丁福勒,虽然我不知道).我在这里提供一个简单的例子.假设我有一个Person类,它包含一个Person及其方法(行为)的数据.
class Person
{
    string Name;
    DateTime BirthDate;

    //constructor
    Person(string Name,DateTime BirthDate)
    {
        this.Name = Name;
        this.BirthDate = BirthDate;
    }

    int GetAge()
    {
        return Today - BirthDate; //for illustration only
    }

}

现在,将行为和数据分离成单独的类.

class Person
{
    string Name;
    DateTime BirthDate;

    //constructor
    Person(string Name,DateTime BirthDate)
    {
        this.Name = Name;
        this.BirthDate = BirthDate;
    }
}

class PersonService
{
    Person personObject;

    //constructor
    PersonService(string Name,DateTime BirthDate)
    {
        this.personObject = new Person(Name,BirthDate);
    }

    //overloaded constructor
    PersonService(Person personObject)
    {
        this.personObject = personObject;
    }

    int GetAge()
    {
        return personObject.Today - personObject.BirthDate; //for illustration only
    }
}

这应该是有益的,并提高灵活性并提供松耦合.我看不到怎么样据我所知,这引入了额外的编码和性能损失,每次我们必须初始化两个类对象.我在扩展这个代码时看到更多的问题.考虑在上面介绍继承时会发生什么.我们必须继承这两个类

class Employee: Person
{
    Double Salary;

    Employee(string Name,DateTime BirthDate,Double Salary): base(Name,BirthDate)
    {
        this.Salary = Salary;       
    }

}

class EmployeeService: PersonService
{
    Employee employeeObject;

    //constructor
    EmployeeService(string Name,Double Salary)
    {
        this.employeeObject = new Employee(Name,BirthDate,Salary);
    }

    //overloaded constructor
    EmployeeService(Employee employeeObject)
    {
        this.employeeObject = employeeObject;
    }
}

请注意,即使我们在一个单独的类中隔离行为,我们仍然需要使用“类”类的对象来执行Behavior类方法.所以最后我们的Behavior类包含数据和行为,尽管我们有一个模型对象形式的数据.
你可以说可以添加一些接口到混合,所以我们可以有IPersonService和IEmployeeService.但是,我认为为每个类引入接口并从接口继承似乎不行.
那么那么你可以告诉我,在上述情况下,通过分开数据和行为来实现这一点,我不能通过将它们放在同一个类中来实现

解决方法

实际上,Martin Fowler说,在领域模型中,数据和行为应该结合起来.看看 AnemicDomainModel.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读