面向对象编程(OOP)的五个基本原则,利于程序更低耦合,更易维护
- 单一职责SRP (Single Responsibility Principle)
- 开闭原则OCP (Open-Closed Principle)
- 里氏替换LSP (Liskov Substitution Principle)
- 接口隔离ISP (Interface Segregation Principle)
- 依赖倒置DIP (Dependence Inversion Principle)
单一职责SRP
就一个类而言,应该仅有一个引起它变化的原因。
如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。
软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离。如果你能够想到多于一个动机去改变一个类,那么这个类就具有多于一个的职责,就需要考虑类的职责分离。
SRP一个明显的好处就是代码的粒度降低,职责分明,更易定位及维护。
开闭原则OCP
开闭原则的两个特征:
- 对拓展开放 (open for extension)
- 对修改关闭 (closed for modification)
当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现。
开闭原则是面向对象设计的核心。遵循这个原则,可以使面向对象编程真正的变成可维护、可拓展、可复用、灵活性好的编程思想。开发人员应该仅对程序中呈现出频繁变化的哪些部分做出抽象。抽象实现架构,实现扩展细节。要求抽象对需求有前瞻性和预见性
里氏替换LSP
一个对象在其出现的任何地方,都可以用其子类实例做替换,并且不会导致程序的错误。
这个特性与对象的继承密切相关。
继承的优点:
- 子类拥有父类所有的方法和属性,从而可以减少创建类的工作量
- 提供代码重用性
- 提供代码拓展型,子类不仅有父类的方法,还能添加自己的功能
继承的缺点: - 继承是有侵入性的。子类不得不拥有父类所有的属性和方法
- 降低了代码的灵活性,父类对子类造成约束
- 增强了耦合,父类代码修改时,必须考虑对子类产生的影响
里氏替换原则对继承进行了规则约束:
- 子类必须实现父类的抽象方法,但不得重写(覆盖)父类的非抽象(已实现)方法
- 子类中可以增加自己特有的方法
- 当子类覆盖或实现父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松
- 当子类的方法实现父类的(抽象)方法时,方法的后置条件(即方法的返回值)要比父类更严格
接口隔离ISP
接口隔离的两个特征:
- 客户端不应该依赖他不需要的接口
- 类之间的依赖关系应该建立在最小的接口上
接口隔离与单一职责是息息相关的:
接口隔离解决的问题面向接口、抽象、程序整体,而单一职责重视的是对类的约束,针对功能实现。
实现接口隔离,接口粒度要降低,首先要满足接口的单一职责原则。
依赖倒置DIP
依赖倒置的两个特征:
- 上层模块不依赖底层模块,都依赖抽象
- 抽象不依赖细节,细节依赖抽象