前言
本篇为概念篇,无代码
修电脑
本篇一开始说了一个小菜的女生朋友蓝屏了,小菜远程帮她修电脑,然后大鸟就引出蓝屏通常是内存本身有问题或内存与主板不兼容,放到面向对象的角度,CPU,内存,硬盘,显卡与电脑的关系就是强内聚,松耦合
依赖翻转原则
- 高层模块不应该依赖低层模块,两个都应该依赖抽象
- 抽象不应该依赖细节,细节应该依赖抽象
高层模块依赖低层模块
- 举个例子,把访问数据库的代码写成函数,每次做新项目就去调用这些函数,这就叫做高层模块依赖低层模块
- 出现的问题
- 如果客户希望用不同数据库或者存储信息方式,没办法复用这些高层模块
- 就好比内存等零件依赖了主板,如果主板坏了,则所有零件将不可用
抽象不应该依赖于细节,细节应该依赖于抽象
- 说白了,就是要针对接口编程,不要对实现编程
- 内存等硬件都是针对接口设计的,因为不同主板的内存坏了都能换上同一个内存
- 如果是针对实现编程
- 那么适合A主板的内存a就只有A主板能用,它将不适合主板B
- 假如a内存坏了,将没有适合a内存的主板,还需要换掉主板B,并装上适合B主板的内存b
- 当然了,其他设备也将要更换,过程十分繁琐,成本十分巨大
- 如果是针对实现编程
里式代换原则
一个软件实体如果使用的是一个父类,那么一定适用于其子类,而且他察觉不出父类对象和子类对象的区别,也就是说,在软件里面,把父类都替换成子类,程序的行为没有变化,简单的说,子类型必须能够替换他们的父类型
只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正被复用,而子类才能在父类基础上增加新的行为
由于子类的可替换性才使得使用父类类型的模块在无需修改的情况下就可以扩展
举个例子
- 面向对象设计时,有一个鸟类,一个企鹅类,鸟是可以飞的,企鹅不是飞,那么企鹅是鸟吗?企鹅可以继承这个鸟类吗?
- 在面向对象设计时,子类拥有父类所有非private的行为和属性
- 鸟会飞,但是企鹅不会飞,所以企鹅就不能以父类——鸟类出现,也就是说企鹅类不能继承鸟类
- 现在有一个动物类,一个牛类,一个羊类
- 他们可以继承动物类,而动物类会有吃,喝,跑,叫等动作
- 一开始如果用的是牛类,由于需求的变化,换成羊类,只需要改子类的调用即可,其他地方都不要改变
修收音机
- 收音机就是一个典型的耦合过渡的例子,它里面的零件相互依赖,难以维护,收音机出了故障,无论是不能调频,还是有杂音都不好修理.
- 电脑正是做到了各个零件相互不依赖,才做到人人可修电脑
- 依赖倒转可以说是面向对象设计的标志,用哪种语言来编写程序不重要,如果编写时考虑的都是如何针对抽象编程而不是细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口,那就是面向对象的设计,反之那就是过程化的设计了