这个开关语句中的代码味道?

Ano*_*ous 1 c++ switch-statement

我想知道这种风格的switch语句应该改成if else语句.

switch (foo) // foo is an enumerated type
{
    case barOne:
        if (blahOne)
        {
            DoFunction(//parameters specific to barOne);
            break;
        }
   case barTwo:
        if (blahTwo)
        {
            DoFunction(//parameters specific to barTwo);
            break;
        }
   //etc.
   default:
       // Whatever happens if none of the case's conditionals are met
}
Run Code Online (Sandbox Code Playgroud)

除非其中一个案件满足条件,否则基本上会发生坠落事件.这些情况非常相似,只是需要检查的内容和需要传递的内容不同,这就是我使用switch语句的原因.

使用会更好if else if吗?否则,它是否足够清晰,但不足以保证对该漏洞的评论?多态性也总是一种选择,但对我来说似乎有些过分.

rya*_*n_s 7

在某些情况下,这似乎可能会产生奇怪的事情.如果foo == bar1,而blahOne是假的,但是blahTwo是真的怎么办?然后你会掉进并在foo == bar2情况下调用函数,即使foo不等于bar2.

这在实践中可能是意料之外的,但如果它确实发生过,那么调试可能会很困难.在这种情况下,我会投票给if else,因为流程更简单.

if (foo == barOne && blahOne)
{
    DoFunction(/*parameters specific to barOne*/);
}
else if (foo == barTwo && blahTwo)
{
    DoFunction(/*parameters specific to barTwo*/);
}
else
{
    // Handle the fallthrough case.
}
Run Code Online (Sandbox Code Playgroud)

当然,如果意图是即使foo!= barTwo也可以评估blahTwo,那么切换可能是最好的方法,但在这种情况下我绝对赞成一些解释性注释.