1、软件维护
修复错误、改善性能。
修改后要进行回归测试,确保没有引入新的故障。
2、可维护性的度量
圈/环复杂度:独立路径的数量、代码行数、可维护性指数MI、继承的层次数、类之间的耦合度、单元测试的覆盖度
3、模块化设计
高内聚低耦合、分离关注点、信息隐藏。
五个标准:1、可分解性,将问题分解成小问题;2、可组合性;3、可理解性;4、可持续性,发生变化时产生的影响较小;5、保护性,异常、错误的影响小。
五个方法:1、直接映射;2、尽量少的接口;3、尽量小的接口,两个模块交换较少的信息;4、明显的接口;5、信息隐藏。
高内聚低耦合:模块间接口数量少、模块间接口复杂性低。
4、SOLID
SRP(单一责任原则):一个类,一个责任。违反SRP的例子:
OCP(开放/封闭原则):对扩展性开放,对修改内部代码封闭。一个可行的方法是利用抽象,即客户端依赖接口,若要修改功能,在接口上派生子类。
错误示例:如若增加功能,需要改if-else结构。
修改:
ISP(接口隔离原则):使用较小的接口,不同的接口面向不同的客户端提供服务,不要让很多客户端都依赖于一个接口,这样会有很多客户端不需要的方法。
例子:
DIP(依赖转置原则):高层模块不依赖于低层模块,都依赖于抽象(接口);抽象不依赖于实现细节,而是实现细节依赖于抽象。
例子,下图中,黄线上方的部分,是客户端直接调用底层具体类,黄线下方的部分,客户端依赖于抽象接口,而不直接依赖于具体类:
总结:面向对象的两大武器:抽象(使用接口)和分离(使用小接口)。
5、GRASP
GRASP是关于如何为“类”和“对象”指派“职责”的一系列原则