我想知道使用成员运算符.
是否是一个好习惯:
someVector = (segment.getFirst() - segment.getSecond()).normalize().normalCCW();
只是为了展示我想知道的两件事,即使用(expressions).member/function()
和foo.getBar().getmoreBar()
是否符合可读性和可维护性的精神。在我从中学到的所有c ++代码和书籍中,我从未见过以这种方式使用它,但它的使用方式却令人陶醉。不过,不想养成任何坏习惯。
可能比这更重要(或更少)重要,我也想知道是否会以这种方式使用它会有任何性能上的提升/损失,或者会在程序中引入错误的无法预料的陷阱。
提前谢谢!
答案 0 :(得分:4)
或不可预见的陷阱会将错误引入程序
嗯,可能的陷阱是
难以调试。您将无法查看每个函数调用的结果,因此如果其中一个函数返回了意外情况,您将需要将其分解为更小的段以查看正在发生的事情。此外,链中的任何呼叫都可能完全失败,因此您可能需要将其分解以找出哪个呼叫失败。
难以阅读(有时)。链接函数调用可以使代码更难阅读。这取决于具体情况,这里没有硬性规定。如果表达式甚至有些复杂,那么就很难理解。阅读您的具体示例我没有任何问题。
最终归结为个人偏好。我并不努力在一条线上尽可能地适应,而且我已经被咬了很多次,因为我不应该将链接分解。但是,对于不太可能失败的简单表达式,链接很好。
答案 1 :(得分:3)
是的,这是完全可以接受的,如果你不这样做,事实上在很多情况下都是完全不可读的。
这叫做方法链。
可能会有一些性能提升,因为你没有创建临时变量。但无论如何,任何有能力的编译器都会优化它。
答案 2 :(得分:1)
以你展示的方式使用它是完全有效的。例如,它在C ++ faq lite中描述的named parameter idiom中使用。
不总是使用的一个原因是,出于性能原因必须存储中间结果(如果标准化成本高,并且您必须多次使用它,最好将结果存储在变量中)或可读性
MY2C
答案 3 :(得分:1)
someVector = (segment.getFirst() - segment.getSecond()).normalize().normalCCW();
不是你问题的答案,但我应该告诉你
根据C ++标准,表达式(segment.getFirst() - segment.getSecond())
的行为没有很好地定义。标准对未指定的每个操作数的评估顺序
另请参阅此相关主题:Is this code well-defined?
答案 4 :(得分:1)
使用变量来保存中间结果有时可以提高可读性,尤其是在使用好的变量名称时。过度链接会使得很难理解正在发生的事情。您必须使用您的判断来决定是否有必要使用变量来分解链。你上面提到的例子对我来说并不过分。如果启用优化,性能不应该有太大差异。
答案 5 :(得分:0)
我认为你所做的事情的可读性较差,但另一方面,太多的临时变量也会变得不可读。
到目前为止,我确信在制作临时变量时会有一点开销,但编译器可以优化它。
答案 6 :(得分:0)
以这种方式使用它没有什么大问题 - 一些API从方法链中受益匪浅。另外,创建变量会产生误导,然后只使用一次。当有人读下一行时,他们不必考虑你现在没有保留的所有变量。
答案 7 :(得分:0)
这取决于你正在做什么。
为了便于阅读,您应该尝试使用中间变量 将计算结果分配给指针,然后使用它们。