- 編程原則:來自代碼大師Max Kanat-Alexander的建議
- (美)馬克斯·卡納特-亞歷山大
- 1294字
- 2021-07-09 20:27:43
第7章 什么時候不值得向后兼容
本篇標題似乎和前一篇內(nèi)容相互矛盾……當然,如果條件允許的話,你確實不應該違背API約定。但有的時候保證應用程序的每一個組件都向后兼容會導致收益遞減。這個原理不僅對API適用,對整個程序也同樣適用。
因為向后兼容而引發(fā)問題的最好例子就是Perl編程語言。如果你閱讀過發(fā)送給那些對Perl 5核心開發(fā)感興趣的開發(fā)者的郵件列表摘要,又或者你大致了解Perl技術(shù)內(nèi)幕的相關(guān)歷史,你應該知道我想要說什么。
Perl這門編程語言充斥著對于那些,真的不應該有人再去使用的奇怪語法的支持。舉個例子,在Perl中,你本應該用類似于$object->method()的方式調(diào)用對象上的方法。但是也同時存在一種稱為“間接對象語法”的概念,借助它你可以編寫method $object這樣的語句來達到同樣效果。注意別把它和method($object)混淆了——前者不帶括號的用法才是間接對象語法。
說真的,沒有人應該繼續(xù)使用那種語法,并且以正確的方式修復程序中調(diào)用方法的地方也不是難事。但為了保證向后兼容,該語法在Perl二進制包中一直受到支持并被維護著。
因為各種歷史遺留問題Perl充斥著像上面這樣阻礙向前發(fā)展的種種障礙。
顯而易見的是這是權(quán)衡利弊之后的結(jié)果。當不計其數(shù)的人都在這么使用,并且對他們來說改變習慣非常困難的話,結(jié)果就是很大程度就不得不保證向后兼容。但如果維持向后兼容這件事確實阻礙了技術(shù)向前發(fā)展,那么你就需要警告人們這些“老掉牙的玩意”應該消失,并且是時候?qū)λ鼈冋f再見了。
你的另一個選擇是無節(jié)制的向后兼容并且不再向前發(fā)展,這意味著對你的產(chǎn)品判了死刑。
這很好地說明了為什么你不應該漫無目的地給你的程序添加功能。因為總有一天你需要為這些你開發(fā)的“盡管沒有什么用但加上去很方便”的功能提供向后兼容的支持。這是在添加新功能時需要慎重考慮的一點——既然這個特性已經(jīng)存在于你的系統(tǒng)中了,那么你打算永遠把它維護下去嗎?答案是:你很可能需要。
如果你從來沒有維護過多人使用的大型系統(tǒng),你可能對以下兩點沒有概念:
1.你不支持向后兼容的決定會導致多少用戶遭殃。
2.如果持續(xù)向后兼容你會把自己搞得多狼狽。
理想的解決方案是:如果你不想在許許多多的后續(xù)版本中支持這些功能,那么當下就不要添加它們。有時候需要豐富的編程經(jīng)驗才能有效地做出這樣的決策,但你可以從這個功能的角度思考:“它真的這么實用嗎,以至于值得我在未來的三到四年里在它上面花費至少10小時的開發(fā)時間?”這種用于評估應該花費多少精力在某件事物上的方法適用于萬事萬物,包括向后兼容、質(zhì)量保證,甚至對評審極小的功能也同樣成立。
一旦你擁有了一個功能,就意味著維護它的向后兼容性將會是日后的絕大部分工作。Bugzilla是我曾經(jīng)參與開發(fā)過的一個產(chǎn)品。在2014年它依然支持從2.8版本升級到最新版本——要知道2.8版本發(fā)布于1999年。它之所以能做到跨多個版本升級,是因為我們編寫升級程序的方式是建立在不維護舊升級程序的基礎(chǔ)上的,這也意味著我們向后兼容的成本是零。隨著時間推移,我們只為新版本的Bugzilla添加新的代碼,而幾乎從來不修改舊代碼。像這樣零成本的向后兼容是我們期望一直持續(xù)下去的。
你應該認真考慮放棄向后兼容的唯一時機是,當它在妨礙你添加明顯實用且重要的新功能的時候。
如果這種情況確實發(fā)生了,那么你就需要放棄向后兼容了。
——Max
- Vue.js 3.x快速入門
- MySQL數(shù)據(jù)庫管理實戰(zhàn)
- Spring Cloud Alibaba核心技術(shù)與實戰(zhàn)案例
- Hands-On Machine Learning with scikit:learn and Scientific Python Toolkits
- R語言游戲數(shù)據(jù)分析與挖掘
- 實戰(zhàn)Java高并發(fā)程序設計(第3版)
- bbPress Complete
- Integrating Facebook iOS SDK with Your Application
- Laravel Application Development Blueprints
- 高效使用Greenplum:入門、進階與數(shù)據(jù)中臺
- 零基礎(chǔ)學Java第2版
- 零基礎(chǔ)學SQL(升級版)
- 深入理解Zabbix監(jiān)控系統(tǒng)
- Python編程:從入門到實踐(第2版)
- Hands-On GUI Application Development in Go