【SOLID】面向对象设计的五个基本原则

459 阅读4分钟

导语

从业务回归设计,一个好的设计能够让下游的开始实现变得清晰明了,反之,一个差的设计就是灾难的开始,要么后续代码变屎山,举步维艰,要么直接被后来者推到重构了,然后就陷入循环。。本文来介绍下面向对象设计的五个基本原则。

单一职责原则

(SRP) Single ResponsibilityPrinciple

顾名思义,一个类应该只负责一项职责。

如果一个类承担的职责过多,就等于把这些职责耦合在一起了。写的时候很爽,维护起来就g了。一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。

此原则的本质就是解耦合。

单一职责原则不只是面向对象编程才能思想特有的,只要是模块化的程序设计,都适用此原则。

里氏替换原则

(LSP) Liskov Substitution Principle

任何基类可以出现的地方,子类一定可以出现。

只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。这与java的特性继承有些许出入。

说人话就是:子类可以扩展父类的功能,单不能改变父类原有的功能。

  • 子类可以实现父类的抽象放方法,但不能覆盖父类的非抽象方法。
  • 子类中可以增加自己持有的方法。
  • 当子类的方法重载父类方法时,方法的形参要比父类方法的入参更宽松。
  • 当子类的方法实现父类的抽象方法时,方案的返回值要比父类更严格。

LSP强调的是继承和复用的度的问题。

此原则的本质是解耦合和高扩展、可移植。

依赖倒置原则

(DIP) Dependence Inversion Principle

高层模块不应该依赖低层模块,二者都应该依赖其抽象;

抽象不应该依赖细节,细节应该依赖抽象。

相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建起来的架构比以细节为基础搭建起来的架构要稳定的多。在java中,抽象指的是接口或者抽象类,细节就是具体的实现类。使用接口或者抽象类的目的是指定好规范和契约,而不去涉及任何具体的操作,把展现的细节的任务交给他们的实现类去完成。

说白了这就是java中的多态。即面向接口编程。

接口隔离原则

(ISP) Interface Segregation Principle

客户端不应该依赖它不需要的接口,一个类对另一个类的依赖应该建立在最小的接口上。

接口隔离原则的含义是,建议单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。即为各个类建立专用的接口,而不要试图建立一个庞大的接口供所有依赖的类去调用。

说白了就是接口设计的颗粒度尽量细一点(不是越细越好),提高内聚,减少对外交互。

开闭原则

(OCP) Open Closed Principle

对于扩展是开放的,对于更改是封闭的。 我们遵循设计模式的其他原则,以及使用23中设计模式的目的就是遵循开闭原则。也就是说我们对其他原则遵守好了,设计出的软件自然是符合开闭原则的。

  • 开闭原则是编程中最基础、最重要的设计原则
  • 用抽象构建框架,用实现扩展细节
  • 编程中遵循其他原则,以及使用设计模式的目的就是遵循开闭原则

总结

  • 单一职责原则:说类职责要单一;
  • 里氏替换原则:说不要破坏继承体系;
  • 依赖倒置原则:说要面向接口编程;
  • 接口隔离原则:说设计接口时要精细颗粒度;
  • 开闭原则:软件程序设计的基本原则,对扩展开放,对修改关闭。