为什么方法应该返回一个新实例,而不是修改实例本身?

时间:2016-12-11 15:10:43

标签: c++ oop

假设我有一个Vector3类,其中包含normalize()方法。该方法是否应该返回一个新的Vector3,或者修改它被调用的Vector3实例(因此返回对它自己的引用(Vector3&)?)有哪些情况会优先选择一个在另一个?性能怎么样?

4 个答案:

答案 0 :(得分:5)

答案取决于班级的设计。

对于可变类rotate应该旋转向量本身。这被认为更有效,如果是大型对象,它可以避免在向量中包含许多项目时复制大量数据。

另一方面,不可变类必须只返回新对象,因为它们不能自己变异。这增加了一些开销,但它有很多优点,特别是当必须同时使用对象时。

常见的命名约定是使用动词来改变操作,如

myVector.rotate(angle);
myVector.scale(factor);

而返回新对象的操作应使用past participles命名,如

auto newVector = myVector.rotated(angle).scaled(factor);

答案 1 :(得分:2)

竞争目标:正确与绩效(有时)。

如果使用不可变类型,则可以更轻松地编写正确(并行)程序。如果你使用可变类型,你有时会有一些性能优势,一旦你尝试并行,可能会丢失。然后是80/20规则。 80%的代码无需优化。那么为什么默认使用可变类型呢?

首先是不可变的,然后看看它是否有足够的性能,然后优化,如果没有。

答案 2 :(得分:0)

 Vector3 rotate(const Angle& angle)

可能很好,但很好地取决于Vector3是否正确实施。特别是关于std::move()行为。

答案 3 :(得分:0)

副作用。例如,如果我传递了一个我从地图中检索到的对象,并且你对我传递的对象做了一些事情,那么你已经改变了我的地图内部的东西,下次我要求它时,我得到的东西不是看起来和我上次一样。保持对象不可变可以防止这样的事故发生,特别是当多个开发人员在同一个应用程序上工作时。