Недавно мы обсудили разделение данных и поведения в классах. Концепция разделения данных и поведения реализуется путем размещения модели домена и ее поведения в отдельных классах.
Однако я не убежден в предполагаемых преимуществах такого подхода. Хотя это, возможно, было придумано "великим" (я думаю, что это Мартин Фаулер, хотя я не уверен). Здесь я представляю простой пример. Предположим, у меня есть класс 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 содержит как данные, так и поведение, хотя мы имеем данные в форме модельного объекта.
Вы можете сказать, что вы можете добавить некоторые интерфейсы в микс, чтобы мы могли иметь IPersonService и IEmployeeService. Но я думаю, что введение интерфейсов для каждого класса и наследование с интерфейсов не выглядит нормально.
Итак, тогда вы можете рассказать мне, что я достиг, разделив данные и поведение в приведенном выше случае, которых я не мог добиться, если бы они были в одном классе?