软件设计的质量在很大程度上受到系统封装关系的影响模块间松耦合而模块内部又保持高度一致性是高质量设计软件的关键之一所以评定软件设计的水平的手段之一就是考察它的模块间的关系对系统的可重用性和可维护性水平的客观评价是一个评价软件结构的重要组成部分我在本文介绍的度量标准可以帮助你客观评定你的软件设计的质量 尽管度量标准可以对我们的软件设计质量起着指导和反馈的作用但是你要牢记我在本文提出的度量标准并不是软件设计的唯一依据设计质量分数的高低未必一定对应于真实软件设计质量的高低但是不太可能出现那种设计水平很高但是在我们这种度量标准下分数却很低的情况我们提出软件设计质量度量标准的目的在于帮助设计者正确评估他们自己的设计更重要的是帮助你检测设计的水平是否达到预期目标 测试稳定性 稳定性指的是修改软件中某个模块而不影响其它模块的困难程度让我们看看模块间的依赖关系是如何影响到稳定性的 一个模块在软件中重用的次数越多那么就越依赖于它模块的输入依赖性越强(较多的其它模块依赖本模块)则它的稳定性得分也就越高(即难以修改)换句话来说其它模块越依赖于本模块那么修改本模块而不影响其它模块也就越困难模块的输入依赖性和输出依赖性是评测模块稳定性和不稳定性的重要方面模块的输出依赖性强输入依赖性弱则稳定性低(即容易修改)这是因为对变化不会扩展到很多其它方面另一方面模块的输入量越多它就越难以修改则越稳定稳定性可以通过计算输入量和输出量来计算 输入耦合度代表依赖本模块的其它模块数输出耦合度代表本模块所依赖的其它模块数不稳定度可以通过输出耦合度与总的耦合度的比例来得到计算公式如下I = Ce/(Ce + Ca) I 代表该模块的不稳定度 Ca代表该模块的输入耦合度即输入依赖度 Ce代表本模块的输出耦合度即输出依赖度 如果I的值接近于零那么模块的输入依赖性就远远大于输出依赖性模块也就越稳定模块越稳定也就越难以修改因为某个变化会衍生出许多新的变化波及到依赖它的其它模块上了对I值接近于一的模块来说它的输出依赖性远远大于输入依赖性模块很不稳定由于受本模块影响的模块不多所以不稳定的模块容易修改看到这些你也许会感到很困惑到底我应该让模块的稳定性高一些好还是低一些? 由于组成一个软件的一整套模块中有些模块有输入依赖性(被其它模块引用)而有些模块有输出依赖性(引用其它模块)我们在设计模块不应该追求完全的稳定性或者不稳定性而是具体考虑某个模块需要的是稳定性还是不稳定性并尽可能实现输入依赖度比较强的模块必须拥有较高的抗可变性展现较高程度上的稳定性在面向对象的开发方法中抽象性通过分离功能和功能的实现方法来提高稳定性对Java来说抽象类和界面(interface)显然就是抽象性的表现形式因此越需要稳定的模块应该有越高的抽象层次与此对应越不稳定的模块也就越具体 测量抽象性 你可以通过计算模块内抽象类(或者界面)的数目与所有类的数目的比例来测出该模块的抽象程度抽象度可以用下面的公式计算 A=Na/Nc A 代表模块的抽象程度 Na代表模块中抽象类或者界面的数目 Nc代表模块中具体类的数目 抽象度等于零表示该模块是一个完全抽象的模块而抽象度等于一代表它是完全具体的模块 评估度量标准 比较抽象度和稳定度你可以发现一些更有趣的结论完全不稳定的抽象模块也是完全抽象的并且输入依赖度为零相反完全稳定输入依赖度较大的模块意味它有较多的频繁使用的具体类 这是因为抽象性把变换和实现分隔开来变动频繁使用的具体类会衍生出许多新的变化这些变化可能会波及整个软件所以你应该在具体类中尽量降低模块的输入依赖性换句话来说设计模块时要确保抽象性和输入依赖性具体性与输出依赖性成比例 评估设计质量的有效辅助工具 本评估方法可以帮助你提高软件强壮性尽管好的度量方法并不能保证高质量的设计自然就会产生但是它确实可以帮助你加强信心在正确灵活的使用下本方法是评估软件设计质量的宝贵手段 |