我们如何评价软件写得好还是坏?

开发 项目管理
今天我们将谈谈如何评价软件写得好还是坏?软件自身是一种固化的思维,因此从本质上来看,软件是不可度量的。

  软件自身是一种固化的思维,因此从本质上来看,软件是不可度量的。

  但这并不意味着软件不需要度量,而只是说软件中的度量大多都有一定限度。

  应用各种度量数据的时候一旦跨过这种限度,结果就会适得其反。

  在这篇文章里,我们将考查一下现有的,对软件进行度量的方法(注意:这篇里主要考察别人的方法,不是我自己的)。

  可能不全面,不足的地方欢迎大家进行补充。

  对软件“直观可见的质量属性”的度量比较简单,比如:Bug率,性能等,这里就不提了。

  这里主要关注的是软件的内在的,不直观可见的质量属性。

  圈复杂度

  圈复杂度主要用于度量函数或方法,从《代码大全》中可以找到圈复杂度的描述。

  关于圈复杂度:Tom McCabe曾经建议使用下面的方法来度量复杂度。在这一方法中为了计算复杂度首先要计算子程序中的决策点(decision points),规则如下:

  从函数***行一致往下通过程序

  一旦遇到以下关键字或者同类的词就加1:if,while,repeat,for,and,or

  给case语句中的每一种情况加1 --Steve McConell 《代码大全》

  很多静态分析工具都直接提供对圈复杂度的度量,而圈复杂度本身歧义性很小,是非常难得的指标,高于15的代码基本很难看懂。

  但圈复杂度更适合用于度量编码的结果,对高层设计则不太适用。

  响应集

  响应集是指类的各个方法直接调用的函数数目。响应集无疑的应该尽可能的小,根据得墨忒耳法则:某个对象的任何方法都应该只调用属于以下情形的方法。

 

  1.   classDemeter  
  2.   {  
  3.   private:  
  4.   A* a;  
  5.  intfunc();  
  6.  public:  
  7.   //...  
  8.   voidexample(B& b);  
  9.   voidDemeter::example(B& b)  
  10.   {  
  11.   C c;  
  12.   intf = func(); //<---- 类自己的方法  
  13.   b.invert(); //<----传入参数的方法,当然参数本身也可能是函数  
  14.   a = newA();  
  15.   a->setActive();//<---创建的对象所拥有的方法  
  16.   c.print(); //<---创建的,并归自己所有的对象的方法  
  17.   }  
  18.   }; 

 

  ---摘自《程序员修炼之道》

  关系内聚性(H)

  在度量包时可以用包内部类的数目除以包内类的总数,其比值用来表示包得内聚性。如果用R表示包内部得类关系数目,用N表示包内类总数。那么:

  H = (R+1)/N

  不稳定性(I)

  不稳定性由输入耦合度(Ca)与输出耦合度(Ce)计算而来。

  包得输入耦合度是指处于包外部,但依赖于包内类的数目。

  包得输出耦合度是指包内部的依赖于包外部类的类数目。

  这样I = Ce / (Ca+ Ce)

  抽象性(A)

  包的抽象性用抽象类的数目和包中所有类的数目进行计算。

  假如说包中类的总数是Nc, 抽象类的数目是Na ,那么抽象度A = Na/Nc

  关系内聚性(H),不稳定性(H),抽象性(H)的进一步说明,请参见《敏捷软件开发:原则,模式与实践》一书。

  这些度量指标无疑是有意义的,都可以用来评价软件写的好还是坏,但却不解决这样一个问题:

  如果一个方案在关系内聚性(H),不稳定性(H),抽象性(H)上都有好的表现,复杂度有没有提高?如果说复杂度因此而提高了,那么这种额外支出的复杂度值不值得?

  如果我们认为复杂度是软件的根本问题,那么在满足需求的前提下,使软件简单化就是最关键的使命(比灵活性等重要)。既如此,究竟应该如何度量软件的复杂度呢?

  这是一个需要进一步展开的话题,我完善后会进一步和大家分享。

原文链接:http://www.cnblogs.com/daoshi/archive/2012/01/15/2323190.html

【编辑推荐】

  1. 代码分享:实现系统托盘效果
  2. 代码分享:模拟售票学习多线程
  3. 代码分享:心算24小游戏
  4. 代码分享:Swing外观抗锯齿字体设置
责任编辑:彭凡 来源: 博客园
相关推荐

2022-02-28 08:07:17

Java开发

2021-11-18 07:55:03

Reduce验证数组

2017-12-21 10:57:09

云服务云计算碎片化

2022-04-02 11:17:43

勒索软件网络安全网络攻击

2024-07-18 08:08:06

2009-03-17 09:03:28

奖金软件开发动漫

2012-11-28 10:11:07

软件更新IT管理固件更新

2022-01-10 08:41:35

Windows 11Windows微软

2023-04-03 00:09:13

2018-05-30 15:29:56

2019-11-23 23:25:07

算法好坏数据

2019-09-17 14:31:52

JSJavaScript前端

2018-08-24 21:25:02

编程语言代码重构GitHub

2009-11-09 10:39:35

2015-03-13 11:20:12

QQ浏览器朋友圈Apple Watch

2011-05-04 09:23:26

2011-05-04 10:24:58

2018-06-15 22:41:06

开源软件React软件开发

2020-04-02 16:12:56

推荐系统CTR分流

2017-02-27 18:04:22

容器软件交付
点赞
收藏

51CTO技术栈公众号