资讯专栏INFORMATION COLUMN

如何度量程序的复杂度

Kosmos / 776人阅读

摘要:由于重点是要降低你需要在头脑中同时考虑的项目的数量,所以降低一个给定子程序的复杂度是有价值的。应该把决策点的数量当作一个警示,该警示说明你的某个子程序可能需要重新设计了。

在 PHP 程序中,类、方法(子程序)、函数是最常见的形态,在平时的编程里开发者时常会对代码的复杂度做度量,简洁抑或复杂,都是自己凭着主观意识来评判,经验丰富的开发者可能会有自己的评判标准,但一些经验尚浅的开发者写出来的代码可能在 Code Review 阶段就得返修几次,因为他们还没有能对自己的代码进行质量评测的能力,或者说没有可以量化的标准给他们参考,那么量化的参考标准是什么呢?

《代码大全》458页中有提到一个方法可以帮助开发者度量代码的复杂度,此方法最先由 Tom McCabe 提出,通过计算子程序中“决策点”的数量来衡量复杂度,步骤如下:

从 1 开始,一直往下通过程序;

一旦遇到以下关键字,或者其同类的词,就加1;(if、while、for、foreach、and、or、&&、||)

给 case 语句中的每一种情况加 1;

举个例子:

if ((status && done) || (notDone && (numLines >= maxLines))) {
    // code … 
}

在这段代码中,从 1 算起,遇到 if 得 2,&& 得 3,|| 得4,&& 得 5。加起来,这段代码里总共包含了 5 个决策点。

如何处理复杂度的度量结果

计算出决策点的数量以后,你就可以用得到的数值分析你写的子程序的复杂度了:

0-5 子程序还不错;

6-10 得想办法简化子程序了;

10+ 把子程序的某一部分拆分成另一个子程序并调用它;

把子程序的一部分提取成另一个子程序,不会降低整个程序的复杂度,只是把决策点移到其他地方,但是这样做可以降低你在同一时间必须关注的复杂度水平。由于重点是要降低你需要在头脑中同时考虑的项目的数量,所以降低一个给定子程序的复杂度是有价值的。

10 个决策点的上限并不是绝对的。应该把决策点的数量当作一个警示,该警示说明你的某个子程序可能需要重新设计了。

这个方法不是通用的标准,它是可以灵活变通的,上面也提到,决策点的数量不是绝对的,只是一个参考和警示,具体的还得看子程序的逻辑需求,不要死守这个规则。一条情况很多的 case 语句可能会包含超过 10 个的元素。如果硬拆开它可能就是很愚蠢的,这取决于该 case 语句的用途。

还没有总结出测量标准的开发者可以借鉴下McCabe 的测量方法,相信它能很好的帮助你控制好你的代码质量。

扩展

其他的度量方法:

所用的数据量;

控制结构中的嵌套层数;

代码行数;

对同一变量的先后引用之间的代码行数(跨度);

变量生存的代码行数(生存期);

以及输入和输出的量;

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21840.html

相关文章

  • 第6章:可维护性软件构建方法 6.1可维护性度量和构造原则

    摘要:设计方案的容易改变这就是所谓的软件构建的可维护性,可扩展性和灵活性。这也可能表明类型或方法可能难以维护。基于源代码中不同运算符和操作数的数量的合成度量。对修改的封闭这种模块的源代码是不可侵犯的。 大纲 软件维护和演变可维护性度量模块化设计和模块化原则OO设计原则:SOLIDOO设计原则:GRASP总结 软件维护和演变 什么是软件维护? 软件工程中的软件维护是交付后修改软件产品以纠正故障...

    chanjarster 评论0 收藏0
  • 第5章:可复用性软件构建方法 5.1可复用性度量,形态和外部观察

    摘要:大纲什么是软件复用如何衡量可复用性可复用组件的级别和形态源代码级别复用模块级别的复用类抽象类接口库级别的复用包系统级别的复用框架对可复用性的外部观察类型变化例行分组实施变更代表独立分解常见行为总结什么是软件复用软件复用软件复用是使用现有软件 大纲 什么是软件复用?如何衡量可复用性?可复用组件的级别和形态 源代码级别复用 模块级别的复用:类/抽象类/接口 库级别的复用:API /包 系...

    mengera88 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<