1

有两个代码片段:

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

第二个:

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

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

第二个有什么好处?

4

3 回答 3

5

避免这两种形式。在编写软件时,得墨忒耳定律是一个重要的指导原则

每个单元应该只对其他单元有有限的了解:只有与当前单元“密切”相关的单元。

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

只与您的直系朋友交谈。

你违反了这条法律,因为你someObject知道那是bla2performBlah方法的。如果它确实需要这种方法,他们就会将它移到外部世界并someObject隐藏起来。bla1bla2

someObject.getBla1().getBla2().performBlah()然后将成为someObject.performBlah()并且内部实现someObject.performBlah可能会委托给bla1后者,而后者又会委托给它bla2以获取实现。重要的是要确保每个对象只知道它的直接朋友并且不接触更广阔的世界(例如someObject只知道关于bla1bla1只知道关于bla2)。

于 2012-06-26T10:35:18.757 回答
3

您应该避免像您给出的第一个示例那样使用点链接,因为如果出现任何像异常这样的失败,您将得到它发生的行。因此,在第一种情况下,您在同一行中有很多电话。这样,您将无法知道哪些调用引发了异常(例如空指针异常)。在第二个示例中,尽管它看起来不那么“干净”,但实际上更容易发现失败,因为您将确切知道哪个调用失败了。

于 2012-06-26T10:27:24.907 回答
0

第二个可以更清楚地了解您正在做什么,但是只要您的对象和方法提供流畅的接口,我个人认为第二个没有问题。

于 2012-06-26T10:23:07.130 回答