Are You Smart Enough To Debug Your Own Code?
算法
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.編程
上面這句話的意思是:調試的難度至關於寫代碼的兩倍。所以,若是你寫出了你自認爲最聰明巧妙的代碼,那麼你將不具有擁有足夠的智商去調試它。根據這段話的意思,咱們不該該去寫出「自做聰明」的代碼,不然的話咱們本身都沒有能力維護。應該寫出淺顯易懂,剛畢業的實習生都能看懂的代碼纔是好代碼。bash
怎麼才能寫出淺顯易懂的代碼就不得不提軟件工程質量度量方法中一個重要的概念——圈複雜度。微信
圈複雜度(Cyclomatic complexity,簡寫CC)也稱爲條件複雜度,是一種代碼複雜度的衡量標準。由托馬斯·J·麥凱布(Thomas J. McCabe, Sr.)於1976年提出,用來表示程序的複雜度。它能夠用來衡量一個模塊斷定結構的複雜程度,數量上表現爲獨立現行路徑條數,也可理解爲覆蓋全部的可能狀況最少使用的測試用例數。編程語言
圈複雜度大說明程序代碼的判斷邏輯複雜,可能質量低且難於測試和維護。有研究代表複雜度和出現缺陷的數量存在強相關性,代表了越複雜的代碼越可能會出錯。函數式編程
圈複雜度衡量的是程序中線性獨立路徑的數量。函數
例如:若是程序中不包含控制、判斷、條件語句,那麼複雜度就是 1,由於整個程序只有一條執行路徑;測試
若是程序包含一條 IF 語句,那麼就會有兩條路徑來執行完整個程序,因此這時候的複雜度就是 2;spa
兩個嵌套的 IF 語句,或者包含兩個判斷條件的一個 IF 語句,複雜度就是 2 * 2 = 4。debug
更加具體的狀況看下圖:
圈複雜度的計算方法
圈複雜度能夠經過程序控制流圖計算,公式爲:V(G) = e + 2 - n
e : 控制流圖中邊的數量
n : 控制流圖中節點的數量
圈複雜度對應程序控制流圖中從起點到全部終點的路徑的條數,因此也能夠經過數路徑的方式得到圈複雜度。
那麼問題來了,咱們如何下降代碼複雜度呢?若是你想寫出易讀且可測試的代碼,可使用可以有效下降代碼複雜度的利器——函數式編程。
咱們已經瞭解了圈複雜度指的是一段程序執行分支的可能性數量。而函數式編程就是儘可能避免使用全部循環語句這種會增長代碼執行分支的語句。函數式編程是一種指導咱們如何編寫程序的方法論,主要思想是把運算過程儘可能寫成一系列嵌套的函數調用。
一種比較極端的觀點任務數學是物理世界的根基,一切問題都是數學問題,世間萬物均可以用數學函數去表示。電腦的運算也能夠視爲數學上的函數計算,因此咱們的代碼其實也均可以概括化簡成爲一系列數學表達式。
函數式編程有要求只用"表達式",不用面向過程的"語句"。表達式和語句的區別是表達式總有一個返回值,而語句表示執行了某種操做。只使用表達式的函數咱們能夠成爲「純函數」,純函數的好處是不論函數被執行多少次,都不會產出任何的反作用,由於它不會去修改中間狀態。
因爲咱們使用函數式編程,咱們就能夠用表達式去代替各類條件判斷語句,從而下降代碼的圈複雜度,使咱們的代碼可讀易測試。在函數式編程語言裏沒有 for 循環,由於這些邏輯意味着有狀態的改變。相替代的是,這種循環邏輯在函數式編程語言裏是經過遞歸、把函數當成參數傳遞的方式,也就是高階函數實現的。
JavaScript雖然在設計的時候不是函數式語言,可是咱們能夠經過 lodash,underscore等方法庫來讓咱們的程序更加函數式。函數式編程是我最爲推崇的有效下降代碼複雜度的編程方法。可是具體關於函數式編程的內容不屬於本篇的範疇,在這裏再也不展開闡述。
除了函數式編程,咱們還能使用一些更爲傳統的方式來下降代碼複雜度。常見的方法有:
提取函數 - 將獨立業務或模塊代碼獨立出來,封裝提煉爲函數,並經過函數名詮釋代碼做用,提升代碼可讀性。當一個函數過於複雜時就應該拆分爲多個負責獨立功能的子函數。
替換算法 - 複雜算法會致使bug可能性的增長及可理解性/可維護性。
合併條件式 - 把複雜的條件表達式,使用函數進行封裝。舉個例子:
if(data.code === 200 && data.id && data.list.length > 2) {
db.insert(data);
} 複製代碼
咱們能夠將條件表達式封裝爲函數:
if(isValidate(data)) {
db.insert(data);
}複製代碼
經過以上這些方法咱們可使本身的代碼保持一個較低的代碼複雜度。在咱們寫代碼的時候咱們記住要讓本身的代碼 Stay Simple Stay Foolish 。一個有助於你記住這個原則的辦法是「寫程序時時刻記着,這個未來要維護你寫的程序的人是一個有嚴重暴力傾向,而且知道你住在哪裏的精神變態者」。
關注微信公衆號查看更多原創內容