2

我想知道像这样使用成员运算符是否是一种好习惯.

someVector = (segment.getFirst() - segment.getSecond()).normalize().normalCCW();

只是为了展示我想知道的两个不同的事情,即是否使用(expressions).member/function()foo.getBar().getmoreBar()符合可读性和可维护性的精神。在我学习的所有 c++ 代码和书籍中,我从未见过它以这种方式使用过,但它的使用却非常容易。虽然不想养成任何坏习惯。

可能比这更重要(或更少),我还想知道以这种方式使用它是否会有任何性能收益/损失,或者会在程序中引入错误的不可预见的陷阱。

先感谢您!

4

8 回答 8

4

或不可预见的陷阱,会在程序中引入错误

好吧,可能的陷阱是

  1. 更难调试。您将无法查看每个函数调用的结果,因此如果其中一个返回了意外的内容,您需要将其分成更小的部分以查看发生了什么。此外,链中的任何调用都可能完全失败,因此,您可能不得不再次分解它以找出哪个调用失败。

  2. 更难阅读(有时)。链接函数调用会使代码更难阅读。这取决于情况,这里没有硬性规定。如果表达式甚至有些复杂,它可能会使事情难以理解。阅读您的具体示例我没有任何问题。

这最终归结为个人喜好。我不努力尽可能多地放在一条线上,而且我已经被咬了足够多的时间了,因为我把不应该的地方用链子串起来,我倾向于把事情搞砸。但是,对于不太可能失败的简单表达式,链接是可以的。

于 2011-02-21T19:09:32.173 回答
3

是的,这是完全可以接受的,事实上,如果你不这样做,在很多情况下都是完全不可读的。

它被称为方法链。

由于您没有创建临时变量,因此可能会获得一些性能提升。但无论如何,任何称职的编译器都会对其进行优化。

于 2011-02-21T19:08:39.020 回答
1

it is perfectly valid to use it the way you showed. It is used in the named parameter idiom described in C++ faq lite for example.

One reason it is not always used is when you have to store intermediate result for performance reasons (if normalize is costly and you have to use it more than one time, it is better to store the result in a variable) or readability.

my2c

于 2011-02-21T19:13:09.373 回答
1
someVector = (segment.getFirst() - segment.getSecond()).normalize().normalCCW();

Not an answer to your question, but I should tell you that the behavior of the expression (segment.getFirst() - segment.getSecond()) is not well-defined as per the C++ Standard. The order in which each operand is evaluated is unspecified by the Standard!

Also, see this related topic : Is this code well-defined?

于 2011-02-21T19:14:10.543 回答
1

使用变量来保存中间结果有时可以提高可读性,尤其是在使用好的变量名时。过多的链接会让人很难理解正在发生的事情。您必须根据自己的判断来决定是否值得使用变量来分解链。你上面举的例子对我来说并不过分。如果启用优化,性能应该不会有太大差异。

于 2011-02-21T19:17:18.997 回答
0

我想您所做的可读性较差,但是另一方面,太多的临时变量也可能变得不可读。

就性能而言,我确信在制作临时变量时会有一点开销,但编译器可以优化它。

于 2011-02-21T19:09:45.843 回答
0

以这种方式使用它没有什么大问题——一些 API 从方法链中受益匪浅。另外,创建一个变量然后只使用一次是一种误导。当有人阅读下一行时,他们不必考虑您现在没有保留的所有变量。

于 2011-02-21T19:10:52.633 回答
0

这取决于你在做什么。

为了可读性,您应该尝试使用中间变量。
将计算结果分配给指针,然后使用它们。

于 2011-02-21T19:11:15.077 回答