我是否打破了“得墨忒耳法则”? 例如,我创建一个包含名称,电话和ID的类人员,它与我的数据库中的列匹配。 当我想使用人的身份填写我的订单信息时。我喜欢这样。
public static void fill(Order order) {
DatabaseComponent databaseComponent = new DatabaseComponent();
Person person = databaseComponent.getById(order.getUserId());
order.setName(person.getName());
order.setPhone(person.getPhone());
}
我使用getName和getPhone返回dataComponent.That打破了LoD。 有人建议我可以这样做
public void fill(Order order) {
DatabaseComponent databaseComponent = new DatabaseComponent();
Person person = databaseComponent.getById(order.getId());
fillOrder(order,person);
}
private void fillOrder(Order order,Person person){
order.setPhone(person.getPhone());
order.setName(person.getName());
return;
}
但我认为在公共方法中它仍然打破了LoD。有些人使用这种方法。
public class Util {
public static void fillOrder(Order order,Person person){
order.setPhone(person.getPhone());
order.setName(person.getName());
return;
}}
是的,它可能不会破坏LoD。但是为什么呢?可能是Client并没有加入Person类。但它与Util相连。 LoD在这个场合有什么好处。
答案 0 :(得分:4)
LoD说:
更正式地说,函数的Demeter法则要求对象O的方法m只能调用以下类型对象的方法:[2]
O本身
m&#39>参数
在m
中创建/实例化的任何对象O的直接组件对象
一个全局变量,可由O访问,范围为m
您正在方法中创建对象(订单和人);然后你调用它们的方法。或者确切地说:您正在创建一个而实例化另一个。
对我来说似乎很好 - 这里没有违反LoD。
我宁愿担心告诉不要在这里问。您获取Person的所有这些属性以将其推送到Order中。为什么不在public void setRecipient(Person p)
之类的订单类上使用方法?
另一方面,这可能意味着打破秩序的单一责任。从这个意义上说,您的代码仍然可以正常,例如,如果要在某个SetupOrderService
支持类中找到它。