質問
誰かが私にデメーターの法則を説明するのを助けることができることを願っています。私が想定しているクラスが集約されていて、その中に子クラスのコレクションがある場合は、それらにアクセスすることによってそれらの子クラスのプロパティを更新することは違法ですか?
e.g.
public class Company
{
// company has a number of employees
public List<Employee> Employees {get; set;}
}
public class Employee
{
// each employee has a lastname
public int Id {get; set;}
public string LastName {get; set;}
// other properties of employee
}
.
最初に会社クラスにアクセスしているクライアントがあるとしてみましょう。
Employee e = aCompany.Employees.Where(e => e.Id == 1).Single();
e.LastName = "MarriedName";
.
またはこれは常に会社に委任されるべきです
public class Company
{
public UpdateEmployeeLastName(int employeeId, string newName)
{
Employee e = Employees.Where(e => e.Id == employeeId).Single();
e.LastName = newName;
}
}
.
クライアント
aCompany.UpdateEmployeeLastName(1, "Marriedname");
.
2番目のものは良いようですが、更新したい従業員のIDを知る必要があるクライアントに問題があるのですか?
これは、あなたがたくさんの入れ子になった集計を持っている場所に複雑になることができるようです。
ありがとう
解決
あなたの2番目の選択肢は、デメテルの法則が目的とするものです。
現地の法則は基本的に「あなたが知っているものと話すだけ」を述べています。それはCompany
について知っています。
Company
に委任すると、この機能の各特定のインスタンスをクライアントから変更する必要なしに、従業員の更新方法を変更する柔軟性が得られます。ある日、Company
の従業員だけが自分の名前を変更できると判断した場合は、オプション1のすべてのインスタンスをこれに更新する必要があります。
Employee e = aCompany.Employees.Where(e => e.Id == 1 && e.IsActive).Single();
// ^^^^ active flag
e.LastName = "MarriedName";
.
Active
で包まれていることは、将来的には将来的に対処するために(DEMETERの法則に従うかどうかにかかわらず)。
2番目のものは良いようですが、更新したい従業員のIDを知る必要があるクライアントに問題があるのですか?
両方の例は従業員のIDを知っています。だから私はこれによって何を意味するのかわからない。集計を通じて情報を渡すときにコードを消費することは非常に一般的です。
所属していません StackOverflow