Clean Code

第一章 整潔代碼

1喇嘱、整潔代碼只做好一件事
2茉贡、推崇小塊代碼
3、沒有重復(fù)代碼(有意義的命名+方法功能不要太多)
4者铜、代碼讀的輕松腔丧,小規(guī)模抽象
5、明確才是王道

第二章 有意義的命名

1作烟、命名要名副其實愉粤,盡量不要使用List,用Groups或者Accounts(名詞復(fù)數(shù)形式)表示
2拿撩、名稱長短應(yīng)與其作用域大小相對應(yīng)
3衣厘、類名和對象名應(yīng)該是名詞短語
4、方法名應(yīng)該是動詞短語
5压恒、可以添加有意義的語境

第三章 函數(shù)

1影暴、函數(shù)應(yīng)該做一件事,做好這件事探赫,只做這一件事型宙。
2、每一個函數(shù)一個抽象層級伦吠。
3妆兑、switch 語句天生要做N件事,我們可以創(chuàng)建多態(tài)對象讨勤,而且隱藏在某個繼承關(guān)系中箭跳。
if ... else if ... else if ... else等結(jié)構(gòu)需要進(jìn)行一層抽象,提取出公共接口潭千,然后生成對象數(shù)組進(jìn)行多態(tài)調(diào)用谱姓,將分支結(jié)構(gòu)轉(zhuǎn)化為循環(huán)結(jié)構(gòu))
4刨晴、函數(shù)參數(shù)最理想是零屉来,當(dāng)有三個及三個以上參數(shù)時,需要考慮是否將其中一些參數(shù)封裝成類狈癞。
5茄靠、向函數(shù)傳入布爾值簡直是駭人聽聞,函數(shù)將不止做一件事蝶桶,true時這樣做慨绳,false時那樣做。
6、使用異常代替返回錯誤碼脐雪,避免更深層次的嵌套結(jié)構(gòu)厌小。
7、抽離Try/catch代碼塊战秋,Try/catch代碼塊破壞原來代碼結(jié)構(gòu)璧亚,將錯誤處理和正常流程混為一談,需要另外形成函數(shù)脂信。(錯誤處理就是一件事
8癣蟋、別重復(fù)自己

第四章 注釋

1、盡量用代碼而不用注釋來闡述
2狰闪、注釋可以是提供信息的注釋疯搅,如正則表達(dá)式匹配字符
3、注釋可以是對意圖的解釋
4尝哆、注釋可以用來進(jìn)行警告
5秉撇、//TODO注釋放置要做的工作列表

第五章 格式

1、垂直格式秋泄,需要向報紙學(xué)習(xí)
2琐馆、垂直方向上的間隔可以很好的隔開概念
3、關(guān)系密切應(yīng)該相互靠近恒序,變量聲明應(yīng)盡可能靠近其使用位置
4瘦麸、實體變量放置在類的頂部聲明
5、相關(guān)函數(shù)應(yīng)將其放置在一起歧胁,調(diào)用者應(yīng)盡可能放在被調(diào)用者的上面滋饲;這樣函數(shù)聲明總會再其調(diào)用后很快出現(xiàn)
6、概念相關(guān)應(yīng)該放在一起喊巍,相關(guān)性建立在直接依賴的基礎(chǔ)上屠缭,如函數(shù)間調(diào)用或函數(shù)使用某個變量

第六章 對象與數(shù)據(jù)結(jié)構(gòu)

1、使用數(shù)據(jù)結(jié)構(gòu)代碼便于在不改動既有的數(shù)據(jù)結(jié)構(gòu)的前提下添加新函數(shù)崭参,難以添加新的數(shù)據(jù)結(jié)構(gòu)(必須修改所有函數(shù))呵曹;
使用面向?qū)ο?/strong>代碼便于在不改動既有函數(shù)的前提下添加新類,難以添加函數(shù)(必須修改所有類)何暮。
2奄喂、對于面向?qū)ο筝^難的事,對于過程式代碼卻比較容易海洼,反之亦然跨新。
3、The Law of Demeter:

  • 模塊不應(yīng)了解它所操作對象的內(nèi)部情形坏逢,**對象隱藏數(shù)據(jù)域帐,暴露操作赘被。
  • Handler類的方法f()只應(yīng)該調(diào)用以下對象的方法:

