面向对象的设计原则

面向对象的设计原则


在面向对象设计中,可维护性的复用是以设计原则为基础的。每一个原则都蕴含一些面向对象设计的思想,可以从不同的角度提升一个软件结构的设计水平。下面简单阐述下各个设计原则的概念。

单一职责原则(Single Responsibility Principle, SRP)

  • 定义:一个类只负责一个功能领域中的相应职责
  • 理解: 类的设计不能太臃肿,避免造成不可复用、维护不便等问题。比如WEB系统MVC分层设计就包含了单一职责原则思想,DAO层可以被复用,也便于维护。

开闭原则(Open-Closed Principle, OCP)

  • 定义:一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。
  • 理解:抽象化是开闭原则的关键,类的结构设计应具有抽象化的思想,当增加修改时不应大幅度改变原代码结构。java抽象类与接口的概念符合开闭原则,当修改类功能时直接扩展基类就可以。

里氏代换原则(Liskov Substitution Principle, LSP)

  • 定义:所有引用基类(父类)的地方必须能透明地使用其子类的对象。
  • 理解:里氏代换原则是开闭原则的具体实现手段之一。在传递参数、声明类型、定义变量时都可使用里氏代换原则,也就是用基类(抽象类、接口)来定义类型,待到运行时才确定具体子类类型。

依赖倒转原则(Dependency Inversion Principle, DIP)

  • 定义:抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。
  • 理解:实现依赖倒转原则时,针对抽象编程。将具体类的对象通过依赖注入具体注入到其他对象中。(感觉与里氏代换原则很像,分不清…这里理解为里氏代换原则是基础,依赖倒转原则为具体实现)

接口隔离原则(Interface Segregation Principle, ISP)

  • 定义:使用多个专门的接口,而不使用单一的总接口。
  • 理解:接口的粒度必须控制得当,太小会使系统中接口暴增,不利于维护。太大则灵活性较差,且违背单一职责原则。

合成复用原则(Composite Reuse Principle, CRP)

  • 定义:尽量使用对象组合,而不是继承来达到复用的目的。
  • 理解:继承的依赖性相对较强,修改时牵一发而动全身。若两个类之间的关系不是严格的类别关系,而是某个点的职责关系,优先考虑使用合成复用原则。

迪米特法则(Law of Demeter, LoD)

  • 定义: 一个软件实体应当尽可能少地与其他实体发生相互作用。
  • 理解:当前类不要与没有直接关系的类进行消息传递。如必要可以使用中间类(Mediator)来达到松耦合的目的。