【问题标题】:Cyclomatic Compleity IF ELSE vs SWITCH CASEIF ELSE 与 SWITCH CASE 的圈复杂度
【发布时间】:2015-10-21 10:40:43
【问题描述】:

许多代码分析工具(如声纳)如果使用多个 is-else 来代替用于圈复杂度的多个 is-else ,则会为 switch case 抛出错误。是否有一个数字应该是何时应该使用 if else 以及何时应该使用 switch case 的阈值? 说如果它是一个 50 的案例,为了降低圈复杂度,应该使用 switch 案例吗?如果你能用一个例子来支持你的答案会很好吗?

【问题讨论】:

  • 如果输入有 50 个可能的分支,则代码需要进行一些硬重构。
  • 可以是50个匹配然后设置特定值?
  • 不应该。可能是一些设计决策出错了。但是如果真的有这么多可能的分支,使用确定性自动机,值将用 CC = 1 计算。或者我猜是一些键值值结构,就像任何实现 Map 接口的东西。
  • 这是有道理的,但是否有一个数字告诉我们何时应该使用 switch 以及何时使用?

标签: java if-statement switch-statement sonarqube cyclomatic-complexity


【解决方案1】:

用另一个问题来回答这个问题。

你愿意阅读吗:

if(cond1)..

else if(cond2)...

else if(cond50)...

else ...

value = map.get(key)

如果有这么多可能的情况,那么无论是开关还是看起来都不合适,因此应该用key-value structurestate machine pattern 替换 - 如果分支真的很复杂。

你可以在这里找到一个示例实现:

fsm

至于何时使用 if 或 switch,请记住 switch 不能接​​受以下类型:

long, double, float, boolean 所以当你有这样的输入时,switch 显然不是一个选择。

我不会使用数字作为指标来使用switchif statement。但是有一个例外,如果输入只能有 2 个可能的值,最好使用 if。甚至 Sonar 也应该建议您这样做。

也就是说,switch 通常比一系列 if 语句更具可读性。作为一个重要的决策因素,除了可读性之外,在 switch 语句中可能存在可能需要相同执行路径的值组。它基本上是goto 的更安全版本。与 if 不同,其中每个结果通常都绑定到特定的执行路径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    相关资源
    最近更新 更多