我在打破“得墨meter耳法则”吗?
例如,我创建了一个包含姓名,电话和ID的类(class)人员,它与数据库中的列匹配。
当我想使用个人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());
}

我使用的是dataName和getPhone由databaseComponent返回。这就是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在这种情况下有什么优势。

最佳答案

LoD说:

您正在用自己的方法(顺序和人)创建对象;然后在它们上调用方法。或更准确地说:您正在创建一个实例化另一个实例。
对我来说似乎很好-这里没有违反LoD的要求。
我宁愿担心不要在这里问。您获取一个Person的所有这些属性以将其推送到Order中。为什么在订单类上没有像public void setRecipient(Person p)之类的方法?
另一方面,这可能意味着要打破Order的单一责任。从这种意义上说,您的代码仍然可以,例如,如果可以在SetupOrderService支持类中找到它。

关于java - Java中的Demeter混淆定律,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46239740/

10-09 03:33