讀書筆記-乾淨程式碼

Shuyi發表於2019-02-08

這篇博文是我自己的一點讀書筆記。 本篇文章僅適合人類閱讀,外星人請繞路。

這本書改變了我的人生,書名叫 Clean Codes ,翻譯過來應是乾淨程式碼吧。以前以為程式碼要怎麼酷炫怎麼寫,要把程式碼擠到一行,用一些不為人知的函式,做一些很簡單的工作。 工作了以後才知道,誰沒事幹寫斐波那契數列, 算大O, 大 Theta,寫兩極樹。 生產所用的工具,都已經將這些概念具象化了。我們所要的,是如何讓不同的人類和諧地工作在一起,寫出最連貫最統一的程式碼,而且要是日後可以繼續維護,繼續增加功能的程式碼。

很多年前,我們都說 Scale Up, 也就是向上擴大, 跟修樓一樣,就是使勁往軟體裡面同一個區域加程式碼,需要什麼加什麼,但是樓建的太高會垮,而且你需要去修復的時候,要爬上爬下,不小心還會弄垮一整座樓。但是,基礎單一,順著樓梯往下走,就能看懂程式碼在做什麼, 但是也沒有彈性。 現在業界偏向於臥向擴大,在同一個程式碼基礎上,加模組,加類,根據需要,可以隨時熱插拔, 彈性十足。聽起來挺美好的,但是如果多個人在同一個程式碼基礎上,你寫你的,我寫我的,那麼想要去理解,或者修改程式碼就要出問題。因為你無法理解另外一個人腦子在想什麼, 他寫這些函式的意義是什麼,他喜歡如何寫程式碼等等。當你需要參考多個模組的時候,這個問題變得尤其嚴峻。所以, 你經常會看到有人這麼說: Write this [JS圖示] , not this ? 。

所謂乾淨程式碼,就是沒有累贅的,可以讓人看得懂的程式碼。 這裡舉個例子:


function a ($b) {
    return json_encode($b['content']);
}

以上是不乾淨的程式碼,因為你一眼看去,完全不知道他應該幹嘛,以下給兩個乾淨例子:


function getContentJson($payload) {
    return json_encode($payload['content']);
}

function getNeiRongJson($huoWu) {
    return json_encode($huoWu['neiRong']);
}

英文好的,自然寫英文最自然,不過中文可以用拼音代替 (如果你的團隊都是會中文的) 。 函式名字上面交代的很清楚,這個是做 GET 也就是取讀工作的 ( save 或者 Write 是做寫的工作的), Json 說明函式回覆的是 Json , 然後還有寫了謂語, 也就是 內容 (Content), 主謂賓集合。 這個叫做描述化命名 , 是為了讓人類看一眼就知道這個函式是做什麼的,處理什麼的, 輸出什麼的。

我總結了一下,乾淨程式碼有這麼幾個特點:

  1. 有意義的命名。 可以寫 $neiRong, $content, $neiRongWithJson 為什麼要寫 $nr, $ctnDers, $nr_json_yiqi 。 我們寫程式碼的時候老是覺得是給機器讀的,命名如何無所謂。但是當你回過頭來看你自己寫的東西的時候,你就知道你有多麼想敲當初的自己,看了半天還是沒想起來怎麼這麼寫。
  2. 無註釋。這個是我自己比較起來,最好的方法。 因為註釋你需要一隻去更新它, 你稍微不注意, 沒有更新, 註釋就變得無用,甚至還會誤導。 這個理論的關鍵就在於你命名程式碼的能力,如果你一切函式,類和程式碼都是可以當文字讀出來的, 那麼程式碼本身就可以自己註釋自己了。 給個例子 (寫的不完美,別介), 你們看例子是做什麼的?

    class RenLeiTongZhiController {
    public $jiQiRen;
    
    public function tongZhiRenLei (Ren $renLei) : JiQiRen {
        $cleanDeRenLei = $this->cleanRenLei( $renLei); 
    
        $this->deployJiQiRen (); 
    
        $this->jiQiRenTakeOver(); 
    
        return $this->jiQiRen;
    }
    }

    我知道拼音並不是完美的英文替代方案,但是用中英參雜的方式,應該是可以做到很高的閱讀性的。用英文中常用的 With, And, Or 作為介詞或者主語,這樣就可以把拼音分割開來了,做到很高的閱讀性。 這樣不論是誰下次改程式碼的時候,就知道改哪裡,改什麼。

  3. 少點套路,多點真誠, 簡單最美。 我每次寫程式碼的時候,都要再看一遍,能不能寫得再簡單一點。程式碼寫的越簡單越好, 你覺得複雜了,就得把程式碼拆分開來。 很多公司要求你的函式最多不能超過10行,我沒那麼嚴格,我說最多不能超過50行。因為一個函式裡面東西多了,就會開始變得很雜。雜亂的程式碼跟扭成麻花的耳機線一樣令人心煩。人類的臨時儲存腦容量是有限的, 一個函式裡面東西太多,就會產生記憶體溢位的現象,你就忘了你最開始寫的是什麼。 還有一個問題,就是程式碼回收再利用, 你寫一個100行的函式,裡面肯定有個十行十五行是其他地方也要用的,但是你拿不出來啊,拿不出來怎麼辦,那就只好 Ctrl+C , Ctrl+V 。那以後要修改怎麼辦?那就要記住自己用過的地方,一個個地改。那以後繼任的人不知道怎麼辦? 那你要記得,想想你的後任是一個知道你在哪裡住的跟蹤暴躁狂 (出自軟體驅魔這本書)。。。

以上所說的,可能你覺得,就是作者懶,要省時間。但是你也想想,你如果能和團隊更高效地工作,是不是就不用加那麼多班了, 是不是可以用多出來的時候回家吃晚飯,陪陪伴侶,家人還有孩子? 而且是不是能夠讓維護更加輕鬆, 以後老闆在半夜三點或者旅遊的時候告訴你出了個Bug, 你可以很容易找到癥結點,改好,喝口水,繼續嗨。 所以某位大大說過, 程式設計誰都能編,但是寫人類看得懂的程式碼的不多。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

Software Engineer Practices above all
軟體開發標準高於一切

相關文章