可维护性的常见度量指标
***圈复杂度:衡量代码的结构复杂性,通过计算程序流程中不同代码路径的数量。具有复杂控制流程的程序将需要更多的测试来实现良好的代码覆盖率,并且将不易维护。
***代码行数:指代码中的行数。非常高的数值可能表明某种类型或方法试图做太多工作,应该将其分解为几个部分分别实现。同时,也表明类型或方法可能难以维护。
***可维护性指数:通过计算,得到一个0~100的索引值,用以表示维护代码的相对容易性,该索引值越大,表明程序越容易维护。该指数基于以下几点进行计算:Halstead卷(HC) + 环复杂性(CC) + 每个模块的平均代码行数(LOC)+ 每个模块注释行的百分比(COM)
计算公式:
***继承的层次数:指扩展到类层次结构根目录的类定义的数量。等级越深,就越难理解待定方法和字段在何处被定义或重新定义
***类之间的耦合度:通过参数、局部变量、返回类型、方法调用、泛型或模板实例化、基类、接口实现,在外部类型上定义的字段以及属性修饰来测量队唯一类的耦合
良好的软件设计应该具有高内聚性和低耦合度
高耦合度表明难以重用和维护(表明其与其他类型指尖存在很多相互依赖关系)
聚合度与耦合度
***耦合度:耦合指对模块之间的依赖关系的度量,如果两个模块之间的变化可能需要另一个模块的变更,则两个模块之间存在依赖关系。其基于以下两个因素:
①模块之间的接口数量(数量)②每个接口的复杂性(质量)
***聚合度:是衡量一个模块的功能或责任的强烈程度的一个指标。若一个模块内的所有元素都朝着相同的目标努力,那么它就具有很强的内聚力。
***最好的软件设计应该是具有高聚合度和低耦合度。
SOLID
*** (SRP) The Single Responsibility Principle 单一责任原则
不应有多于1个的原因使得一个类发生变化;一个类,一个责任
最简单的原则,却是最难做好的原则
*** (OCP) The Open-Closed Principle 开放-封闭原则
对扩展性的开放 + 对修改的封闭
模块的行为应是可扩展的,从而该模块可表现出新的行为以满足需求的变化。
但模块自身的代码是不应被修改的;扩展模块行为的一般途径是修改模块的
内部实现
如果一个模块不能被修改,那么它通常被认为是具有固定的行为
关键的解决方案:抽象技术(inheritance和composition)
*** (LSP) The Liskov Substitution Principle Liskov替换原则
子类型必须能够替换其基类型,派生类必须能够通过其基类的接口使用,客户端无需了解二者之间的差异
*** (DIP) The Dependency Inversion Principle 依赖转置原则
高级模块不应该依赖于低级模块,两者都应该取决于抽象
抽象的模块不应依赖于具体的模块;具体应依赖于抽象
优点:将类合同正式化;根据前后置条件定义例行服务
*** (ISP) The Interface Segregation Principle 接口聚合原则
客户端不应依赖于它们不需要的方法,最主要的是解决“胖”接口,这是由于“胖”接口不够聚合。
方法:“胖”接口可分解为多个小的接口;不同的接口向不同的客户端提供服务;客户端只访问自己所需要的端口