最近我们讨论了类中的数据和行为分离。数据和行为分离的概念是通过将领域模型及其行为放在单独的类中来实现的。
但是,我不相信这种方法的所谓好处。尽管它可能是由“伟大的”创造的(我认为是 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
}
}
这应该是有益的,可以提高灵活性并提供松散耦合。我不明白怎么做。据我说,这引入了额外的编码和性能损失,每次我们必须初始化两个类对象。而且我在扩展此代码时看到了更多问题。考虑当我们在上述情况下引入继承时会发生什么。我们必须继承这两个类
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 类方法。因此,最终我们的 Behavior 类包含数据和行为,尽管我们拥有模型对象形式的数据。
你可能会说你可以添加一些接口到 mix 中,所以我们可以有 IPersonService 和一个 IEmployeeService。但我认为为每个类引入接口并从接口继承似乎并不好。
那么,您能告诉我在上述情况下分离数据和行为所取得的成就是我无法通过将它们放在同一个班级中实现的吗?