【问题标题】:What should be the approach to avoid duplicate code in below pseudo c code snippet?在下面的伪 c 代码片段中避免重复代码的方法应该是什么?
【发布时间】:2016-01-18 22:04:26
【问题描述】:
if(var == something) {
    A();
    B();
} else if(var == something_else) {
    A();
    B();
    C();
} else {
    assert(false);
}

如何避免在if 两种情况下调用 A() 和 B() 的重复代码。我应该使用开关盒吗,

switch(var) {
case something:
case something_else:
    A();
    B();
    break;
}
if (var == something_else)
   C():

什么是更好的解决方案? switch 与 if else 有性能损失吗?

【问题讨论】:

  • 来电顺序重要吗?
  • 您给出的示例非常简单,在这种情况下尝试尽量减少代码重用似乎不值得。它只会让代码更难阅读。
  • @user694733,这只是我在复杂框架中尝试做的示例。

标签: c algorithm


【解决方案1】:
if (var == something || var == something_else) {
    A();
    B();
}

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

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

if (var == something || var == something_else) {
    A();
    B();

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

关于你的问题,

switch 与 if else 有什么性能损失吗?

请阅读这个问题的答案:

Is 'switch' faster than 'if'?

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

【讨论】:

    【解决方案2】:

    调用顺序无关紧要,试试这个:

    switch(var) {    
        case something_else:
            C();
        case something:
            A();
            B();
        break;
        default:
            assert(false);
        break;
    }
    

    【讨论】:

      【解决方案3】:

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

      If (var == something || var == something_ese) {
          A();
          B();
          If (var == something_else) { C(); }
      }
      Else
      {
          Assert(false);
      }
      

      【讨论】:

        【解决方案4】:

        我建议将assert 和工作分开:

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

        这不仅避免了A 和B 调用的重复,而且在您一开始就指定了先决条件时,它也更具可读性。

        【讨论】:

          猜你喜欢
          • 2015-11-09
          • 1970-01-01
          • 1970-01-01
          • 2018-12-01
          • 2021-10-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多