对于具有大量决策语句(包括if / while / for语句)的方法,Cyclomatic Complexity将很高.那么我们如何改进呢?
Cos我正在处理一个大项目,我应该减少CC的方法有CC>这个问题有许多方法.下面我会列出一些例如代码模式(而不是实际的代码)与我遇到的问题.是否可以简化它们?
导致许多决策声明的案例示例:
情况1)
if(objectA != null) //objectA is a pass in as a parameter { objectB = doThisMethod(); if(objectB != null) { objectC = doThatMethod(); if(objectC != null) { doXXX(); } else{ doYYY(); } } else { doZZZ(); } }
案例2)
if(a < min) min = a; if(a < max) max = a; if(b > 0) doXXX(); if(c > 0) { doYYY(); } else { doZZZ(); if(c > d) isTrue = false; for(int i=0; i<d; i++) s[i] = i*d; if(isTrue) { if(e > 1) { doALotOfStuff(); } } }
情况3)
//note that these String Constants are used elsewhere as diff combination,//so u can't combine them as one if(e.PropertyName.Equals(StringConstants.AAA) || e.PropertyName.Equals(StringConstants.BBB) || e.PropertyName.Equals(StringConstants.CCC) || e.PropertyName.Equals(StringConstants.DDD) || e.PropertyName.Equals(StringConstants.EEE) || e.PropertyName.Equals(StringConstants.FFF) || e.PropertyName.Equals(StringConstants.GGG) || e.PropertyName.Equals(StringConstants.HHH) || e.PropertyName.Equals(StringConstants.III) || e.PropertyName.Equals(StringConstants.JJJ) || e.PropertyName.Equals(StringConstants.KKK)) { doStuff(); }
解决方法
案例1 – 通过重构到较小的功能来处理这一点.例如.以下代码段可能是一个函数:
objectC = doThatMethod(); if(objectC != null) { doXXX(); } else{ doYYY(); }
案例2 – 完全一样的做法.将else子句的内容转换为较小的帮助函数
情况3 – 列出您要检查的字符串,并创建一个小型帮助函数,将字符串与许多选项进行比较(可以使用linq进一步简化)
var stringConstants = new string[] { StringConstants.AAA,StringConstants.BBB etc }; if(stringConstants.Any((s) => e.PropertyName.Equals(s)) { ... }