SOLID 七大原则
- 单一职责原则
- 开闭原则
- 里氏代换原则
- 迪米特法则
- 接口隔离原则
- 合成复用原则
开闭原则是总纲,他告诉我们要对扩展开放,对修改关闭;
单一职责原则告诉我们实现类要职责单一;
里氏替换原则告诉我们不要破坏继承体系;
依赖倒置原则告诉我们要面向接口编程;
接口隔离原则告诉我们在设计接口的时候要精简单一;
迪米特法则告诉我们要降低耦合;
合成复用原则告诉我们少继承,多复用
单一职责原则 Single Responsibility Principle, SRP
定义
一个类只负责一项职责。不要存在多于一个导致类变更的原因。
目的
- 降低变更引起的风险
类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。遵循单一职责原则。分别建立两个类T1、T2,使T1完成职责P1功能,T2完成职责P2功能。这样,当修改类T1时,不会使职责P2发生故障风险;同理,当修改T2时,也不会使职责P1发生故障风险。 - 降低类的复杂度
- 提高类的可读性,提高系统的可维护性
开闭原则 Open-Closed Principle, OCP
定义
一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。软件实体应尽量在不修改原有代码的情况下进行扩展。
为了满足开闭原则,需要对系统进行抽象化设计,抽象化是开闭原则的关键。
目的
提高系统适应性和稳定性。方便地对系统进行扩展,而且在扩展时无须修改现有代码,降低变更引起的风险。
里氏代换原则 Liskov Substitution Principle, LSP
定义
所有引用基类的地方必须能透明地使用其子类的对象。
具体做法
子类可以扩展父类的功能,但不能改变父类原有的功能。
当使用继承时,遵循里氏替换原则。类B继承类A时,除添加新的方法完成新增功能P2外,尽量不要重写父类A的方法,也尽量不要重载父类A的方法。
目的
里氏代换原则是实现开闭原则的重要方式之一。
依赖倒转原则 Dependency Inversion Principle, DIP
定义
高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
做法
面向接口编程
目的
降低类之间的耦合性,提高系统的稳定性,降低修改程序造成的风险。
接口隔离原则 Interface Segregation Principle, ISP
定义
客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
做法
建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。不要试图去建立一个很庞大的接口供所有依赖它的类去调用。
目的
依赖几个专用的接口要比依赖一个综合的接口更灵活。
接口是设计时对外部设定的“契约”,通过分散定义多个接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。
迪米特法则 Law of Demeter, LoD (最少知识原则 LeastKnowledge Principle, LKP))
定义
一个对象应该对其他对象保持最少的了解。
做法
只与直接的朋友通信。出现成员变量、方法参数、方法返回值中的类为直接的朋友,而出现在局部变量中的类则不是直接的朋友。
目的
可降低系统的耦合度,使类与类之间保持松散的耦合关系
合成复用原则 Composite Reuse Principle, CRP(组合/聚合复用原则 Composition/Aggregate Reuse Principle, CARP)
定义
尽量使用对象组合,而不是继承来达到复用的目的。
做法
复用时要尽量使用组合/聚合关系(关联关系),少用继承。
目的
继承复用会破坏系统的封装性,如果基类发生改变,那么子类的实现也不得不发生改变
网友评论