《代碼整潔之道》讀書(shū)筆記

轉(zhuǎn)載自公眾號(hào):趣談編程

來(lái)源:zsx躍遷路

作者:試心

讓軟件能工作和讓軟件保持整潔缝龄,是截然不同的工作柒竞,后者需要投入的更多。

大多數(shù)人只能更多地把精力放在讓代碼能工作轻庆,而沒(méi)辦法保持代碼有組織更整潔韧骗。能做到代碼整潔嘉抒,說(shuō)明你已經(jīng)不是一般人了。

本文內(nèi)容主要分以下幾點(diǎn):

1. 什么樣的代碼是整潔的

2. 取個(gè)好名字

3. 讓函數(shù)再整潔一點(diǎn)

4.注釋的好與壞

5. 格式化

6. 異常處理和邊界

7. 整潔的類

1.什么樣的代碼是整潔的

image

如上圖所示袍暴,衡量代碼質(zhì)量的唯一標(biāo)準(zhǔn)些侍,是別人閱讀你代碼時(shí)的感受隶症。

不整潔的代碼,閱讀體驗(yàn)是這樣的:

1.亂(組織亂岗宣,職責(zé)亂蚂会,名稱亂起)

2.邏輯不清晰(if-else 太多)

3.繞彎子(簡(jiǎn)單的事寫的很復(fù)雜)

4.看不懂(只有寫的人能理解)

5.難修改(耦合嚴(yán)重,各種寫死)

整潔的代碼耗式,閱讀體驗(yàn)是這樣的:

1.清晰(是什么胁住,做了什么,一眼看得出來(lái))

2.簡(jiǎn)單(職責(zé)少刊咳,代碼少彪见,邏輯少)

3.干凈(沒(méi)有多余的邏輯)

4.好拓展(依賴的比較少,修改不會(huì)影響很多)

接下來(lái)介紹一些寫整潔代碼的方法娱挨。

2.取個(gè)好名字

先看幾個(gè)壞命名的例子:

image

正如上圖所示余指,壞命名具有這樣的特點(diǎn):

1.使用縮寫(讓使用者誤解其用途)

2.描述性差(通過(guò)命名無(wú)法理解他的作用)

3.相似(使用類似的、難分辨的名稱)

4.使用專業(yè)術(shù)語(yǔ)做名稱容易誤會(huì)跷坝,比如使用 Activity 表達(dá)活動(dòng)酵镜,容易被理解成安卓里的組件

5.需要借注釋解釋,名稱本身就是解釋柴钻,如果還需要借助注釋淮韭,就已經(jīng)說(shuō)明這個(gè)命名有問(wèn)題,對(duì)應(yīng)的類贴届、函數(shù)靠粪、屬性職責(zé)不清晰

好的命名具有這樣的特點(diǎn):

1.名副其實(shí)

閱讀名稱就知道它為什么存在做什么事毫蚓、應(yīng)該怎么用庇配,如果需要通過(guò)注釋來(lái)回答,那就不算名副其實(shí)

2.不容易混淆

避免使用非常相似的名稱绍些,尤其是類型還相同,比如小寫 l 和1耀鸦、o 和 0柬批、專有名詞

3.讀的出來(lái)

不要因?yàn)楹ε旅Q過(guò)長(zhǎng)而使用縮寫,那樣不便于和別人討論

4.方便搜索

名稱長(zhǎng)度和其作用范圍成正比袖订,作用范圍比較大的氮帐,長(zhǎng)名稱也可以,只要能表達(dá)清楚

3.讓函數(shù)再整潔一點(diǎn)

1.函數(shù)的第一要?jiǎng)t:短小 (多短才算可以洛姑?不超過(guò) 10 行上沐,縮進(jìn)層級(jí)不該大于兩層) **

