方法链的缩进

时间:2011-08-31 10:31:16

标签: c++ indentation method-chaining

假设我有一个很长的链接方法

object.SetA(123).SetB(234).SetC(345) ...

什么是最好的缩进?所有编译器都支持它们吗?

object.
   SetA(123).
   SetB(234).
   SetC(345) ...

object
  .SetA(123)
  .SetB(234)
  .SetC(345) ...

5 个答案:

答案 0 :(得分:9)

IMO,第二更好。通过使用。开始一行,它明确表示它是链式调用的延续。

答案 1 :(得分:3)

是的,所有编译器都会支持它们。您所做的只是添加空格,在词法分析期间由编译器删除。

这是个人偏好的问题,但我同意Mike Kwan的观点。

答案 2 :(得分:2)

如果链条太长,我会写这个,不能单行:

object.SetA(123)
      .SetB(234)
      .SetC(345)
      .SetD(345)
      .SetE(345)
      .SetF(345);

否则我会这样做:

object.SetA(123).SetB(234).SetC(345).SetD(345).SetE(345).SetF(345);

答案 3 :(得分:1)

假设我们在谈论同一个对象上的方法链接(每个函数返回*this),那么:

object.setA().setB().setC();
object.setD().setE().setF();

长线不仅不好,因为您的屏幕不够宽,无法容纳它们。如果这就是它的全部,只需购买更大的显示器或减小字体大小。它们很糟糕,因为人们一次只能读取代码一行,如果你在一行中做得太多,就会打破他们那些微小的碳基脑。

如果所有其他方法都失败了,我个人会这样缩进:

object
    .setA()
    .setB()
    ...
;

但我更喜欢:

object.setA();
object.setB();
...

方法链接是一种将更多信息塞进一条线路的方法,所以如果我们再将线路拆分出去,我就看不到优势了。有时我们被迫,因为object实际上是一个临时的(函数调用的结果而不是命名的变量)或其他什么,我们不能参考它。

你或许可以让线路从右侧运行。不得不向侧面滚动或者换行包装是很烦人的,但是再一次在一个声明中做这件事已经很烦人了,所以显然有一些非常重要的原因。

答案 4 :(得分:0)

C ++不是空格敏感的,所有这些都适用于任何C ++编译器(好吧......假设它们在词法分析器中没有错误)。无论如何,我更喜欢最后一个,终止分号放在它自己的行上(这使得添加更多链更容易,简单的行复制就可以了)。