软件工程或者项目管理中,复杂度是一个绕不开的问题,对软件的质量和开发维护有直接的比较大的影响。所以,人们发明了不少方法对复杂度进行衡量,比如,代码行数、扇入与扇出度,还有圈复杂度(Cyclomatic Complexity Number)等,各个指标各有千秋。这个圈复杂度是比较有意义的一个指标,虽然和实际上的复杂程度不一定有必然的因果关系,但不失为一个很好的参考指标,而且它是一个数值,在做代码评审的时候比较方便,源代码checkin的时候,在版本服务器挂个钩子调用相关功能检查圈复杂度值,可以很方便就筛选出一些重点关注对象,比如,业界一般认为这个值大于10的话就需要留意了,很有可能内部逻辑已经比较复杂了。
计算圈复杂度时还有一个额外的好处就是可以同时得到函数/方法的逻辑结构图,这个图也有用:
- 可以作为整个函数/方法的鸟瞰图,利于快速了解其逻辑结构。
- 另一方面对于测试用例的路径覆盖设计也是非常重要的参考。
- 能够检测出一些不合适的代码,比如废代码。
举个栗子,下面这段有点龌蹉的代码:
int foo_goto_if(int a){ goto L0; L1: a++; if (a < 10) goto L0; a++; L0: if (a > 20) return 1; else goto L1; return 2; }
代码行数不多吧,有点被这些goto搞晕了吧,如果在工作中碰到类似代码有点想奔溃的冲动,万恶的goto语句。。。
但是提取出其逻辑结构之后,就直观多了,同时也发现了其中一段废代码,就是L0标签后面第34行的return语句是废代码,因为一个标签不可能有两个逻辑分支出去的。
这看上去貌似是一个不错的idea,但是当我想找一下C++的相关工具时,非常遗憾没有找到合适的,于是就拿小刀在业余时间自己造了一个,暂命名为cpp-review,上面这个图就是这个工具所产生的逻辑结构图。
Comments are closed, but trackbacks and pingbacks are open.