【发布时间】:2014-02-07 14:47:39
【问题描述】:
我的问题是由 C++ 代码引起的,这不是我的,我目前正在努力理解。不过,我认为这个问题通常可以由 OO 开发人员来回答(因为我曾经在 Java 代码中看到过这种情况)。
通读代码,我注意到开发人员总是使用副作用(大多数函数具有“void return type”,除了 getter 和一些极少数情况)而不是直接返回结果。他有时会使用返回值,但仅用于控制流(错误代码...而不是异常)。
以下是他的原型的两个可能示例(以伪代码形式): 对于应该返回矩阵 M 中浮点值的最小值、最大值和平均值的函数:
void computeStatistics(float min, float max, float avg, Matrix M);
或
void computeStatistics(List myStat, Matrix M);
对于应该返回给定列表中的一些对象的函数,该列表验证特定条件和找到的对象数量:
int controlValue findObjects(List result, int nbObjectsFound, Object myCriteria, List givenList)
我不熟悉 C++,正如您可能在我的伪代码中看到的那样......但是使用 Matlab 可以从函数中返回您想要的所有内容,例如并排的 int 和 List (这可能对第二个例子有用)。我知道这在 C++ 中是不可能的,这可以解释第二个原型,但它没有解释第一个示例的选择,他可以这样做:
List myStat computeStat(Matrix M)
最后,这是我的问题: 可能激发这种选择的可能原因是什么?这是一种好的做法、惯例还是只是一种发展选择?一种方式比另一种方式有优势吗(返回值与副作用方式)?
【问题讨论】:
-
一个函数接受一些它不会改变的参数并返回一个新对象,它在语义上比接受许多参数并改变其中一些参数的函数更清晰。但有时您确实需要修改现有对象。所以这一切都取决于你要解决的问题。
-
请注意,在 C++ 中按值返回大对象通常不会受到惩罚,因此干净的解决方案也很有效。