首页 > 代码库 > 一分钟理解向后兼容
一分钟理解向后兼容
什么是兼容
谈到兼容,少不了获得兼容收益的目标对象,以及提供兼容功能的组件这两个相互对应的概念。
如果一个目标对象,能否在同一组件的同个不同版本上协同工作,则移该组件的两个版本是兼容的,如下图所示:
兼容性分类
组件的两个版本是兼容的,那就会有新版本兼容旧版本,或者旧新版本兼容新版本这两个兼容方向
在旧版本上开发的目标,或者旧版本生成的数据,能够在新版本正确运行,或者正确处理,称为向后兼容。
换句话说:向后兼容是指向历史兼容,如下图所示:
向前兼容却相好相反,在新版本上开发的目标,或者新版本上生成的数据,能够在旧新版本上运行,或者处理,则称为向前兼容。
换句话说:向前兼容是指向未来兼容,如下图所示:
例解向后兼容
以软件为例子,说业界几个知名的向后兼容案例。
操作系统兼容应用程序
Ubuntu 16.04 向后兼容 Ubuntu 12.04
硬件兼容操作系统
Intel 64位处理器向后兼容32位处理器
软件兼容数据
Office 2010 向后兼容 Office 2003
更多的向后兼容例子,请访问维基百科Backward compatibility词条中的案例。
实现向后兼容有什么魔法
说个大实话,提供兼容性本身就是一种负担,它会制约着产品的设计。但在很多情况下,如果软件或者硬件不提供兼容性,客户是无法为你的产品买单的。
如何设计一个产品才能满足向后兼容呢,它的秘诀就是只新增接口,对现有接口不能做任何修改,同时可感知到的默认行为都要保持不变。
这约束太强了吧,在软件只新增接口或功能同时,怎么也会对现有的接口做修改吧?
如果真的需要修改接口,也请不要修改原来的接口,而是采用下面两种策略:
- 开发一个新接口,上层新版本软件请使用新接口;没有重编修改源代码和编译的老软件仍然使用老接口
- 保留原有接口,开发一个同名的新接口,但接口版本号不同(Linux下的glibc就采用了版本机制实现应后兼容能力)
如果提供兼容性的组件的各个接口是相对独立的,比如Linux下的glibc运行库,实现向后兼容相对比较容易。但是如果组件对外提供的接口非常内聚,提供两个版本接口实现,是很难维护的。
小结
后向兼容是指向历史版本兼容,新版本完全兼容旧版本的接口和功能。
一分钟理解向后兼容