首页 > 解决方案 > 代码风格:在 switch/if 语句的分支中重用控制表达式或控制变量

问题描述

最近,我发现了一段看起来像这样的代码。

switch(type)
{
    case TYPE1:
        doSomething1(type, arg1);
        break;
    case TYPE2:
        doSomething2(type, arg1, arg2);
        break;
}

为什么不直接传递那些枚举(TYPE1,TYPE2)而不是传递类型变量?就像下面的例子一样。

switch(type)
{
    case TYPE1:
        doSomething1(TYPE1, arg1);
        break;
    case TYPE2:
        doSomething2(TYPE2, arg1, arg2);
        break;
}

我知道当变量被重用时,这样的重复是可以的:

    开关(类型)
    {
        案例类型1:
        案例类型2:
        案例类型3:
            一些函数(类型,arg1,arg2);
            休息;
    }

但在第一个例子中,它似乎没用。

你怎么看?这种约定有什么好处吗?

标签: c++cif-statementswitch-statementcoding-style

解决方案


在可维护性方面,第一个片段优于第二个片段。想象一下,您想要更改分支条件,例如 invertTYPE1TYPE2: 对于第一个片段,您有两个编辑,而第二个片段有四个。

关于您对传递标志可能“无用”的解释:从您展示的示例中无法判断从不同分支调用的函数是否确实需要枚举标志。如果他们不这样做,从函数签名中删除枚举是安全的。但是有这样的失败

switch (type) {
    case TYPE1:
    case TYPE2:
    doSomething(type /*, ... */);
}

表明将有另一个分支doSomething取决于type,这可能是不必要的代码重复和/或违反关注点分离。


推荐阅读