向前兼容與向后兼容


向前兼容或者叫向上兼容,向未來兼容
向后兼容或者叫向下兼容,向過去兼容

討論兼容性問題,表面上是說兩個東西的關系,但其實隱藏了一個前提,就是依賴性,而依賴是有方向性的

我們說A依賴B,表達的意思是A的正常工作是依賴B的,同時也是一種配合關系,若這種配合關系可以錯位,其實就是實現了某種兼容

假設A依賴B可正常工作,后續迭代后,A1依賴B1時可正常工作的,再次迭代后,A2依賴B2是可正常工作

A --> A1 --> A2
B --> B1 --> B2

現在討論B的兼容性,B迭代后是B1,如果A可以依賴B1可正常工作,那么意味着B做到了向后兼容,也就是向過去兼容,若果A2依賴B1是可以正常工作的,那么意味在迭代到B1時,對未來發生的變化做到了兼容,所謂向前兼容。

再說A的兼容性,A迭代后是A1,如果A1可以依賴B正常工作,那么意味着A做到了向后兼容,如果A1依賴B2頁可以正常工作,那么A做到了向前兼容。

其實A1可以依賴B正常工作,也可看成是B做到了向前兼容,A1依賴B2頁可以正常工作,可以看成是B做到了向后兼容,推廣可以得到,如果B始終保持向后兼容,那么A就一定是向前兼容的,反之亦然。

但實際操作中,B是A的依賴,所以B迭代成B1,才會出現A1,因為如果沒有B1,也就是B沒迭代,A的升級后不能稱之為A1,還是A。所以是B先迭代到B1,A可以依賴B1工作,意味着B1做到了向后兼容,一般不說A是向前兼容。
那么當迭代A到A1時,如果A1也能依賴B正常工作,那么A1做到了向后兼容,一般不說B做到了向前兼容。

通過推廣可以知道,如果A和B都做到了向后兼容,那么意味着,同時A和B也做到了向前兼容

不過大多數場景中,比如glibc,一般是B做到了向后(過去)兼容,意味着A可以依賴當前或者新的B(未來)正常工作,但不能依賴舊的(過去)B。也相當於A面向未來兼容了,向前兼容(一般不這么說)。
glibc做到了向后兼容,新的bin不能使用舊的glibc工作,但可以使用新的glibc進行工作

也有場景是A一直做到向后兼容,比如B是數據,數據文件格式發生了變化,相當於B變成了B1,讓A能讀取B1一般是困難的,大多是A1要能做到即能讀取B1又能讀取B,意味着A做到了向后兼容。也相當於B向未來兼容了,向前兼容(一般不這么說)

有時這種兼容關系比較容易搞混,因為角度和依賴關系的分析不一樣會得出完全相反的結論,比如下面這個例子:
比如一個數據生產者P,生產的數據D,一個數據消費者C,而P和C卻是同一個模塊M的兩個角色。
依賴關系來看,C是依賴P的,因為P生產數據后,C才能消費
C --> C1
P --> P1
如果P的升級導致數據格式的變化,生產D1,但C依然可以消費P1生產的數據D1,可以說P的升級做到了向后兼容
但深入分析一下,P的升級其實是M的升級,M要生產新的數據格式,就升級到了M1,若此時C中的M還能讀數據D1,那么M是做到了向前兼容,從P的角度看,P的升級做到了向前兼容嗎?

其實M的兼容性是相對D來說的,也就是M1生產的D1,但M能夠讀取D1說明,M是向前兼容了。
M --> M1
D --> D1

但這就是一次升級,卻有兩種說法,到底這次升級是實現了向前兼容還是向后兼容很容易搞混,所以不同的角度,會導致不同的答案,但本質上還是概念的區分


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM