PC电脑里的易拔插——强内聚,松耦合。
依赖倒转原则(依赖倒置原则):抽象不应该依赖细节,细节应该依赖于抽象(针对接口编程,通过抽象的接口交互,抽象出顶层的接口叫抽象不依赖于细节;一个函数的具体实现如果用到了其他接口的功能
只需要调用其他功能模块的接口即可,这叫细节依赖于抽象)。针对接口编程,不要对实现编程。
依赖倒转原则:
A.高层模块不应该依赖底层模块。两个都应该依赖抽象。
B.抽象不应该依赖细节。细节应该以来抽象。
为什么叫倒转呢?
面向过程的开发时,为了使得常用代码可以复用,一般都会把这些常用代码写成许许多多函数的程序库,当我们在做新项目时,去调用这些低层的函数就可以了。比如我们做的项目大多要访问数据库,所以我们就把访问数据库的代码写成了函数(封装到函数库中),每次做新项目时就去调用这些函数。这就叫做高层模块依赖底层模块。
问题也就出现在这里,当我们要做新项目时,发现业务逻辑的高层模块都是一样的,但客户希望使用不同的数据库或存储信息方式,就有问题了。我们希望能再次利用这些高层模块,但高层模块都是与低层的访问数据库绑定在一起的,没办法复用这些高层模块,这就非常糟糕了。(例如,如果程序中使用专门用来连接oracle数据库的连接访问函数,当想复用业务代码,替换数据连接访问操作时则需要修改程序,修改数据库连接访问操作部分代码适应新的数据库,如果面向了接口编程则
不需要修改业务中的代码,因为业务代码中访问操作数据部分使用的是接口)。如果不管高层模块还是低层模块,它们都依赖于抽象,具体一点就是接口或抽象,只要接口稳定,那么任何一个的更改都用担心其他收到影响,使得无论高层模块还是低层模块都可以很容易地被复用。
5.4 里氏替换原则
一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类对象和子类对象的区别。也就是说,在软件里面,把父类都替换成它的子类,程序的行为没有变化。简单说就是子类型必须能够替换掉它们的父类型。
概念:
里氏替换原则:子类型必须能够替换掉它们的父类型。
和C++中父类指针指向之类对象,或者父类引用指向子类对象是一个概念。
也正因为有了这个原则,使得继承复用成为了可能。只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。
在程序中软件行为不变,但是行为的具体实现有变化,只需要更改类实例化的地方即可,其他地方不需要更改。比如,计算器中求两个数的运算,用到的是运算这个功能点(函数点),具体的运算内的实现过程是可改变的。
由于有里氏替换原则,才使得开放-封闭成为了可能。
正是由于子类型的可替换性才使得使用父类类型的模块在无需修改的情况下就可以扩展(只需要修改实例化的地方,如果实例化对象部分封装了起来则只需要通过传递参数符号即可)。
高耦合软件程序中任何问题都可能涉及其他部分,各个部件相互依赖,难以维护。
依赖倒转其实可以说是面向对象设计的标志,用哪种语言来编写程序不重要,如果编写时考虑的都是如何针对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口,那就是面向对象的设计,反之那就是面向过程化的设计了。