C 优化开关箱代码

C 优化开关箱代码,c,switch-statement,code-duplication,C,Switch Statement,Code Duplication,我的代码中有下面的开关盒 switch(condition) case 'A' : //Code part A break; case 'B' : //Code part A //Code part B break; case 'C' : //Some code break; 代码部分A在“A”和“B”两种情况下都重复。我想避免代码重复

我的代码中有下面的开关盒

   switch(condition)
       case 'A' :   
        //Code part A
        break;
       case 'B' :   
        //Code part A
        //Code part B
        break;
       case 'C' :   //Some code
        break;
代码部分A在“A”和“B”两种情况下都重复。我想避免代码重复


如果我们使用fall-though,那么我们需要为情况B添加If条件。这是避免代码重复的唯一方法吗?

不幸的是,这是唯一的方法,除了为
部分a
定义函数之外

您可以通过从组合的
案例
标签内部退出
开关
来减少嵌套,以使代码看起来更加统一:

switch (someValue) {
    case 'A':
    case 'B':
        // Code part A
        if (someValue == 'A') break;
        // Code part B
        break;
    case 'C':
        break;
}
这使您的A部分和B部分代码具有相同的嵌套级别。

是否可以在“//A部分代码”之前执行“//B部分代码”?如果是这样的话,您可以对它们重新排序,让它在没有If条件的情况下通过


除此之外,我认为没有其他事情可做。创建面向对象语言的原因之一是避免在命令式语言中重复代码。

如果顺序不重要,您可以简单地执行以下操作:

switch (condition)
{
    case 'B':
        // Code part B
        // no break
    case 'A':
        // Code part A
        break;
    ...
}

case'B'
将通过
case'A'
代码继续执行,因为您没有调用
break

操作switch语句以减少代码重复起初可能会起作用,但随后您可能会向交换机添加额外的case,这可能会破坏优化的清洁度。例如:

   switch(condition)

       case 'A' :   
        // Code part A
        break;

       case 'B' :   
        // Code part A
        // Code part B
        break;

       case 'C' :   
        // Code part C
        break;

       case 'D' :
        // Code part A
        // Code part D
        break;
突然间,一个当时看起来不错的优化开始变得难以维护、难以阅读和容易出错


在我看来,已经确定存在公共代码的情况下,最干净的响应是编写函数来执行公共代码和来自每种情况的调用。今后,这将继续保持下去。

如果A部分和B部分的顺序不重要,但可能是最不难看的替代方案,则这一点可以起作用:)