首页 > 代码库 > 一分钟理解向后兼容

一分钟理解向后兼容

什么是兼容

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

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

技术分享

兼容性分类

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

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

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

技术分享

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

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

技术分享

例解向后兼容

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

操作系统兼容应用程序

Ubuntu 16.04 向后兼容 Ubuntu 12.04

技术分享

硬件兼容操作系统

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

技术分享

软件兼容数据

Office 2010 向后兼容 Office 2003

技术分享

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

实现向后兼容有什么魔法

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

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

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

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

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

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

小结

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

<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

    一分钟理解向后兼容