下面是当前找到的和度量复杂度有关的方法。
(1)圈复杂度
圈复杂度主要用于度量函数或方法,从《代码大全》中可以找到圈复杂度的描述。关于圈复杂度,Tom McCabe曾经建议使用下面的方法来度量复杂度。在这一方法中为了计算复杂度首先要计算子程序中的决策点(Decision Points),规则如下:
◆从函数第一行一直往下通过程序。
◆一旦遇到以下关键字或者同类的词就加1:if,while,repeat,for,and,or。
◆给case语句中的每一种情况加1。
—Steve McConell,《代码大全》
很多静态分析工具都直接提供对圈复杂度的度量,而圈复杂度本身歧义性很小,圈复杂度大于15的函数或方法基本上是有问题的,是非常难得的指标。但圈复杂度更适合用于度量编码的结果,对高层设计则不太适用。
(2)响应集
响应集是指类的各个方法直接调用的函数数目。响应集应该尽可能的小,根据得墨忒耳法则:某个对象的任何方法都应该只调用属于以下情形的方法。
—摘自《程序员修炼之道》
(3)关系内聚性(H)
在度量包时可以用包内部类的数目除以包内类的总数,其比值用来表示包的内聚性。如果用R表示包内部得类关系数目,用N表示包内类总数。那么:(www.xing528.com)
H=(R+1)/N
(4)不稳定性(I)
不稳定性由输入耦合度(Ca)与输出耦合度(Ce)计算而来。
包的输入耦合度是指处于包外部,但依赖于包内类的数目。
包的输出耦合度是指包内部的依赖于包外部类的类数目。
这样I=Ce/(Ca+Ce)
(5)抽象性(A)
包的抽象性用抽象类的数目和包中所有类的数目进行计算。
假如包中类的总数是Nc,抽象类的数目是Na,那么抽象度A=Na/Nc
关系内聚性(H),不稳定性(H),抽象性(H)的进一步说明,请参见《敏捷软件开发:原则,模式与实践》一书。这些度量指标无疑是有意义的,但却不解决这样一个问题:
如果一个方案在关系内聚性(H),不稳定性(H),抽象性(H)上都有好的表现,复杂度有没有提高?如果说复杂度因此而提高了,那么这种额外支出的复杂度值不值得?
如果我们认为复杂度是软件的根本问题,那么在满足需求的前提下,使软件简单化就是最关键的使命(比灵活性等重要)。既如此,为什么不直接度量复杂度呢?
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。