gpt4 book ai didi

c# - 面向对象编程 : Separation of Data and Behavior

转载 作者:可可西里 更新时间:2023-11-01 07:43:32 26 4
gpt4 key购买 nike

最近我们讨论了类中的数据和行为分离。通过将域模型及其行为放入单独的类中来实现数据和行为分离的概念。
但是,我不相信这种方法的假定好处。尽管它可能是由某个“伟人”创造的(我认为是 Martin Fowler,尽管我不确定)。我在这里举一个简单的例子。假设我有一个包含 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
}
}

这应该是有益的,可以提高灵 active 并提供松耦合。我不知道如何。根据我的说法,这引入了额外的编码和性能损失,每次我们都必须初始化两个类对象。而且我在扩展这段代码时看到了更多问题。考虑一下当我们在上述情况下引入继承时会发生什么。我们必须继承这两个类

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, DateTime BirthDate, Double Salary)
{
this.employeeObject = new Employee(Name, BirthDate, Salary);
}

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

请注意,即使我们将行为隔离在一个单独的类中,我们仍然需要 Data 类的对象才能使 Behavior 类方法正常工作。所以最后我们的行为类包含数据和行为,尽管我们有模型对象形式的数据。
您可能会说您可以将一些接口(interface)添加到组合中,这样我们就可以拥有 IPersonService 和一个 IEmployeeService。但我认为为每个类引入接口(interface)并从接口(interface)继承似乎不太好。

那么您能否告诉我,通过将上述情况中的数据和行为分开,我实现了哪些我无法通过将它们放在同一类中实现的实现?

最佳答案

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

关于c# - 面向对象编程 : Separation of Data and Behavior,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11389948/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com