一分钟理解向后兼容

Posted 海枫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一分钟理解向后兼容相关的知识,希望对你有一定的参考价值。

什么是兼容

谈到兼容,少不了获得兼容收益的目标对象,以及提供兼容功能的组件这两个相互对应的概念。

如果一个目标对象,能否在同一组件的同个不同版本上协同工作,则移该组件的两个版本是兼容的,如下图所示:

兼容性分类

组件的两个版本是兼容的,那就会有新版本兼容旧版本,或者旧新版本兼容新版本这两个兼容方向

在旧版本上开发的目标,或者旧版本生成的数据,能够在新版本正确运行,或者正确处理,称为向后兼容

换句话说:向后兼容是指向历史兼容,如下图所示:

向前兼容却相好相反,在新版本上开发的目标,或者新版本上生成的数据,能够在旧新版本上运行,或者处理,则称为向前兼容

换句话说:向前兼容是指向未来兼容,如下图所示:

例解向后兼容

以软件为例子,说业界几个知名的向后兼容案例。

操作系统兼容应用程序

Ubuntu 16.04 向后兼容 Ubuntu 12.04

硬件兼容操作系统

Intel 64位处理器向后兼容32位处理器

软件兼容数据

Office 2010 向后兼容 Office 2003

更多的向后兼容例子,请访问维基百科Backward compatibility词条中的案例

实现向后兼容有什么魔法

说个大实话,提供兼容性本身就是一种负担,它会制约着产品的设计。但在很多情况下,如果软件或者硬件不提供兼容性,客户是无法为你的产品买单的。

如何设计一个产品才能满足向后兼容呢,它的秘诀就是只新增接口,对现有接口不能做任何修改,同时可感知到的默认行为都要保持不变。

这约束太强了吧,在软件只新增接口或功能同时,怎么也会对现有的接口做修改吧?

如果真的需要修改接口,也请不要修改原来的接口,而是采用下面两种策略:

  1. 开发一个新接口,上层新版本软件请使用新接口;没有重编修改源代码和编译的老软件仍然使用老接口
  2. 保留原有接口,开发一个同名的新接口,但接口版本号不同(Linux下的glibc就采用了版本机制实现应后兼容能力)

如果提供兼容性的组件的各个接口是相对独立的,比如Linux下的glibc运行库,实现向后兼容相对比较容易。但是如果组件对外提供的接口非常内聚,提供两个版本接口实现,是很难维护的。

小结

后向兼容是指向历史版本兼容,新版本完全兼容旧版本的接口和功能。

以上是关于一分钟理解向后兼容的主要内容,如果未能解决你的问题,请参考以下文章

一分钟理解向后兼容

语义版本控制 (Semver) - 如何对向后兼容的大型功能更新进行 semver

向下兼容,向上叫啥

为啥javascript向后兼容故障?

女生向下兼容是啥意思

字体向后不兼容