Объектно-ориентированное программирование :Разделение данных и поведения

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

Итак, можете ли вы сказать мне, чего я добился, разделив данные и поведение в приведенном выше случае, чего я не мог бы достичь, если бы они были в одном классе?

16
задан devanalyst 9 July 2012 в 06:22
поделиться