幾個月前寫了一篇文章如何寫出難以維護的程式碼,從中能大概瞭解到不好維護的程式碼是什麼樣,有哪些壞味道,那肯定有人會反問,難以維護的程式碼見的太多了,也知道長什麼樣,但是對於好維護的程式碼是什麼樣的比較模糊,帶著這個問題,本人讀完了世界軟件開發大師馬丁的《程式碼整潔之道》這本書,來了解下大師眼中的整潔程式碼畫像是什麼樣的,相信能給你帶來不一樣的理解和感悟。
關於整潔程式碼,沒有明確的定義,有多少程式設計師就有多少種定義。下面先看下幾位大師是如何定義的。
C++語言發明者Bjarne Stroustrup提到:
程式碼應該優雅高效,程式碼邏輯應該直截了當,讓缺陷難以隱藏,儘量減少依賴關係,便於維護;按照某種分層策略完善錯誤處理,效能調到最優,不會讓別人修改的更混亂;整潔的程式碼只做一件事。
《物件導向分析與設計》一書作者Grad Booch提到:
整潔的程式碼簡單直接,如同散文一樣優美,從不隱藏設計者的意圖,程式碼抽象乾淨利落,控制語句直截了當。
Eclipse戰略教父Dave Thomas這麼定義:
整潔的程式碼應可由其他開發者閱讀和增補,應當有單元測試和驗收測試,使用有意義的命名,只提供一種而非多種做一件事的途徑,只有儘量少的依賴關係,而且要明確地定義和提供清晰、儘量少的API。
《修改程式碼的藝術》一書作者Michael Feathers定義:
整潔程式碼應該是特別在意程式碼的人才能寫出來的,幾乎沒有改進的餘地,作者各種情況都想到了,如果你想改進它,總會回到原點,總會讚歎寫程式碼的人的專心和認真。
《極限程式設計實施》作者Ron Jeffries提出整潔程式碼:
能透過所有測試,沒有重複程式碼,程式碼能體現設計理念,儘量減少類,方法以及函式。
綜合以上幾位大師對整潔程式碼的定義闡述,可以歸納總結一下整潔程式碼的畫像:
1.體現設計理念,這個整潔程式碼特性在以上大師的定義裡面多次提到了,Grady提到整潔程式碼不會隱藏設計意圖,Ron提到整潔程式碼一看就知道採用了什麼樣的設計理念。體現設計理念看上去有點虛,但是實際上我認為是最重要的一點,所謂程式碼即設計,只要能回答程式碼為什麼這麼寫,就說明你的程式碼有設計思想在裡面,即便一行程式碼都能體現出設計理念,比如一個有意義的命名也是設計的一種表現。
2.沒有重複程式碼,如果你兩處程式碼相同或者大部分重複,說明程式碼不夠整潔,同時說明程式碼沒有去做好設計。消除重複程式碼意味著減少類和方法以及相關API。
3.程式碼只做一件事,很多程式碼由於想做太多事,目的不明確,意圖混亂,結果程式碼變得很糟糕,程式碼只做一件事,也稱單一職責,這個幾乎是很多軟體設計裡面經常提到的一個警句,這個原則看似很簡單,但是實際上執行起來不是那麼簡單,或者說,一時堅持這個原則很容易,難的是一直堅持這個原則,如果始終能踐行這個原則,程式碼整潔度能達到質的飛躍。
4.程式碼好閱讀,關於閱讀,Bjarne用“優雅”來形容,優雅意味著優美雅緻,所以在他看來,程式碼應該優美,給人以愉悅感,Grad也提到程式碼應該像散文一樣優美,讓閱讀的人看完一段想看下一段,能很明顯的展現出解決問題的表達力和張力,閱讀者會不停的發出“啊哈,應該這樣來處理!”的感嘆。反之,如果程式碼不好閱讀,閱讀者看完後還需要猜測所表達的意思,對所實現的功能持懷疑態度,甚至有心驚膽戰的心理,會在心裏不停的反問:"不會吧,這都可以線上上執行?”我們在修改程式碼或寫新程式碼之前都要閱讀周邊程式碼,如果閱讀程式碼很難,則寫程式碼也會很難,據統計讀程式碼和寫程式碼時間比例是10:1,編寫程式碼的難度,取決於讀周邊程式碼的難度。要想幹得快,要想早點做完,要想輕鬆寫程式碼,先讓程式碼易讀吧。
5.程式碼好修改,Dave提到整潔程式碼應該可以讓其他開發者進行增補,也就是很容易進行功能的增加,畢竟很多系統程式碼都要不停的迭代更新,需要基於原始碼進行增補,所以程式碼的易修改就顯得格外的重要,試想如果一個開發者寫的程式碼別人沒法修改或者不敢改,那你說這隱患有多大。我們經常嘴巴提到的系統可維護性,實際上說的更具體點,更多的指的是程式碼的可修改方面。
將以上5點整潔程式碼的畫像總結一句話:
體現設計理念,程式碼不重複,只做一件事,好閱讀和修改!