我希望有人能帮我解释一下德墨忒耳定律。如果我有一个类,我假设它是一个聚合根,并且其中有一个子类的集合,通过聚合根访问这些子类来更新它们的属性是否非法?
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
}
假设我有一个客户首先要访问 Company 类,那么它是否会违反类似的 Demeter 法则。
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");
第二个似乎更好,但是客户端必须知道它想要更新的 Employee 的 id 有什么问题吗?
当您有许多嵌套聚合时,这似乎会开始变得复杂。
Thanks
你的第二个选择就是德米特法则的目标。
由于德米特定律基本上规定“只谈论你所知道的”……无论第一个场景中的“客户”是什么,实际上根本不了解员工。它知道一个Company
..但不是关于复杂性Company
内部结构。
委托给Company
让您可以灵活地更改员工的更新方式,而无需从客户端更改此功能的每个特定实例。如果有一天你决定只Active
员工可以更改姓名,那么您必须将选项一的每个实例更新为:
Employee e = aCompany.Employees.Where(e => e.Id == 1 && e.IsActive).Single();
// ^^^^ active flag
e.LastName = "MarriedName";
把它包起来Company
使得将来处理这个问题变得更好(无论是否尝试遵循德米特法则)。
第二个似乎更好,但是客户端必须知道它想要更新的 Employee 的 id 有什么问题吗?
你的两个例子都知道员工的ID..所以我不确定你的意思。通过聚合传递信息时,使用代码了解 ID 是很常见的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)