本文已参与「新人创作礼」活动,一起开启掘金创作之路。
什么是依赖倒转原则
下面三个就是
- 高层模块不依赖低层模块
- 抽象不依赖细节
- 细节依赖抽象
为什么需要这个原则?
假设现在需要开发一个软件,其中某个功能需要和数据库进行操作
那么,马上能想到的方法是不是就是,把,对数据库进行操作的部分单独写成一个类
这样子写会有什么问题?
- 如果数据库系统版本不同,需要单独对不同的版本写代码时,需要修改整个类
就像针对 Python2 和 Python3来写代码,会有不同的情况,有些做法在 2 的版本中行得通,而在 3 中行不通
- 如果需要修改或者对某个功能进行增加或者删除,也需要对整个类进行修改
当工程量十分庞大的时候,工作量也增大,如果在这其中不小心弄错了,那不就全部崩掉了
那我该怎么做?
- 根据前面的原则,高层不依赖低层
让这两个模块分别依赖于他们自己的抽象类
- 细节需要依赖抽象
在抽象类中实现相应的抽象方法,而实际实现功能的子类继承对应的抽象类并实现相应的方法,这样做的话,如果像前面说的,针对不同的数据库版本需要编写不同的代码,那么只需要写出不同版本数据库使用的类即可,每一个版本都是一个类,所以,可以使不同版本的数据库都有对应的类去实现相应的功能
- 抽象不依赖细节
抽象类中编写的是高度抽象的东西,是对一系列行为或者功能的高度总结,所以,某些类中的具体实现不应该影响到抽象类的编写,就像排序算法有很多种,不管实现排序算法使用的是快排,归并,或者堆排序,都不会影响到抽象类中有一个排序函数,影响他的只会是有没有排序这个功能
这个可以类比各个法律和宪法的关系,宪法只是规定了一个大局上的规定(抽象的),而各个法律是去具体实现的(具体的),比如宪法规定公民有受教育的权利,那么,中华人民共和国义务教育法就具体说明了,怎样实现公民的受教育权(九年义务教育)
里氏代换原则
这就是它的内容
子类必须能替换父类,并且替换之后原程序功能不会缺少
理解
这个其实很好说明,因为子类和父类的关系是继承,所以,子类可以在父类的基础上根据实际情况写出其他父类所不具备的东西
举例
比如说设计一个鸟类作为父类,那么鸟类可以飞翔,把这个行为写在父类里面
现在有蜂鸟这个类,那么他就可以实现父类(鸟类)中的飞翔这个功能(继承父类),而且蜂鸟可以倒着飞,悬停,这些是父类不具有的,属于他自己的特色
如果这个时候,使用蜂鸟类去替换父类,程序的功能不会缺少吧?
二者都能飞翔,只不过蜂鸟的悬停,倒着飞,暂时用不上罢了
总结
所以,面向对象其实是以抽象的思维来写程序,把一项项功能中的相同部分抽取出来,减少重复的工作量,从这两个原则中都能体现出来