h22*_*h22 6 c++ design-patterns
在某些情况下,我会在不先知道变量值的情况下声明变量,例如:
int a;
if (c1) {
a = 1;
} else if (c2) {
a = 2;
} else if (c3) {
a = -3;
}
do_something_with(a);
Run Code Online (Sandbox Code Playgroud)
无论如何分配一些明显错误的值-1000(使潜在的错误更容易重现)是标准的专业实践吗?还是最好不要添加只要没有错误就没有任何用处的代码?从一方面来看,消除随机性看起来很合理,但从另一方面来看,神奇的甚至“明显错误”的数字在某种程度上看起来并不有吸引力。
在许多情况下,可以在第一次知道值时进行声明,或者使用三元运算符,但在这里我们需要它嵌套,所以也相当笨拙。
在块内声明会过早地将变量移出作用域。
或者这种情况会证明稍后使用std::optional<int> a和 是合理的assert(a),以确保我们具有价值吗?
编辑:如果突然所有 3 个条件都为假,我正在谈论的错误就会发生,而这应该“绝对不会发生”。
据我所知,最流行和最安全的方法是使用内联 lambda 调用。请注意,if应该是详尽的(我添加SOME_DEFAULT_VALUE为占位符)。我想,如果您不知道在最后一个块中放置什么,else您应该考虑以下几个选项:
optional并none放入else,assert这种情况永远不应该发生const int a = [&] {
if (c1) {
return 1;
} else if (c2) {
return 2;
} else if (c3) {
return -3;
} else {
return SOME_DEFAULT_VALUE;
}
}();
do_something_with(a);
Run Code Online (Sandbox Code Playgroud)
在初始化逻辑在某处重复的情况下,您可以简单地将 lambda 提取到命名函数,如其他答案所建议的那样
我会引入一个默认值。我通常为此使用类型的最大值。
最短的是,您可以使用三元运算符来完成此操作,如下所示:
#include <climits>
int a = c1 ? 1 : c2 ? 2 : c3 ? -3 : INT_MAX;
do_something_with(a);
Run Code Online (Sandbox Code Playgroud)