7个常用的面向对象的设计原则
单一职责原则、开闭原则、里氏代换原则、依赖倒转原则、接口隔离原则、合成复用原则以及迪米特法则。
单一职责原则
Single Responsibility Principle (SRP),一个对象应该只包含单一的职责,并且该职责被完整的封装在一个类中。
另一种定义:就一个类而言,应该仅有一个引起它变化的原因。
一个类(大到模块,小到方法)承担的职责越多,它的可复用性就越小。一个类承担的职责过多,就相当于将这些职责耦合在一起,当其中某个职责变化时,可能会影响其它职责。
单一职责原则是实现高内聚、低耦合的指导方针,需要设计人员发现类的不同职责并将其分离。
开闭原则
Open-Closed Principle (OCP),软件实体(类)应当对拓展开放,对修改关闭。
尽量在不修改原有代码的基础上进行拓展。
抽象化是开闭原则的关键。
里氏代换原则
Liskov Substitution Principle (LSP),所有引用基类的地方必须能透明的使用其子类的对象。
在软件中,将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立。
里氏代换原则是实现开闭原则的基础。
父类设计成抽象类或者接口,让子类继承。运行时,子类实例替换父类实例。
依赖倒转原则
Dependency Inversion Principle (DIP),高层模块不应该依赖底层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。
要针对接口编程,不要针对实现编程。
传递参数或在关联关系中(类型声明、参数类型声明、方法返回类型声明),尽量引用层次高的抽象层(抽象类。接口)。
尽量使用抽象层进行编程,而将具体类写在配置文件中。
接口隔离原则
Interface Segregation Principle (ISP),客户端不应该依赖那些它不需要的接口。
每一个接口应该承担一种相对独立的角色,当一个接口太大时,需要将它分割成一些细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。
需要注意控制接口的粒度,接口不能太小。否则接口泛滥不利于维护。
合成复用原则
Composite Reuse Principle (CRP),有限使用对象组合,而不是继承来达到复用的目的。
一个新的对象里通过关联关系(组合关系、聚合关系)来使用一些已有的对象,使之成为新对象的一部分,新对象通过委派调用已有对象的方法达到复用功能的目的。
一般而言,如果两个类之间是"Has-A"关系应使用组合或聚合,如果是"Is-A"关系可使用继承。
迪米特法则
Low of Demeter (LoD),每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。
一个软件实体应尽可能少的与其他实体发生交互。
不要和“陌生人”说话、只与你的直接朋友通信。
小结
在软件开发中使用面向对象设计原则可以提高软件的可维护性和可复用性,以便设计出具有良好的可维护性和可复用性的软件系统,实现可维护复用的目标。