提升代码质量——控制程序复杂度
如何度量复杂度
最著名的是Tom McCabe方法,通过计算程序中“决策点”的数量来衡量复杂度。下表给出了一种用于计算决策点的方法。
计算子程序中决策点数量的技术
1.从1开始,一直往下通过程序 |
2.一旦遇到以下关键籽,或者其同类的词,就加1: if、while、repeat、for、and、or |
3.给case语句中的每一种情况都加1 |
下面举一个例子:
If (((status = Success) and done) or
(not done and (numLines >= maxLines))) then ...
在这段代码中,从1算起,遇到if得2,and得3,or得4,and得5。加起来,这段代码总共包含了5个决策点。
如何处理复杂度的度量结果
0-5 子程序可能还不错 |
6-10 得想办法简化子程序了 |
10+ 把子程序的某一部分拆分成另一个子程序并调用它 |
说明:
1.把子程序的一部分提取成另一个子程序,不会降低整个程序的复杂度,只是把决策点移到其他地方,降低在同一时间必须关注的复杂度水平。所以降低一个给定子程序的复杂度是有价值的。
2.10个决策点的上限并不是绝对的。应该把决策点的数量当作一个警示,该警示说明某个子程序可能需要重新设计了。不要死守这个规则。一条情况很多的case语句可能会包含超过10个的元素。如果硬拆开它可能就是很愚蠢的,这取决于该case语句的用途。
其他类型的复杂度
其他度量方法包括:所用的数据量、控制结构中的嵌套层数、代码行数、对同一变量的先后引用之间的代码行数(跨度)、变量生存的代码行数(生存期),以及输入和输出的量。
总结:
上述总结是将软件程序复杂度进行量化,并提供优化建议,所以将复杂度降低到最低水平的编写高质量的代码的关键。