1. 程式人生 > >一分鐘理解向後相容

一分鐘理解向後相容

什麼是相容

談到相容,少不了獲得相容收益的目標物件,以及提供相容功能的元件這兩個相互對應的概念。

如果一個目標物件,能否在同一組件的同個不同版本上協同工作,則移該元件的兩個版本是相容的,如下圖所示:

相容

相容性分類

元件的兩個版本是相容的,那就會有新版本相容舊版本,或者舊新版本相容新版本這兩個相容方向

在舊版本上開發的目標,或者舊版本生成的資料,能夠在新版本正確執行,或者正確處理,稱為向後相容

換句話說:向後相容是指向歷史相容,如下圖所示:

向後相容

向前相容卻相好相反,在新版本上開發的目標,或者新版本上生成的資料,能夠在舊新版本上執行,或者處理,則稱為向前相容

換句話說:向前相容

是指向未來相容,如下圖所示:

向前相容

例解向後相容

以軟體為例子,說業界幾個知名的向後相容案例。

作業系統相容應用程式

Ubuntu 16.04 向後相容 Ubuntu 12.04

Ubuntu 16.04 相容 Ubuntu 12.04

硬體相容作業系統

Intel 64位處理器向後相容32位處理器

Intel 64位處理器 向後相容32位處理器

軟體相容資料

Office 2010 向後相容 Office 2003

Office 2010 向後相容 Office 2003

實現向後相容有什麼魔法

說個大實話,提供相容性本身就是一種負擔,它會制約著產品的設計。但在很多情況下,如果軟體或者硬體不提供相容性,客戶是無法為你的產品買單的。

如何設計一個產品才能滿足向後相容呢,它的祕訣就是只新增介面,對現有介面不能做任何修改

,同時可感知到的預設行為都要保持不變。

這約束太強了吧,在軟體只新增介面或功能同時,怎麼也會對現有的介面做修改吧?

如果真的需要修改介面,也請不要修改原來的介面,而是採用下面兩種策略:

  1. 開發一個新介面,上層新版本軟體請使用新介面;沒有重編修改原始碼和編譯的老軟體仍然使用老介面
  2. 保留原有介面,開發一個同名的新介面,但介面版本號不同(Linux下的glibc就採用了版本機制實現應後相容能力)

如果提供相容性的元件的各個介面是相對獨立的,比如Linux下的glibc執行庫,實現向後相容相對比較容易。但是如果元件對外提供的介面非常內聚,提供兩個版本介面實現,是很難維護的。

小結

後向相容是指向歷史版本相容,新版本完全相容舊版本的介面和功能。