当一个函数的行为取决于一系列条件时,可以使用不同的if-返回块或一系列if-else块来计算它。示例计算模式:
void f(params) // isolated if-blocks
{
if (cond1) {
// computational steps
return;
}
if (cond2) {
// computational steps
return;
}
// computational steps of last case
}
void f() // unique if-else block
{
if (cond1) {
// computation
} else if (cond2) {
// computation
} else { // last condition
// computation
}
}我会说,第一个总是更易读的,但我不知道从设计(维护/错误倾向)或性能(分支预测/编译器优化)的角度来看,第二个是最好的。
这两种方法的优缺点是什么?还有什么事情我没有考虑过?
发布于 2016-05-27 23:08:06
如果“计算步骤”适当地长(有时这并不需要很长的时间),那么很难从视觉上感觉到有三个独立的块,每个块都有一个早期的返回。有人可能会错误地推断所有三个块都可以在同一个函数调用中运行。
第二版明确表示只能执行一条路径,我认为阅读和维护要清楚得多。
发布于 2016-05-27 23:17:16
已经观察到,复杂的逻辑可能会被绊倒时,如果-然后- using是使用与直接使用许多if-然后。但前面的帖子是正确的,这不重要,只要所有的标准是唯一的,为每个其他人,如果或其他声明。
但是,当有许多参数和众多逻辑集在一个语句(AndAlso、OrElse、括号等)中混合在一起时,可能会出现一些特殊情况,而您不可能使用其他方法来枚举所有这些参数--例如,您可能只想使用20个可能的参数组合中的两个场景。在这里,您只需要使用2个if-然后语句就可以了。
发布于 2016-05-28 00:17:07
如果将计算步骤放入它们自己的函数中,则您的函数如下所示:
void f(params) // isolated if-blocks
{
if (cond1) {
function_cond1();
return;
}
if (cond2) {
function_cond2();
return;
}
// computational steps of last case
function_default();
}void f() // unique if-else block
{
if (cond1) {
function_cond1();
} else if (cond2) {
function_cond2();
} else { // last condition
function_default();
}
}当你这样做的时候,这两种风格的不同并不会造成很大的不同。这两种方法都很容易遵循。
就我个人而言,我更喜欢第一种风格,因为它允许三个块/条件清楚地分开,但我认为第二种方法一点也不坏。
https://stackoverflow.com/questions/37493460
复制相似问题