代码编程教学入门 代码怎么编写( 五 )


提供方可以修改,增加新的功能特性,但是使用方不需要被修改,即可享用新的功能特征 。
开闭原则广泛的理解,可以指导类、模块、系统的设计,满足该原则的核心设计方法是:通过协议(接口)交互 。
4.3 里氏替换原则(LSP)
定义:所有引用父类的地方,必须能透明的使用它的子类对象,指导类继承的设计 。
面向对象的继承特性,一方面,子类可以拥有父类的属性和方法,提高了代码的复用性;另一方面,继承是有入侵性的,父类对子类有约束,子类必须拥有父类全部的属性和方法,修改父类会影响子类,增加了耦合性 。
里氏替换原则是对继承进行了约束,体现在以下方面:

  • 子类可以实现父类的抽象方法,但不能重写(覆盖)父类的非抽象方法 。
  • 子类可以增加父类所没有的属性和方法 。
  • 子类重写父类方法时,输入参数类型要和父类的一致,或更宽松(参数类型的父类) 。
  • 子类重写父类方法时,返回值类型要和父类的一致,或更严谨(返回类型的子类) 。
4.4 依赖倒置原则(DIP)
定义:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象,目的是降低层与层之间的耦合 。
从倒置来看,该原则可以有更泛化的理解:
  • 依赖实体的倒置:高层不依赖底层模块,抽象不依赖细节,例如模块分层规范中的domain不依赖infrastructure的实现 。
  • 依赖控制的倒置:依赖具体对象的创建控制,从程序内部交给外部,例如Spring的Ioc容器 。
举个购物车的例子:
代码编程教学入门 代码怎么编写


  • 商业能力基座:主要包含购物车的业务流程实现、外域服务定义(非实现)、商业定制能力(扩展点),打包后需满足一套代码多处部署的要求 。
  • 域服务能力实例:针对不同运行环境,提供适配环境的域服务实现,商业基座反向依赖域服务实例,使得基座与环境无关 。
4.5 接口隔离原则(ISP)
定义:客户端不应该被强迫去依赖它并不需要的接口 。
理解接口隔离原则,需要拿单一职责的原则做对比 。细品一下,如果一个接口满足了单一职责,是否就也就满足接口隔离原则?
  • 单一职责原则,解决了接口内聚的问题 。
  • 接口隔离原则,认为某些场景下需要存在非内聚接口(多职责),但是又不希望客户端知道整个类,客户端只要知道具有内聚接口的抽象父类即可 。
简单来讲,接口隔离原则解决的问题是,当某些类本身或面向使用方不满足职责单一原则时,客户端不应该直接使用它们,而是通过增加接口类,通过它隐藏客户端不需要感知到的部分 。
五、编程范式
5.1 编程范式
编程范式,本质是一种思维方式,而和具体语言没关系 。
用C语言可以写出面向对象的程序,用Java语言可以写出面向过程的程序 。而不争的现实是,我们大部分人是在用java写面向过程的代码 。
例如下面代码,它是如何用面向过程语言实现封装、继承、多态的?
代码编程教学入门 代码怎么编写


备注:以上代码来自开源libevent库
a. 结构化(面向过程)编程
最早使用机器和汇编语言编程,是编排好一堆命令让机器逐条执行,为了控制一些跳跃的流程(如if/for/continue/break),就会用到类似goto的语句,让程序直接跳转到希望执行的指令位置,这样程序员就拥有了直接转移程序控制权的能力 。goto的无条件转移,使得程序的控制流难于追踪,程序难以修改和维护 。

推荐阅读