Handler
f創(chuàng)建的對象
作為參數(shù)傳遞給f的對象
Handler的實體變量持有的對象

4、最為精煉的數(shù)據(jù)結(jié)構(gòu)是只有一個公共變量俯树、沒有函數(shù)的類帘腹。這種數(shù)據(jù)結(jié)構(gòu)被稱為數(shù)據(jù)傳送對象,DTO(Data Transfer Objects)
5许饿、對象暴露行為,隱藏數(shù)據(jù)舵盈。

  • 便于添加新對象類型而無需修改既有行為陋率,同時也難以在既有對象中添加新行為。
    數(shù)據(jù)結(jié)構(gòu)秽晚。
    數(shù)據(jù)結(jié)構(gòu)暴露數(shù)據(jù)瓦糟,沒有明顯的行為。
  • 便于向既有數(shù)據(jù)結(jié)構(gòu)添加新行為(新函數(shù))赴蝇,同時也難以向既有函數(shù)添加新數(shù)據(jù)結(jié)構(gòu)菩浙。

第七章 錯誤處理

1、使用不可控異常
2句伶、依調(diào)用者需要定義異常類劲蜻,需要考慮如何被捕獲
3、將第三方API打包是個良好的時間手段
4考余、特例模式:創(chuàng)建一個類或配置一個對象先嬉,用來處理特例,可將異常行為封裝到特例對象中
5楚堤、別返回null值疫蔓,方法返回null可以拋出異常或者返回特例對象
6身冬、別傳遞null
7衅胀、錯誤處理隔離看待,獨立于主要邏輯酥筝,就能寫出強(qiáng)固而整潔的代碼

第八章 邊界

1滚躯、建議不要將Map(或在邊界上的其他接口)在系統(tǒng)中傳遞,如果使用類似Map的邊界接口樱哼,就把他保留在類或者近親類中哀九。
2、學(xué)習(xí)log4j

第九章 單元測試

1搅幅、TDD三定律:

  • 定律一:在編寫不能通過單元測試前阅束,不可編寫生產(chǎn)代碼
  • 定律二:只可編寫剛好無法通過的單元測試,不能編譯也算不通過
  • 定律三:只可編寫剛好足以通過當(dāng)前失敗測試的生產(chǎn)代碼

2茄唐、F.I.R.S.T.:快速(fast)息裸、獨立(independence)蝇更、可重復(fù)(repeatable)、自足驗證(self-validating)呼盆、及時(timely)

第十章 類

1年扩、類應(yīng)該短小,有單一權(quán)責(zé)原則(Single Responsibility Principle访圃,SRP)厨幻,類或模塊應(yīng)有且只有一條加以修改的理由。
2腿时、如果一個類的每個變量都被每個方法所使用况脆,則該類具有最大的內(nèi)聚性∨悖——內(nèi)聚性高
3格了、如果函數(shù)想要共享某些變量,應(yīng)該讓他們擁有自己的類徽鼎。故當(dāng)類喪失內(nèi)聚性時盛末,就應(yīng)該拆分類
4、通過降低連接度否淤,就遵循了一條類設(shè)計原則——依賴倒置原則(Dependency Inversion Principe)悄但。本質(zhì)而言,DIP認(rèn)為類應(yīng)當(dāng)依賴于抽象而不是依賴于具體的細(xì)節(jié)叹括。(減少耦合)

第十一章 系統(tǒng)