2.只做一件事 (要判斷函數(shù)是否做了不止一件事,就看它里面的代碼楞艾,是否能再拆出一個(gè)函數(shù)

3.函數(shù)變大的頭號(hào)兇手:switch 語(yǔ)句

switch 語(yǔ)句天生要做多件事参咙,我們能做的龄广,就是減少 switch 語(yǔ)句的次數(shù),把它埋藏在較低的抽象層級(jí)蕴侧,同時(shí)不重復(fù)使用 switch

如果有類似的 switch 出現(xiàn)多次择同,就要考慮使用多態(tài)來(lái)減少 switch 語(yǔ)句出現(xiàn)的次數(shù)

4.定義的函數(shù)的參數(shù)越多,你耗費(fèi)函數(shù)使用者的青春就越多净宵,使用者需要花時(shí)間搞清楚每個(gè)參數(shù)的具體含義和順序

最理想的參數(shù)數(shù)量是1~2

從測(cè)試的角度看敲才,參數(shù)越多,可能出現(xiàn)的用例就越多择葡,就越容易出錯(cuò)

保持參數(shù)列表短小的方法: 參數(shù)升為全局變量紧武、多個(gè)參數(shù)封裝成一個(gè)類

5.不要有副作用(副作用就是做了名稱以外的工作

6.Android Studio 提供了 Refactor Extract ,幫助我們做代碼拆分

image

4.注釋的好與壞

在這些場(chǎng)景下敏储,使用注釋比較好:

1.彌補(bǔ)代碼表達(dá)意圖的失敗

代碼本身無(wú)法說(shuō)明意圖阻星,這時(shí)使用注釋,說(shuō)明這段代碼需要被修改

2.提供信息

提供代碼以外的信息虹曙,比如產(chǎn)品相關(guān)信息

3.復(fù)雜實(shí)現(xiàn)的 簡(jiǎn)要概括

讓閱讀者快速了解某個(gè)復(fù)雜的系統(tǒng)

4.警示迫横、提醒

比如某個(gè)不起眼的代碼是為了解決某個(gè) bug,防止別人誤刪

5.TODO

IDE可以定位 TODO 注釋酝碳,我們需要定期查看這些注釋矾踱,刪除不再需要的,讓代碼整潔

這些注釋是壞注釋:

1.令人費(fèi)解的注釋

讀懂花費(fèi)的時(shí)間比看代碼的時(shí)間還長(zhǎng)疏哗,差評(píng)

2.誤導(dǎo)性注釋呛讲,老舊的注釋

代碼才是真相,注釋有可能是謊言返奉,還是要”少寫注釋贝搁!“

3.日志型注釋

比如記錄修改日志,放到 git commit 日志里吧

4.廢話注釋

變量名芽偏、函數(shù)名已經(jīng)很清晰雷逆,就不需要注釋,注釋里不要放一些奇怪的東西污尉,比如如來(lái)佛祖

5.注釋掉的代碼

沒(méi)用的代碼及時(shí)刪除

別給糟糕的代碼寫注釋膀哲,重構(gòu)!

5.格式化 Coding Style

1.團(tuán)隊(duì)最好統(tǒng)一格式化標(biāo)準(zhǔn)

那樣就可以避免某人只修改了一點(diǎn)被碗,但順手格式化了一下某宪,整個(gè)類都產(chǎn)生了變動(dòng),那樣會(huì)覆蓋真正的提交日志锐朴。

2.一行代碼列數(shù)不超過(guò) 100

Android Studio 里的豎線默認(rèn)是 100兴喂,不要超過(guò)這條線。

3.代碼抽象層級(jí)逐漸遞減

最頂應(yīng)該給出高層次概念和算法,向下逐漸展開(kāi)細(xì)節(jié)衣迷。

4.用好空行

每個(gè)空行代表思路的重新開(kāi)始畏鼓,用空白行隔開(kāi)思路和不同作用的代碼,和寫文章一樣蘑险,及時(shí)分段滴肿。

5.物以類聚

關(guān)系密切的代碼應(yīng)該靠近。

6.異常處理和邊界

1.使用異常替代返回錯(cuò)誤碼

image

2.抽離錯(cuò)誤處理

如果錯(cuò)誤處理很重要的話佃迄,可以考慮把錯(cuò)誤處理單獨(dú)放到一個(gè)方法里泼差。

image

3.盡量不要返回 null

返回空對(duì)象好于返回 null,盡可能的避免空指針的出現(xiàn)呵俏。

4.慎用 CheckedException

定義異常時(shí)堆缘,要考慮它會(huì)被如何捕獲。CheckedException 如果不處理普碎,就得強(qiáng)制拋出去吼肥,那樣會(huì)影響所有調(diào)用鏈。

邊界:

1.處理邏輯前麻车,優(yōu)先處理邊界和異常

2.快速了解某個(gè)框架的邊界

在使用的框架代碼里使用關(guān)鍵字 throw new 進(jìn)行搜索缀皱,看看什么情況下會(huì)拋出什么異常,最后整理出來(lái)动猬。

3.創(chuàng)建邊界代碼啤斗,隔離第三方

使用我們控制不了的代碼時(shí),必須加倍小心赁咙,確保未來(lái)修改的代碼不會(huì)太大钮莲。

創(chuàng)建邊界代碼,隔離第三方彼水,避免我們的代碼對(duì)第三方框架內(nèi)部了解過(guò)多崔拥。

7.整潔的類

整潔的類應(yīng)該具有以下特點(diǎn):

1.職責(zé)少,等于短小

評(píng)價(jià)類職責(zé)的多少凤覆,看它對(duì)外暴露的方法個(gè)數(shù)链瓦,多于 5 個(gè)就可以拆分了。

2.只有一條被修改的理由

根據(jù)單一職責(zé)原則盯桦,類應(yīng)該只有一條被修改的理由澡绩。

3.隔離改變

依賴抽象而非具體;減少對(duì)外暴露公有變量俺附,使用 getter 代替。

4.拆分不是壞事

有同學(xué)可能會(huì)擔(dān)心了:拆分類太多會(huì)不會(huì)更復(fù)雜了溪掀?

image

假如你有很多東西事镣,是希望根據(jù)分類放放到不同的小抽屜格子里,還是希望一起放到幾個(gè)大抽屜里?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末璃哟,一起剝皮案震驚了整個(gè)濱河市氛琢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌随闪,老刑警劉巖阳似,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異铐伴,居然都是意外死亡撮奏,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門当宴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)畜吊,“玉大人,你說(shuō)我怎么就攤上這事户矢×嵯祝” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵梯浪,是天一觀的道長(zhǎng)捌年。 經(jīng)常有香客問(wèn)我,道長(zhǎng)挂洛,這世上最難降的妖魔是什么礼预? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮抹锄,結(jié)果婚禮上逆瑞,老公的妹妹穿的比我還像新娘。我一直安慰自己伙单,他們只是感情好获高,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著吻育,像睡著了一般念秧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上布疼,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天摊趾,我揣著相機(jī)與錄音,去河邊找鬼游两。 笑死砾层,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贱案。 我是一名探鬼主播肛炮,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了侨糟?” 一聲冷哼從身側(cè)響起碍扔,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎秕重,沒(méi)想到半個(gè)月后不同,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡溶耘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年二拐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汰具。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卓鹿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出留荔,到底是詐尸還是另有隱情吟孙,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布聚蝶,位于F島的核電站杰妓,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏碘勉。R本人自食惡果不足惜巷挥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望验靡。 院中可真熱鬧倍宾,春花似錦、人聲如沸胜嗓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)辞州。三九已至怔锌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間变过,已是汗流浹背埃元。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留媚狰,地道東北人岛杀。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像崭孤,于是被迫代替她去往敵國(guó)和親类嗤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子衫生,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 序,前言 重視代碼facebook把code review作為重點(diǎn)KPI考核土浸,并采用連坐制。code wins a...
    高稷閱讀 2,464評(píng)論 0 4
  • --第三章 函數(shù) 函數(shù)只做一件事情彭羹,要盡量短小編寫函數(shù)畢竟是為了把大一些的概念拆分為另一個(gè)抽象層上的一系列步驟要判...
    Alexzqq閱讀 487評(píng)論 0 0
  • 優(yōu)秀的軟件設(shè)計(jì)黄伊,大都關(guān)乎分隔——?jiǎng)?chuàng)建合適的空間放置不同種類的代碼,對(duì)關(guān)注面的分隔讓代碼更易于理解和維護(hù)派殷。 1.命名...
    漂泊的胡蘿卜閱讀 313評(píng)論 0 1
  • 前言 這本書(shū)的封面寫道还最,“細(xì)節(jié)之中自有天地,整潔成就卓越代碼”毡惜,便是本書(shū)的精髓所在拓轻。對(duì)于軟件開(kāi)發(fā),設(shè)計(jì)不僅存在于界...
    含笑小基石閱讀 488評(píng)論 0 0
  • 二氧化碳培養(yǎng)箱是一種通過(guò)在培養(yǎng)箱箱體內(nèi)模擬形成類似于在生物體內(nèi)的生長(zhǎng)環(huán)境经伙,來(lái)對(duì)細(xì)胞扶叉、組織、細(xì)菌進(jìn)行體外培養(yǎng)的設(shè)備帕膜。...
    背道而馳_13fe閱讀 879評(píng)論 0 0