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.
中找到
我是否违反了“得墨忒耳法则”? 例如,我创建了一个 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.