面向对象——六大原则

三味码屋 2022年07月26日 800次浏览

六大原则

一、单一职责原则

  英文名称是Single Responsibility Principle,缩写为SRP。
  指每个类都应该具有鲜明且专一的职责。
  类在最初被定义的时候,一般都是按照某种用途来命名和实现具体代码的,随着功能的不断增加,类里面的代码也会随之增多,如果没把握好单一职责原则,往类里面塞各式各样、不同用途的代码,各种逻辑交织在一起,那么类的职责就会越来越不清晰,后期将变得难以维护,这违背了类的初心。
  因此,在设计代码时,应该牢牢把握单一职责原则,根据作用的不同定义不同的类,每个类都有自己明确的职责,且不和其它类有职责上的冲突,在编码过程中,每个类都只包含与自身职责相关的代码,不夹杂其它不相关的逻辑。这样一来,代码的可阅读性、可维护性就大大增加了。

二、开闭原则

  英文名称是Open Close Principle,缩写为OCP。
  指代码对扩展是开放的,对修改是关闭的。说直白一点,就是软件研发过程中,尽量通过对现有代码进行扩展的方式来编码,而不是直接修改现有代码。
  扩展不会改动现有代码,因此不会影响到代码的稳定性,而修改则是对现有代码进行了改动,代码被修改后,需要对改动部分进行全面的回归测试,不仅带来了更大的工作量,也使得代码变得不稳定,即使进行了大量测试也未必能保证不会有什么问题,因为有一些边界条件很难在研发阶段或是测试阶段被发现。
  因此,面向对象主张扩展,反对修改。

三、里式替换原则

  英文名称是Liskov Substitution Principle,缩写为LSP。
  指通过子类实例化父类对象的方式,实现抽象逻辑的具体替换。换句话说,就是让抽象的逻辑能够灵活地、优雅地被替换为各种不同的具体实现。
  里式替换原则基于面向对象继承和多态的特性,通过继承,让父类拥有多个子类,并且子类可以重写父类中的抽象方法,进而实现多态。这样,对于父类的某个抽象行为,不同子类就能表现出不同的具体行为,当在代码中使用不同子类实例化父类对象时,就能看到不同的表现结果。

四、依赖倒置原则

  英文名称是Dependence Inversion Principle,缩写为DIP。
  指代码之间相互依赖时,依赖的是接口或者抽象类,而不是依赖具体实现类。
  接口或抽象类都是抽象的,可以起到制定“协议”、“标准”的作用,通过接口或抽象类实现抽象层,再通过抽象层关联不同模块,可以很大程度上降低模块之间的耦合度,当一个模块依赖另一个模块时,只需要关注抽象层提供的的接口,而不用关心所依赖模块的具体实现,只要抽象层不变,即使被依赖模块的内部实现变了,依赖它的模块也不需要跟着改动代码,这样很好地保证了模块的变动自由度。

五、接口隔离原则

  英文名称是Interface Segregation Principle,缩写为ISP。
  接口隔离原则,从名字上理解,很容易理解为和依赖倒置一样的原则,即通过抽象的接口隔离不模块,但其实接口隔离原则在依赖倒置原则的基础库上,进一步强调了接口的设计原则,即接口应该尽可能更加轻量。
  接口更加轻量,主要是指接口只暴露出需要用到的接口方法,不需要用到的接口方法则不暴露给外部。此外,接口及接口方法的命名、接口方法参数及返回值的设计等,在保证正确的前提下,也应该尽可能规范、简单且便于理解。

六、迪米特原则

  英文名称是Law of Demeter,缩写为LOD。
  也称为最少知识原则(Least Knowledge Principle),这里的知识是指一个类对其它类的了解,因此迪米特原则可以理解为一个类应该要尽可能少依赖其它类,如果必须要依赖,那么这个类也应该对依赖到的类保持尽可能少的了解。
  相当于一个人非常谨慎,绝对不和陌生人说话,只和他认定的朋友说话,即使和朋友说话,聊的也仅限于有实际用处的话题,拒绝闲聊。

参考资料

[1] Android 源码设计模式解析与实战 第2版 何红辉,关爱民著 人民邮电出版社 2017.7 (2017.1重印)