Clean Code 無瑕的程式碼 第11章 系統
第十一章非常非常重要!內容有難度作者談到了系統,讀者要對java有一定層度的了解,才能完全明白第十一章的內容,我對Java不熟,在網路上找了一些文章,勉強知道部分內容。
你要如何建造一個城市?
作者用城市比喻軟體,城市如同系統軟體有很多區域,每個區域有各自的功能。
劃分系統的建造與使用
「建造」與「使用」應該要分開,如同蓋房子與住房子是兩件不同的事情。
大部分的城市卻沒有把兩件事情分開,出現延遲初始的情況。
public Service getService(){
if(service == null)
service = new MyServiceImpl(....);
return service;
}
上面的例子包含了延遲初始/延遲賦質(LAZY Initialization/Evaluation)
延遲初始/延遲賦質寫法的優點
要使用的時候,再建立物件
初始化時間變短
保證函式不回回傳null
延遲初始/延遲賦質寫法的缺點
相依於MyServiceImpl,等於程式寫死
測試會較困難
違反單一職掌原則
作者主張「建造的過程」要從「正常邏輯」分離出來。
主函式Main的劃分
最簡單的方法將「建造程式」都移到主函式main或主函式呼叫的模組builder。
11-1的圖寫明了順序
1.build 先new 物件
2.再run程式
工廠
第一種方法是建立好物件可當做參數傳給應用程式。有時候應用程式要負責「何時」要產生物件,此時可用抽象工廠模式。
11-2 應用程式要用LineItem物件的時候,呼叫工廠建造程式可以得到物件。
相依性注入
這段內容談到相依性注入、控制反轉。可參考王洪亮先生的著作《我的程式碼會說話》7.2 相依性注入
相依性注入的另外一個名字控制反轉,這種方式實現了程式碼的熱插拔。採用相依性注入,可以透過 xml 來配置名稱和運算,進行更自由的擴展。
我的理解是程式建立物件的過程中,可以讀取外部xml創建物件。xml可以更改,程式就不會寫死變得有彈性。
這篇文章寫得淺顯易懂
擴大
小城市起初在興建的時候不會考慮到以後會不會變成大城市,同樣的情況小程式起初不會考慮未來會不會變成大程式。
保持適當的關注點分離,軟體系統的架構就能夠遞增地成長。
說人話就是要想辦法降低軟體與軟體之間的相依性,軟體才可以擴展與重複使用。
橫切關注點
Java代理機制
看文中的圖就能明白Java代理的奧妙,第十一章後半段講述的AOP剖面設計都在做類似的事情,差別在於方法不同。
平常寫程式的時候寫log就直接加上去,實際上除錯程式都是對原本商業程式的「破壞」,這段程式變得無法再利用,也會造成不利於測試驅動開發,AOP要解決程式被「破壞」的問題。
純Java AOP 框架
AspectJ 剖面設計
測試驅動的系統架構
最佳化決策
聰明地利用可明顯增加價值的標準
系統需要特定領域的語言
總結
留言
張貼留言