我在打破“得墨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/