最近、クラスでのデータと行動の分離について話し合いました。データと動作の分離の概念は、ドメインモデルとその動作を別々のクラスに配置することによって実装されます。
しかし、私はこのアプローチの想定される利点を確信していません。それは「偉大な」人によって造られたかもしれませんが(私にはわかりませんが、マーティン・ファウラーだと思います)。ここに簡単な例を示します。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
}
}
これは有益であり、柔軟性を向上させ、緩い結合を提供すると思われます。方法がわかりません。私によると、これは余分なコーディングとパフォーマンスのペナルティをもたらし、毎回2つのクラスオブジェクトを初期化する必要があります。そして、私はこのコードを拡張することでより多くの問題を見ます。上記の場合に継承を導入するとどうなるか考えてみてください。両方のクラスを継承する必要があります
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;
}
}
別のクラスで動作を分離した場合でも、Behaviorクラスメソッドが機能するには、Dataクラスのオブジェクトが必要であることに注意してください。したがって、最終的には、モデルオブジェクトの形式のデータがありますが、Behaviorクラスにはデータと動作の両方が含まれます。
いくつかのインターフェースをミックスに追加できると言うかもしれません。そうすれば、IPersonServiceとIEmployeeServiceを使用できます。しかし、すべてのクラスにインターフェースを導入し、インターフェースから継承することは問題ないように思われます。
では、同じクラスに入れることでは達成できなかった、上記のデータと動作を分離することで何を達成したかを教えてください。