如果某个函数的行为取决于一系列条件,则可以使用不同的if-return块或一系列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
}
}
我会说第一个总是更具可读性,但我不知道第二个是否最好来自设计(易于维护/错误)或性能(分支预测/编译器优化)的观点。
这两种方法的优点和缺点是什么?我没有考虑过其他什么事情?
答案 0 :(得分:6)
如果"计算步骤"适当长(有时这根本不需要很长),然后很难在视觉上确定有三个独立的块,每个块都有一个早期的返回。有人可能错误地推断所有三个块都可以在同一个函数调用中运行。
第二版明确表示只能执行一条路径,我相信它的阅读和维护更清晰。
答案 1 :(得分:1)
已经观察到,当使用if-then-else时,复杂的逻辑可以被绊倒,而使用许多if-then直接使用。但是之前的帖子是正确的,这应该没关系,只要所有标准对于每个elseif或else语句都是唯一的。
然而,在一个语句(AndAlso,OrElse,括号等)中混合了大量参数和众多逻辑时,可能会出现特殊情况,并且您无法使用elseif枚举所有这些参数,否则 - 和 - 你可以,例如只想使用20种可能的参数组合中的2种情况。在这里,您肯定只需要使用2个if-then语句。
答案 2 :(得分:0)
如果您将计算步骤放在他们自己的函数中,您的函数将如下所示:
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();
}
}
当你这样做时,两种风格之间的差异并没有太大的区别。这两种方法都很容易理解。
就个人而言,我更喜欢第一种风格,因为它可以清楚地分开三个街区/条件,但我发现第二种方法根本没有。