关于算法:在伪c代码片段下面应该避免重复代码的方法是什么?

What should be the approach to avoid duplicate code in below pseudo c code snippet?

1
2
3
4
5
6
7
8
9
10
if(var == something) {
    A();
    B();
} else if(var == something_else) {
    A();
    B();
    C();
} else {
    assert(false);
}

在两个if情况下,如何避免调用a()和b()的重复代码。我应该像这样使用开关盒吗?

1
2
3
4
5
6
7
8
9
switch(var) {
case something:
case something_else:
    A();
    B();
    break;
}
if (var == something_else)
   C():

更好的解决方案是什么?在switchif else中是否有任何性能惩罚?


1
2
3
4
5
6
7
8
if (var == something || var == something_else) {
    A();
    B();
}

if (var == something_else) {
    C();
}

如果您还需要else,您可以这样做:

1
2
3
4
5
6
7
8
9
10
if (var == something || var == something_else) {
    A();
    B();

    if (var == something_else) {
        C();
    }
} else {
    assert(false);
}

关于你的问题,

Is there any performance penalty in switch vs if else?

请阅读此问题的答案:

"switch"是否比"if"快?

简而言之,通常不会有任何明显的差异。因此,您应该在编写代码时考虑到可读性。在if/elseswitch之间,选择更自然的。


您可以为此使用嵌套的if语句,如下所示:

1
2
3
4
5
6
7
8
9
If (var == something || var == something_ese) {
    A();
    B();
    If (var == something_else) { C(); }
}
Else
{
    Assert(false);
}


由于主叫顺序无关紧要,请尝试以下操作:

1
2
3
4
5
6
7
8
9
10
11
switch(var) {    
    case something_else:
        C();
    case something:
        A();
        B();
    break;
    default:
        assert(false);
    break;
}

我建议将assert和工程分开:

1
2
3
4
5
6
7
assert(var == something || var == something_else);

A();
B();
if(var == something_else) {
    C();
}

这不仅避免了AB调用的重复,而且还使其更易于阅读,因为您在开始时就指定了先决条件。