如何定義“好”代碼

1.常用標準

好這個字太抽象,沒辦法直接用來衡量代碼。 必須找幾個稍微具體的次。 這類詞有很多。比如:靈活性、可擴展性、可維護性、可讀性、可理解性、易修改性、可複用性、可測試性、模塊化、高內聚低耦合、高效、高性能、安全性、兼容性、易用性、整潔、清晰、簡單、直接、少即是多、文檔詳盡、分層清晰、正確性、健壯性、魯棒性、可用性、可伸縮性、穩定性、優雅……

其實衡量代碼的詞,大致可以歸歸類。 有的詞過於籠統、抽象, 比較偏向於整體的描述, 比如:優雅、好、壞、整潔、清晰等。 有的過於細節、偏重方法論, 比如模塊化、高內聚低耦合、文檔詳盡、分層清晰等。 有的可能不僅僅限於編碼本身, 跟架構設計也有關係, 比如:可伸縮性、可用性、穩定性等。

爲了便於學習,我們抽取比較中間的詞。其實這些詞也是最常用的、最重要的衡量好壞標準的詞:可維護性、可讀性、可擴展性、靈活性、簡潔性、可複用性、可測試性。

2. 可維護性

討論可維護性, 首先我們需要知道,維護代碼都需要做哪些事兒。其實維護代碼就是:修改BUG、修改老代碼、添加新特性之類的工作。所以, “代碼易維護”就是指:在不破壞原有代碼的設計、不引入新BUG的情況下,能夠快速修改或者添加代碼。所謂“代碼不易維護”就是指,修改或者添加代碼需要冒極大的引入新BUG的風險,並且需要花很長的時間才能完成。

我們知道,對於一個項目來講,維護代碼的時間遠遠大於編寫代碼的時間。工程師大部分的時間可能都花在修修BUG,改改老代碼的功能邏輯, 添加一些新的功能邏輯的工作上。 所以代碼的可維護性就格外重要。

其實,可維護性還是比較抽象的一個詞。影響代碼可維護性的因素挺多。 代碼的可讀性好、簡潔、可擴展性好,就會使得代碼易維護。 如果代碼分層清晰、模塊化好、高內聚低耦合、面向接口編程等,也就意味着代碼易維護。
除此之外, 易維護性還跟項目的代碼量多少、業務的複雜性、利用到的技術的複雜程度、文檔是否全面、團隊成員的開發水平等因素有關。

所以正面去分析一個代碼是否易維護比較有難度。我們可以從側面給出一個主觀但又比較準確的感受。 如果BUG容易修復,修改、新增功能能輕鬆完成,那我們就主觀的認爲代碼對我們來講是易維護的。 相反:如果修改一個BUG,修改、添加一個功能,需要花費很長的時間,很容易引入新的BUG。 那我們就主觀的認爲,這個代碼對我們來講是不易維護的。

2. 可讀性

軟件設計大師 Martin Fowler曾經說過:“Any fool can write code that a computer can understand. Good programmers write code that humans can understand.
代碼的可讀性是評價代碼質量最重要的指標之一。 我們在編寫代碼的時候,要時刻考慮代碼是否易讀、易理解。 可讀性是其它特性的基礎, 失去了可讀性, 那就談不上易維護了。
如何評價一段代碼是否滿足可讀性呢? 我們需要看代碼是否符合編碼規範、命名是否注意、註釋是否詳盡、是否滿足高內聚低耦合等等。 你可能也感受到了,正面描述一個代碼是否滿足可讀性也很難。 實際上 code review 是很好的測驗代碼可讀性的手段。 看看 code review 的人能不能輕鬆讀完這部分代碼, 還是會不停的說:“TMD, 居然這樣寫”。

3. 可擴展性

可擴展性也是一個評價代碼質量非常重要的標準。它表示我們的代碼應對未來需求變化的能力。跟可讀性一樣,代碼是否易擴展也很大程度上決定代碼是否易維護。
代碼的可擴展性表示,我們在不改變或少量改變原有代碼的情況下,通過擴展的方式添加新的功能代碼。說直白點,代碼預留了一些功能擴展點,你可以吧新功能代碼,直接插到擴展點上,而不需要因爲要添加一個功能而大動干戈,改動大量的原始代碼。

4. 靈活性

靈活性是比較抽象的一個詞,不太好一句話下定義。下面只能舉幾個場景。
(1)當我們添加一個新的功能代碼的時候,原有的代碼已經預留好了擴展點,我們不需要修改原有的代碼,只要在擴展點上添加新的代碼即可。這一點,其實和可擴展性是一樣的。
(2)當我們要實現一個功能的時候,發現原有代碼中,已經抽象出了很多底層可以複用的模塊、類等代碼,我們可以拿來直接使用。這個時候,我們除了可以說代碼易複用外,還可以說代碼寫得靈活。
(3)當我們使用某組接口的時候,如果這組接口可以應對各種使用場景,滿足各種不同的需求,我們除了可以說接口易用之外,還可以說這個接口設計的靈活。

5. 簡潔性

有一條非常著名的設計原則,KISS:Keep It Simple, Stupid. 這個原則說的意思就是,儘量保持代碼簡單。代碼簡單、邏輯清晰,也就意味着易讀、易維護。
思從深而行從簡,真正的高手能雲淡風輕地用最簡單的方法解決最複雜的問題。 這也是編程老手跟編程新手的本質區別之一。

6. 可複用性

可複用性可以簡單的理解爲,儘量減少重複代碼,複用已有的代碼。 繼承、多態的一個目的就是爲了提高代碼的可複用性。很多的設計原則、設計模式都是爲了減少重複,增加複用性。代碼的可複用性跟DRY(Don’t Repeat Yourself)關係很緊密。

7. 可測試性

代碼是否容易寫單元測試。

發佈了33 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章