一蠢涝、類
- 類從變量開始玄呛,公共靜態(tài)常量-->私有靜態(tài)變量-->私有實體變量,公共函數(shù)應(yīng)跟在變量列表之后和二。
- 類要短小把鉴,職責(zé)單一,每個類有且只有一條加以修改的理由儿咱。不能起含義模糊的詞庭砍,如Processor,Manager混埠,Super等怠缸。
- 高內(nèi)聚。類中的每一個方法都應(yīng)該操作一個或多個實體變量钳宪。保持函數(shù)和參數(shù)列表的短小揭北。
- 將容易發(fā)生變化的細節(jié)隔離,使用接口和抽象類吏颖。類應(yīng)該依賴于抽象搔体,而不是具體細節(jié)。
二半醉、系統(tǒng)
- 系統(tǒng)的構(gòu)造和使用分開疚俱。即將系統(tǒng)的啟動過程和啟動后運行時的邏輯分開。
- 使用工廠模式缩多、依賴注入將創(chuàng)建對象隔離呆奕。
- 最佳的系統(tǒng)架構(gòu)由模塊化的關(guān)注面領(lǐng)域組成(模塊化+關(guān)注領(lǐng)域切分)养晋,每個關(guān)注面均用純java(或其他語言)對象實現(xiàn)。不同的領(lǐng)域之間用最不具有侵害性的方面或類方面工具整合起來梁钾。這種架構(gòu)能測試驅(qū)動绳泉。
- 系統(tǒng)需要領(lǐng)域特定語言。領(lǐng)域特定語言允許所有抽象層級和應(yīng)用程序中的所有領(lǐng)域姆泻,從高級策略到底層細節(jié)零酪,使用pojo表達。
- 在所有抽象層級上拇勃,意圖都應(yīng)該清晰可辨四苇。
- 遵循簡單設(shè)計原則:(1)運行所有測試 (2)不可重復(fù)(3)表達程序員的意圖(4)盡可能減少類和方法的數(shù)量(5)以上規(guī)則按照其重要程度排列
- 規(guī)則1:TDD。
- 規(guī)則2~4: 重構(gòu)潜秋,提高內(nèi)聚蛔琅,降低耦合胎许,減少重復(fù)峻呛。
三、并發(fā)編程
- 分離并發(fā)相關(guān)代碼和其他代碼辜窑。
- 嚴格限制對可能被共享的數(shù)據(jù)的訪問钩述。
- 盡量縮小同步范圍。
- 偶發(fā)事件的錯誤一定要重視穆碎,并定位問題嘗試解決牙勘。
- 再創(chuàng)建多線程時,一定要確保非線程代碼可工作且無bug所禀。
- 線程代碼需要在不同操作系統(tǒng)平臺上進行測試方面,不同操作系統(tǒng)之間具有差異性。
四色徘、代碼味道
- 注釋中不應(yīng)該存在不恰當(dāng)信息恭金,冗余注釋,同時注釋保持簡潔褂策,字斟句酌横腿。注釋掉的代碼就直接刪除
- 系統(tǒng)構(gòu)建應(yīng)該由單個命令逐步構(gòu)建,構(gòu)建過程不應(yīng)該需要一系列神秘指令或者環(huán)境依賴腳本來構(gòu)建單個元素斤寂。
- 系統(tǒng)構(gòu)建時耿焊,單個指令就可以運行全部單元測試。
- 函數(shù)不得超過3個入?yún)ⅰ?/li>
- 如果函數(shù)非要修改某個東西的狀態(tài)遍搞,就修改他的對象狀態(tài)罗侯。
- 布爾參數(shù)作為flag去控制函數(shù)做不同的事,這種參數(shù)應(yīng)該消滅溪猿。
- 永遠不會被調(diào)用的函數(shù)應(yīng)該被刪除歇父。
- 明顯的行為未被實現(xiàn)蒂培,應(yīng)修改函數(shù)行為。
- 不應(yīng)該忽視代碼中任何一個警告榜苫。雖然關(guān)閉警告有助于構(gòu)建成功护戳,但會陷入無窮無盡的調(diào)試和錯誤的風(fēng)險。
- 不要出現(xiàn)重復(fù)代碼垂睬,重復(fù)代碼可以結(jié)合實際情況媳荒,使用多態(tài),if/else, switch/case, 模板方法和策略方式解決驹饺。
- 創(chuàng)建分離較高層級一般性概念與較低級層級細節(jié)概念的抽象模型钳枕。創(chuàng)建抽象類來容納較高層級概念,創(chuàng)建派生類來容納較低層級概念赏壹,確保分離完整鱼炒。所有較低層級概念放在派生類中,所有較高層級概念放在基類中蝌借。例如:只與細節(jié)實現(xiàn)實現(xiàn)有關(guān)的常量昔瞧、變量和工具函數(shù)不應(yīng)該放在基類中出現(xiàn)∑杏樱基類應(yīng)該對這些一無所知自晰。
- 類中方法越少越好,函數(shù)知道的變量越少越好稍坯,類擁有的實體變量越好越好酬荞。隱藏數(shù)據(jù),工具函數(shù)瞧哟,常量混巧,臨時變量,不要創(chuàng)建擁有大量方法和大量實體變量的類勤揩。不要為子類創(chuàng)建大量受保護變量和函數(shù)咧党。盡量保持接口緊湊,通過限制信息來控制耦合度雄可。
- 本地變量應(yīng)該正好在其首次被使用的位置上面聲明凿傅,私有函數(shù)應(yīng)該正好在其首次被調(diào)用的位置下面定義。垂直距離要短数苫。
- 變量名聪舒,方法名取名要前后一致。如方法processValidationRequest虐急,下一個方法應(yīng)該取類似名字箱残。
- 代碼應(yīng)具有強有力的表達力。
- 通常應(yīng)該傾向于選用非靜態(tài)方法,如果有疑問被辑,就是用非靜態(tài)函數(shù)燎悍。如果的確需要靜態(tài)函數(shù),確保沒有機會打算讓它有多態(tài)行為盼理。
- 拒絕magic number谈山。
- 避免否定性條件。
- 每個函數(shù)只做一件事宏怔。
- 不要繼承常量奏路,需要多處使用的常量應(yīng)放在單獨的class中,使用靜態(tài)導(dǎo)入臊诊。
- 采用描述性名稱鸽粉。
- 方法,變量的命名應(yīng)符合抽象層級抓艳。
- 使用測試覆蓋工具触机,別略過小測試。
- 當(dāng)發(fā)現(xiàn)某個函數(shù)有bug時玷或,最好能編寫多個測試case來盡可能的全面測試儡首。有可能會發(fā)現(xiàn)bug不只一個。
- 竭盡所能使每一個測試速度夠快庐椒。