功能设计决策

Function design decisions

本文关键字:决策 功能设计      更新时间:2023-10-16

我正在用c++开发一些实用函数的库。我对该库中的函数签名有疑问。如果一个函数接受一些参数并返回一个值,那么存储该函数结果的变量是否也应该作为参数传递给该函数?我应该如何处理错误条件和错误返回值?

对于c++,你应该返回结果并处理带有异常的错误。

int calc_with_error() {
    throw yourExceptionClass("Message");
}
int calc() {
    return 5;
}
int main() {
    int tmp=calc();
    cout << calc;
}

但是结果随后被从函数复制到调用上下文。对于原始数据类型,这是最快的方法。但是,当您有复杂的数据结构时,传递对结果参数的引用可能更快——尽管它不像上面的解决方案那样干净,一个例子是:

void calc(vector<int> &result) {
    result.clean();
    result.add(5);
}
int main() {
    vector<int> tmp;
    calc(tmp);
    //Do something with the vector
}

有几个选项,这在很大程度上是一个偏好问题。
在大多数情况下,您应该做的一件事是,将输出和错误分开。
通常最好返回成功/错误作为返回值,并以输出参数的形式返回数据,通过引用传递。

不要这样做:
1. 使用"magic values"作为错误指示。
2. 使用全局变量返回数据

人们经常告诉我不要返回错误值,因为这不是最佳实践。最好是给你抛出异常,这比错误码处理得好。另外,输出参数也很好,我用它们最多的是大数据,对于简单的返回,返回值应该很有用。

给你看,这当然不是很好的设计:

void checkSomething(bool& output)
{
    output = doCheckages();
}

那好多了

bool checkSomething()
{
    return doCheckages();
}

但是如果你处理一个大的类/结构,并且你知道你不想有很多它的实例,可能最好把它作为输出参数传递。