Java 中的 Demeter 混乱法则

Law of Demeter confusion in Java

我是否违反了“得墨忒耳法则”? 例如,我创建了一个 Class person,其中包含姓名、phone 和 id,它与我的数据库中的列匹配。 当我想使用人的 id.I 填写我的订单信息时,请这样做。

 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 return databaseComponent.That 的 break 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;
}

但我认为在 public 方法中它仍然破坏了 LoD.Some 人们使用这种方法。

public class Util {
public static void fillOrder(Order order,Person person){
    order.setPhone(person.getPhone());
    order.setName(person.getName());
    return;
}}

是的,也许它不会破坏 LoD。但为什么呢?可能是 Client 没有耦合到 class Person.But 它耦合到 Util。 LoD在这个场合有什么优势呢

LoD 说:

More formally, the Law of Demeter for functions requires that a method m of an object O may only invoke the methods of the following kinds of objects:[2]

O itself

m's parameters

Any objects created/instantiated within m

O's direct component objects

A global variable, accessible by O, in the scope of m

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

我觉得没问题 - 这里没有违反 LoD。

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

另一方面,这可能意味着打破秩序的单一职责。从这个意义上说,您的代码仍然可以,例如,如果在某些 SetupOrderService 支持 class.

中找到