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