德克萨斯州德米特混淆法则

时间:2017-09-15 12:35:22

标签: java law-of-demeter

我是否打破了“得墨忒耳法则”? 例如,我创建一个包含名称,电话和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在这个场合有什么好处。

1 个答案:

答案 0 :(得分:4)

LoD说:

  

更正式地说,函数的Demeter法则要求对象O的方法m只能调用以下类型对象的方法:[2]

     

O本身

     

m&#39>参数

     

在m

中创建/实例化的任何对象      

O的直接组件对象

     

一个全局变量,可由O访问,范围为m

您正在方法中创建对象(订单和人);然后你调用它们的方法。或者确切地说:您正在创建一个而实例化另一个。

对我来说似乎很好 - 这里没有违反LoD。

我宁愿担心告诉不要在这里问。您获取Person的所有这些属性以将其推送到Order中。为什么不在public void setRecipient(Person p)之类的订单类上使用方法?

另一方面,这可能意味着打破秩序的单一责任。从这个意义上说,您的代码仍然可以正常,例如,如果要在某个SetupOrderService支持类中找到它。