第一章 整潔代碼
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ǎn)者-消費者模型:生產(chǎn)者與消費者之間隊列是一種限定資源。
- 讀者-作者模型:需提供合理的吞吐量
- 宴席哲學(xué)家