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

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

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

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

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

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

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

  • 圈复杂度

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

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

  1. 从函数第一行一致往下通过程序
  2. 一旦遇到以下关键字或者同类的词就加1:if,while,repeat,for,and,or
  3. 给case语句中的每一种情况加1                           --Steve McConell 《代码大全》

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

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

  • 响应集

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

class Demeter{private:A* a;int func();public://... void example(B& b);void Demeter::example(B& b){C c;int f = func(); //<---- 类自己的方法b.invert(); //<----传入参数的方法,当然参数本身也可能是函数a = new A();a->setActive();// <---创建的对象所拥有的方法c.print(); // <---创建的,并归自己所有的对象的方法}};



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

  • 关系内聚性(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)上都有好的表现,复杂度有没有提高?如果说复杂度因此而提高了,那么这种额外支出的复杂度值不值得?

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

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

--------------------------------------------------------------

理想流 + 软件 = 《完美软件开发:方法与逻辑》
理想流 + 人生 = ??
理想流 + 管理 = ??
理想流 = 以概念和逻辑推演本质,追求真理。

转载于:https://www.cnblogs.com/daoshi/archive/2012/01/15/2323190.html

如何评价软件写的好还是坏?相关推荐

  1. iphone如何信任软件_你还在用大众点评吗?评价软件失去信任还如何活下去

    合并五年之后,大众点评终于在公司名称中消失了.9月11日,美团点评在港交所发布公告称,公司名称拟简化为美团,美团点评也最终成为了历史.有知情人士表示,今年7月美团总部前台大厅的公司名称中就已经没有了点 ...

  2. 聊天软件,谁好谁坏?

    花样繁多的聊天软件,谁好谁坏? 本文主要从易用性.安全性.兼容性.创新性入手分析聊天工具. 什么是聊天工具? 聊天工具又称IM软件或者IM工具,主要提供基于互联网络的客户端进行实时语音.文字传输.从技 ...

  3. 指纹图谱相似度评价软件_远志与炆远志指纹图谱比较

    文献亮点: 1.采用HPLC法建立远志生品及炆制品HPLC指纹图谱,并对色谱峰进行归属. 2.结合主成分分析等方法研究远志炆制前后化学成分变化情况. 文献内容: 目的:建立远志与炆远志的HPLC指纹图 ...

  4. opengl用什么软件写_汇才论文工具分享:写科研论文的都在用这些截图软件

    截图是一种学问,经常混迹论坛的相信都知道,"饶老师教你截图"的梗.由于经常有网友不使用系统自带的截图功能非要发手机屏拍的图,导致像素过低看不清,于是渐渐就行成了一种吐槽的梗,常见于 ...

  5. 指纹图谱相似度评价软件_基于指纹图谱和网络药理学对当归四逆汤中桂枝的Qmarker预测分析...

    摘  要:目的  基于指纹图谱和网络药理学分析预测当归四逆汤(DSD)中桂枝的质量标志物(Q-marker).方法 建立桂枝水煎液和DSD的指纹图谱,利用中药色谱指纹图谱相似度评价系统软件(2012年 ...

  6. 指纹图谱相似度评价软件_不同产地佛手指纹图谱及模式识别研究

    不同产地佛手指纹图谱及模式识别研究 吴春蓉1,2,3,黎珊珊1,2,3,肖雪1,2**,朴胜华1,2**,郭姣1,2 摘 要:目的:建立不同产地佛手指纹图谱,利用模式识别方法比较不同产地佛手的差异.方 ...

  7. The Joel Test:Joel 用来评价软件开发团队成熟度的12个问题

    转自:http://www.cnblogs.com/supercpp/archive/2011/11/10/2245087.html 如果你与软件行业有若干联系,但是还不知道Joel这个人以及他的博客 ...

  8. 32g的u盘速度测试软件,写入超100MB/s?32G神速U盘PK固态硬盘

    1U盘也有这么神?极速U盘介绍 [PConline 评测]SSD速度快大家都知道,但是由于价格比较高,现在大家买SSD基本都是用来装系统.升级笔记本,很少有人拿来当移动硬盘.好消息是,近期笔者发现了一 ...

  9. 什么软件质量/如何评价软件的质量

      1.       软件质量: 软件质量是软件的生命,它直接影响着软件的使用和维护.通常软件的质量有下面几个方面来评价质量的优劣: (1)   软件需求是衡量软件质量的基础,不符合需求的软件就不具备 ...

最新文章

  1. GPU模拟猴子大脑,普通台式机变超算,英国大学研究登上Nature子刊
  2. 【Android必备】与其他碎片进行通信(10)
  3. CXF框架实现webservice实例
  4. 自定义RadioGrop,支持添加包裹着的RadioButton
  5. 使用vl_sift提取图像特征
  6. linux系统刷分辨率,Linux下设置其分辨率及刷新率
  7. 【chorme插件开发】第四节:html+js实现的功能插件开发实例
  8. 深入学习MongoDB
  9. 0405_hxtx_主题游常用联系人功能代码实现
  10. Delegate示例
  11. python怎么批量下载图片_批量下载网页图片(python)
  12. fastjson List 转Json , Json 转List
  13. Python包和模块的区别
  14. 服务器系统2003出入站,独立服务器win2003系统站点常见问题解答
  15. 微信网页调试8.0.19换掉X5内核,改用xweb,所以x5调试方式已经不能用了,现在有了解决方案
  16. 华为工业云平台:制造业企业数据平台建设最佳实践分享
  17. MT6755 datasheet资料,MT6755芯片处理器参数
  18. php图片上传存储源码,可实现预览
  19. JMeter之察看结果树
  20. call()、apply()、bind()的区别

热门文章

  1. 【论文阅读和实现】On Spectral Clustering: Analysis and an algorithm【Python实现】
  2. OpenVINO 2020版没有cpu_extension.dll问题解决
  3. php v9 分页静态,PHPCMS V9自定义栏目伪静态实现方法(列表页/分页/内容页)
  4. 【学习笔记】斜率优化
  5. VUE iscroll(银联二维码,浩哥页面用过)
  6. 解决远程连接mysql错误1130
  7. BZOJ 3668: [Noi2014]起床困难综合症( 贪心 )
  8. Python: 元组的基本用法
  9. 17.C#类型判断和重载决策(九章9.4)
  10. Python 类的定义、继承及使用对象