为什么要避免点运算符链接

时间:2012-06-26 10:21:02

标签: coding-style refactoring

有两个代码段:

someObject.getBla1().getBla2().performBlah();

第二个:

bla1=someObject.getBla1();
bla2=bla1.getBla2();
bla2.performBlah();

我总是被告知要避开第一个,并使用第二个,因为我觉得第二个只是一个痛苦。

第二个有什么好处?

3 个答案:

答案 0 :(得分:5)

避免两种形式。在编写陈述

的软件时,law of demeter是一个重要的指导原则
  

每个单位应该对其他单位的知识有限:只有单位"密切关注"与当前单位有关。

     

每个单位只应与其朋友交谈;不要和陌生人说话。

     

只与你的直接朋友交谈。

您违反此法律,因为someObject知道bla2performBlah方法。如果确实需要这种方法,则将其移至someObject并隐藏bla1bla2来自外部世界。

然后

someObject.getBla1().getBla2().performBlah()将成为someObject.performBlah()someObject.performBlah的内部实施可能会委托给bla1bla2会委托给someObject以获得实施。重要的是要确保每个对象只知道它的直接朋友并且不会进入更广阔的世界(例如bla1只知道bla1bla2只知道约{{1}})。

答案 1 :(得分:3)

你应该像你给出的第一个例子一样避免点链,因为如果出现任何类似Exception的失败,你将得到它发生的行。因此,在第一种情况下,您在同一行中有许多调用。这样,您将无法知道抛出异常的调用(例如空指针异常)。在第二个示例中,即使它看起来不那么“干净”,但实际上更容易发现故障,因为您将确切地知道呼叫失败了。

答案 2 :(得分:0)

第二部分更清楚地了解你正在做什么,但只要你的对象和方法提供流畅的界面,我认为做第二部分没有任何问题。