可扩展性指系统为了应对将来需求变化而提供的一种扩展能力,当有新的需求出现时,系统不需要或者仅需要少量修改就可以支持,无须整个系统重构或者重建。
在软件开发领域,面向对象思想的提出,就是为了解决可扩展性带来的问题,后来的设计模式,更是将可扩展性做到了极致。
设计具备良好可扩展性的系统,有两个基本条件:正确预测变化、完美封装变化。但要达成这两个条件,本身也是一件复杂的事情。
预测变化
预测变化的复杂性在于:
- 不能每个设计点都考虑可扩展性;
- 不能完全不考虑可扩展性;
- 所有的预测都存在出错的可能性;
应对变化
方案一
将变化封装在一个变化层,将不变的部分封装在一个独立的稳定层:
无论是变化层依赖稳定层,还是稳定层依赖变化层都是可以的,需要根据具体业务情况来设计。如:
- 系统需要支持 XML、JSON、ProtocolBuffer 三种接入方式:
- 系统需要支持 MySQL、Oracle、DB2 数据库存储:
无论采取哪种形式,通过剥离变化层和稳定层的方式应对变化,都会带来两个主要的复杂性相关的问题。
- 系统需要拆分出变化层和稳定层
对于哪些属于变化层,哪些属于稳定层,很多时候并不是很明确,不同的人有不同的理解; - 需要设计变化层和稳定层之间的接口
接口设计同样至关重要,对于稳定层来说,接口肯定是越稳定越好。但对于变化层来说,在有差异的多个实现方式中找出共同点,并且还要保证当加入新的功能时原有的接口设计不需要太大修改,这是一件很复杂的事情。
方案二
提炼出一个抽象层和一个实现层。抽象层是稳定的,实现层可以根据具体业务需要定制开发,当加入新的功能时,只需要增加新的实现,无须修改抽象层。
这种方案典型的实践就是设计模式和规则引擎。
--------来源《极客课程》∙ 学习摘要