1算墨、軟件系統(tǒng)應(yīng)將起始過程與起始過程之后的運行邏輯分離開。
2汁雷、main函數(shù)創(chuàng)建系統(tǒng)所需的對象净嘀,在傳遞給應(yīng)用程序,應(yīng)用程序只管使用侠讯。依賴箭頭都是從main函數(shù)向外走挖藏,這表明應(yīng)用程序?qū)ain或者構(gòu)造過程一無所知。
3厢漩、使用抽象工廠模式讓應(yīng)用程序自行控制何時創(chuàng)建對象膜眠,但構(gòu)造細(xì)節(jié)卻隔離于應(yīng)用程序代碼之外。
4溜嗜、控制反轉(zhuǎn)(Inversion of Control宵膨,IoC)將第二權(quán)責(zé)從對象中拿出來,轉(zhuǎn)移到另一個專注于此的對象中炸宵,從而遵循了單一權(quán)責(zé)原則辟躏。
5、延后初始化的好處:

  • DI(Dependency Injection)容器在需要對象之前并不構(gòu)造對象土全。
  • 許多這類容器提供調(diào)用工廠或構(gòu)造代理的機(jī)制捎琐,而這種機(jī)制可為延遲賦值或類似的優(yōu)化處理所用会涎。

6、通過方面式的手段切分關(guān)注面瑞凑,用測試驅(qū)動系統(tǒng)架構(gòu)末秃。

第十三章 并發(fā)編程

1、并發(fā)防御原則:

  • 單一權(quán)責(zé)原則(SRP):分離并發(fā)相關(guān)代碼和其他代碼籽御。
  • 限制數(shù)據(jù)作用域:謹(jǐn)記數(shù)據(jù)封裝练慕,嚴(yán)格限制對可能被共享的數(shù)據(jù)的訪問。
  • 使用數(shù)據(jù)復(fù)本:從多個線程收集所有復(fù)本的結(jié)果技掏,并在單個線程中合并這些結(jié)果贺待。
  • 線程應(yīng)盡可能地獨立:嘗試架構(gòu)數(shù)據(jù)分解到可被獨立線程(可能在不同處理器上)操作的獨立子集。

2零截、幾種執(zhí)行模型


基礎(chǔ)定義
  • 生產(chǎn)者-消費者模型:生產(chǎn)者與消費者之間隊列是一種限定資源。
  • 讀者-作者模型:需提供合理的吞吐量
  • 宴席哲學(xué)家
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秃臣,一起剝皮案震驚了整個濱河市涧衙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奥此,老刑警劉巖弧哎,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異稚虎,居然都是意外死亡撤嫩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門蠢终,熙熙樓的掌柜王于貴愁眉苦臉地迎上來序攘,“玉大人,你說我怎么就攤上這事寻拂〕痰欤” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵祭钉,是天一觀的道長瞄沙。 經(jīng)常有香客問我,道長慌核,這世上最難降的妖魔是什么距境? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮垮卓,結(jié)果婚禮上垫桂,老公的妹妹穿的比我還像新娘。我一直安慰自己扒接,他們只是感情好伪货,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布们衙。 她就那樣靜靜地躺著,像睡著了一般碱呼。 火紅的嫁衣襯著肌膚如雪蒙挑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天愚臀,我揣著相機(jī)與錄音忆蚀,去河邊找鬼。 笑死姑裂,一個胖子當(dāng)著我的面吹牛馋袜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播舶斧,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼欣鳖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了茴厉?” 一聲冷哼從身側(cè)響起泽台,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎矾缓,沒想到半個月后怀酷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡嗜闻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年蜕依,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琉雳。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡样眠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出咐吼,到底是詐尸還是另有隱情吹缔,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布锯茄,位于F島的核電站厢塘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏肌幽。R本人自食惡果不足惜晚碾,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望喂急。 院中可真熱鬧格嘁,春花似錦、人聲如沸廊移。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至懂诗,卻和暖如春蜂嗽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背殃恒。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工植旧, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人离唐。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓病附,卻偏偏與公主長得像,于是被迫代替她去往敵國和親亥鬓。 傳聞我的和親對象是個殘疾皇子完沪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354