【问题标题】:Why avoid dot operator chaining为什么要避免点运算符链接
【发布时间】:2012-06-26 10:21:01
【问题描述】:

sn-ps有两个代码:

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

第二个:

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

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

第二个有什么好处?

【问题讨论】:

  • 如果函数返回调用该函数的对象,则链接更短。但是如果函数返回一些其他的东西,最好分开。
  • 您没有指定语言,只有分号给出了提示。点链在 Ruby 中很重要且经常使用。
  • @karatedog 你的评论没有任何帮助。 a 他没有询问 Ruby 并且 b 它被频繁使用并不能使它成为好的(或至少毫无疑问的)实践——他问的是为什么有些人认为应该避免它的问题。此外,很明显,除非您知道某种语言使用点来指代对象的属性/方法以外的其他内容,否则语言并不重要(您可以说字符串连接,但大括号不适合)。
  • 我没有回答 Ruby,这只是一个例子。接受的答案清楚地证明了这个问题可能会被误解。 Ruby 中的点链在 Linux/Unix 中用作管道。如果你想grep 一个文件,然后用sed 修改结果,你不会实现一个新的实用程序来实现这两个功能。你把它们锁起来。或者您执行一个,存储结果,然后执行另一个。您必须使用 OP 中的一种表格。接受的答案告诉你不要这样做。然而,公认的答案是正确的,但在一个完全不同的问题域中。太糟糕了,这个只有 1 个问题的用户已经离开了。

标签: coding-style refactoring


【解决方案1】:

避免这两种形式。 law of demeter 是编写软件时的重要指南,说明

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

每个单位都应该只和它的朋友交谈;不要和陌生人说话。

只与你的直系朋友交谈。

您违反了这条法律,因为someObject 知道bla2 有一个performBlah 方法。如果确实需要这种方法,他们将其移至someObject 并隐藏bla1bla2 对外界。

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

【讨论】:

  • thnx +1 以获得一个很好的答案,您能否还包括一个示例代码 sn-p?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-27
      • 2021-06-25
      • 1970-01-01
      • 1970-01-01
      • 2018-11-13
      • 2011-11-15
      • 1970-01-01
      相关资源
      最近更新 更多