我的新浪微博:http://weibo.com/u/1602714773 CSDN博客:http://blog.csdn.net/hunterno4

SonarQube中监测循环、包耦合度情况

上一篇 / 下一篇  2013-10-20 15:32:41 / 个人分类:代码质量

一、为什么要监测循环包耦合度情况?

        耦合度就是某模块(类)与其它模块(类)之间的关联、感知和依赖的程度,是衡量代码独立性的一个指标,也是软件工程设计及编码质量评价的一个标准。

        耦合度很高的情况下,维护代码时修改一个地方会牵连到很多地方,如果修改时没有理清这些耦合关系,那么带来的后果可能会是灾难性的,特别是对于需求变化较多以及多人协作开发维护的项目,修改一个地方会引起本来已经运行稳定的模块错误,严重时会导致恶性循环,问题永远改不完,开发和测试都在各种问题之间奔波劳累,最后导致项目延期,用户满意度降低,成本增加

        有两个测试指标有助于确定过度耦合的情况,即“传入耦合”(这个对象对其他对象负有责任)与“传出耦合”(这个对象依赖于其他对象);

        高度依赖于其他对象的对象在面对变化时显得很脆弱,传入耦合与传出耦合共同组成了“不稳定性”值。

                                                               不稳定性 = 传出耦合 / (传出耦合 + 传入耦合)

         另外,了解耦合度情况将可以对可维护性产生较大影响,具有高传入耦合的配件应该有大量的相关测试,因为许多代码依赖于这个配件,因此就更希望保证它是可靠的,可有效用于评估与降低软件风险。

二、如何监测循环、包耦合度情况

How to Hunt for Cycles?

如何寻找循环呢?

在SonarQube中,在面板中增加相应的widget插件即可


Dependency Structure Matrix

依赖结构矩阵,DSM可以用来简洁地展示不同组件之间的依赖关系,根据不同的导航级别,这些组件可以是最基本的类级别、包或文件级别。


Row Selection

点击某行中的组件将选中该行,如图选中了.set包:

1.选中了.set包意味着“bidimap”包有3个文件依赖于“set”包;

2.纵列表示“set”包的传出耦合,即“set”包分别有1、6、3、8个文件依赖于“list”、“collection”、“iterators”、“collections”包;

3.横排表示“set”包的传放耦合,即“bag”、“bidimap”、“splitmap”、“map”包分别有5、3、1、8个文件依赖于“set”包;


Colors Meaning

不同的颜色便于使得矩阵中的依赖关系一目了然


如图:绿色组件依赖于蓝色组件,而同时蓝色组件依赖于橙色组件。


Cell Selection

点击依赖矩阵中的数字可以选中单元格,如图:

1.意味着“buffer”包有4个文件依赖于"collection"包,而同时"collection"包没有文件依赖于“buffer”包;

2.另外也就意味着,矩阵中右上侧的红色数字表示有可疑的依赖,即循环;


DSM Sorting and Cycles

依赖结构矩阵的排序与循环

1.在矩阵中,处于软件结构最顶层的排在最上面,而处于软件结构最底层的组件排在最下面,例如每个组件所依赖的"collection"包自身依赖于更底层的“comparators”包;

2.位于上三角中的红色数字的是需要切断依赖的以便移除循环的地方,当没有循环时,DSM矩阵呈现为下三色形状;


Find Usages for Dependencies

依赖关系的使用

如图:从“buffer”包到“iterators”包有2个传出耦合,此时双击“2”单元格即可看到详细信息。


Zoom into a Component to get Dependencies Between Sub-components

双击组件可以得到子组件的详细依赖关系,可以看到这个包中不同类之间的依赖结构矩阵。



        本小节官方文档链接:http://docs.codehaus.org/display/SONAR/Cycles+-+Dependency+Structure+Matrix

三、降低耦合度的方法 

  1、少使用类的继承,多用接口隐藏实现的细节。 java面向对象编程引入接口除了支持多态外, 隐藏实现细节也是其中一个目的。 

  2、模块的功能化分尽可能的单一,道理也很简单,功能单一的模块供其它模块调用的机会就少。(其实这是高内聚的一种说法,高内
聚低耦合一般同时出现,为了限制篇幅,我们将在以后的版期中讨论)。       
  3、遵循一个定义只在一个地方出现。       
  4、少使用全局变量。       
  5、类属性和方法的声明少用public,多用private关键字,
  6、多用设计模式,比如采用MVC的设计模式就可以降低界面与业务逻辑的耦合度。
  7、尽量不用“硬编码”的方式写程序,同时也尽量避免直接用SQL语句操作数据库
  8、最后当然就是避免直接操作或调用其它模块或类(内容耦合);如果模块间必须存在耦合,原则上尽量使用数据耦合,少用控制耦

合,限制公共耦合的范围,避免使用内容耦合。

        本小节源自:http://hi.baidu.com/roleya/item/5165ed9d65df35dd1f4271ac


TAG: java 循环 sonarqube 代码质量 包耦合度

 

评分:0

我来说两句

Open Toolbar