编码依据的准则——七大设计原则(下)

267 阅读3分钟

上篇文章我们讲解了关于「设计方法」的原则,这篇文章谈谈关于「设计目标」的原则:开放-关闭原则 、里氏替换原则、迪米特法则。

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

开闭原则,简单来说就是对扩展开放,对修改关闭。 它正式定义如下:

Software entities like classes,modules and functions should be open for extension but closed for modifications.

一个软件实体如类,模块和函数应该对扩展开放,对修改关闭

按照开闭原则,我们设计的类、模块和函数(方法)可以在不修改原来的代码情况下,扩展新的功能。

遵循开闭原则的好处:
  • 提高系统稳定性,扩展新功能时,不修改原来的代码,就不会影响系统已有的功能。
  • 提高系统扩展性,因为开闭原则的目的就是对扩展开发
如何实现开闭原则
  1. 面向抽象(接口)编程,即使功能发生变化,也可以通过实现新的接口完成。这样既不需要修改代码,也可以扩展新功能。

  2. 将相同的变化封装到一个接口或抽象类中,将不同的变化封装到不同的接口或抽象类中,不应该有两个不同变化出现在同一个接口或抽象类中。

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

里氏替换原则:如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1代换o2时,程序P的行为没有变化,那么类型S是类型T的子类型

换一种说法就是: 所有引用基类(父类)的地方必须能透明地使用其子类的对象。更直接的说法,子类不能覆盖父类非抽象方法。(如果子类覆盖了父类方法,原来使用父类方法的地方替换成子类,程序的行为肯定会发生变化)

遵循里氏替换原则的意义

前面我们重复提到了面向抽象编程,为了满足开闭原则,在编码时候,尽量使用父(基)类。当行为发生改变时,只需要实现不同的子类,在运行时再确定具体的子类。如果父类覆盖了子类的方法,那调用基类方法时,就会产生错误的结果。所以,里氏代换原则是实现开闭原则的重要方式之一

迪米特原则(Law Of Demeter, LoD)

迪米特法则又叫作最少知识原则(Least Knowledge Principle,LKP) 。

只与你的直接朋友交谈,不跟“陌生人”说话(Talk only to your immediate friends and not to strangers)

迪米特原则的目的就是降低类之间的耦合,减少类之间的依赖,提供模块独立性(高聚合,低耦合)

迪米特法则要求与直接朋友交互,而直接朋友的条件是:

  1. 当前对象本身(this)
  2. 以参量形式传入到当前对象方法中的对象
  3. 当前对象的实例变量直接引用的对象
  4. 当前对象的实例变量如果是一个聚集,那么聚集中的元素也都是朋友
  5. 当前对象所创建的对象

小结

本篇文章主要介绍了设计目标相关的原则:开闭原则、里氏替换原则、迪米特原则。文中讲的更多的是概念。之后学习的设计模式,可以充分体现这些原则。