提供方可以修改,增加新的功能特性,但是使用方不需要被修改,即可享用新的功能特征 。
开闭原则广泛的理解,可以指导类、模块、系统的设计,满足该原则的核心设计方法是:通过协议(接口)交互 。
4.3 里氏替换原则(LSP)
定义:所有引用父类的地方,必须能透明的使用它的子类对象,指导类继承的设计 。
面向对象的继承特性,一方面,子类可以拥有父类的属性和方法,提高了代码的复用性;另一方面,继承是有入侵性的,父类对子类有约束,子类必须拥有父类全部的属性和方法,修改父类会影响子类,增加了耦合性 。
里氏替换原则是对继承进行了约束,体现在以下方面:
- 子类可以实现父类的抽象方法,但不能重写(覆盖)父类的非抽象方法 。
- 子类可以增加父类所没有的属性和方法 。
- 子类重写父类方法时,输入参数类型要和父类的一致,或更宽松(参数类型的父类) 。
- 子类重写父类方法时,返回值类型要和父类的一致,或更严谨(返回类型的子类) 。
定义:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象,目的是降低层与层之间的耦合 。
从倒置来看,该原则可以有更泛化的理解:
- 依赖实体的倒置:高层不依赖底层模块,抽象不依赖细节,例如模块分层规范中的domain不依赖infrastructure的实现 。
- 依赖控制的倒置:依赖具体对象的创建控制,从程序内部交给外部,例如Spring的Ioc容器 。
- 商业能力基座:主要包含购物车的业务流程实现、外域服务定义(非实现)、商业定制能力(扩展点),打包后需满足一套代码多处部署的要求 。
- 域服务能力实例:针对不同运行环境,提供适配环境的域服务实现,商业基座反向依赖域服务实例,使得基座与环境无关 。
定义:客户端不应该被强迫去依赖它并不需要的接口 。
理解接口隔离原则,需要拿单一职责的原则做对比 。细品一下,如果一个接口满足了单一职责,是否就也就满足接口隔离原则?
- 单一职责原则,解决了接口内聚的问题 。
- 接口隔离原则,认为某些场景下需要存在非内聚接口(多职责),但是又不希望客户端知道整个类,客户端只要知道具有内聚接口的抽象父类即可 。
五、编程范式
5.1 编程范式
编程范式,本质是一种思维方式,而和具体语言没关系 。
用C语言可以写出面向对象的程序,用Java语言可以写出面向过程的程序 。而不争的现实是,我们大部分人是在用java写面向过程的代码 。
例如下面代码,它是如何用面向过程语言实现封装、继承、多态的?
备注:以上代码来自开源libevent库
a. 结构化(面向过程)编程
最早使用机器和汇编语言编程,是编排好一堆命令让机器逐条执行,为了控制一些跳跃的流程(如if/for/continue/break),就会用到类似goto的语句,让程序直接跳转到希望执行的指令位置,这样程序员就拥有了直接转移程序控制权的能力 。goto的无条件转移,使得程序的控制流难于追踪,程序难以修改和维护 。
推荐阅读
- 车辆识别代码是什么意思
- 音序怎么写在四线格里 音序怎么写
- 2022年各高校专业代码四位数 2022年各高校专业代码
- 诗歌的特征包括 诗歌的特征包括哪四个
- 新课程教学反思中的问题有哪些
- 幼儿园教学经验总结 教师个人教学经验总结
- 罗牛山学校教学质量怎么样
- 月份天数口诀手指视频 月份天数口诀歌
- python编程入门自学 游戏代码大全可复制免费
- 教学过程的本质表现在哪些方面 教学过程的本质属性是