Clean Code 無瑕的程式碼 第11章 系統(tǒng)
? ?? ? 第十一章非常非常重要!內(nèi)容有難度作者談到了系統(tǒng),讀者要對(duì)java有一定層度的了解,才能完全明白第十一章的內(nèi)容,我對(duì)Java不熟,在網(wǎng)路上找了一些文章,勉強(qiáng)知道部分內(nèi)容。
你要如何建造一個(gè)城市?
作者用城市比喻軟體,城市如同系統(tǒng)軟體有很多區(qū)域,每個(gè)區(qū)域有各自的功能。
劃分系統(tǒng)的建造與使用
「建造」與「使用」應(yīng)該要分開,如同蓋房子與住房子是兩件不同的事情。
大部分的城市卻沒有把兩件事情分開,出現(xiàn)延遲初始的情況。
public Service getService(){
????if(service == null)
????????service = new MyServiceImpl(....);
????return service;
}
上面的例子包含了延遲初始/延遲賦質(zhì)(LAZY Initialization/Evaluation)
延遲初始/延遲賦質(zhì)寫法的優(yōu)點(diǎn)
要使用的時(shí)候,再建立物件
初始化時(shí)間變短
保證函式不回回傳null
延遲初始/延遲賦質(zhì)寫法的缺點(diǎn)
相依於MyServiceImpl,等於程式寫死
測(cè)試會(huì)較困難
違反單一職掌原則
作者主張「建造的過程」要從「正常邏輯」分離出來。
主函式Main的劃分
最簡(jiǎn)單的方法將「建造程式」都移到主函式main或主函式呼叫的模組builder。
11-1的圖寫明了順序
1.build 先new 物件
2.再run程式
工廠
第一種方法是建立好物件可當(dāng)做參數(shù)傳給應(yīng)用程式。有時(shí)候應(yīng)用程式要負(fù)責(zé)「何時(shí)」要產(chǎn)生物件,此時(shí)可用抽象工廠模式。
11-2 應(yīng)用程式要用LineItem物件的時(shí)候,呼叫工廠建造程式可以得到物件。
相依性注入
這段內(nèi)容談到相依性注入、控制反轉(zhuǎn)??蓞⒖纪鹾榱料壬闹鳌段业某淌酱a會(huì)說話》7.2 相依性注入
相依性注入的另外一個(gè)名字控制反轉(zhuǎn),這種方式實(shí)現(xiàn)了程式碼的熱插拔。採用相依性注入,可以透過 xml 來配置名稱和運(yùn)算,進(jìn)行更自由的擴(kuò)展。
我的理解是程式建立物件的過程中,可以讀取外部xml創(chuàng)建物件。xml可以更改,程式就不會(huì)寫死變得有彈性。
這篇文章寫得淺顯易懂
IoC基本概念介紹
https://ithelp.ithome.com.tw/articles/10156571
擴(kuò)大
小城市起初在興建的時(shí)候不會(huì)考慮到以後會(huì)不會(huì)變成大城市,同樣的情況小程式起初不會(huì)考慮未來會(huì)不會(huì)變成大程式。
保持適當(dāng)?shù)年P(guān)注點(diǎn)分離,軟體系統(tǒng)的架構(gòu)就能夠遞增地成長。
說人話就是要想辦法降低軟體與軟體之間的相依性,軟體才可以擴(kuò)展與重複使用。
橫切關(guān)注點(diǎn)
AOP 觀念與術(shù)語
https://openhome.cc/Gossip/SpringGossip/AOPConcept.html
Java代理機(jī)制
從代理機(jī)制初探 AOP
https://openhome.cc/Gossip/SpringGossip/FromProxyToAOP.html
看文中的圖就能明白Java代理的奧妙,第十一章後半段講述的AOP剖面設(shè)計(jì)都在做類似的事情,差別在於方法不同。
平常寫程式的時(shí)候?qū)憀og就直接加上去,實(shí)際上除錯(cuò)程式都是對(duì)原本商業(yè)程式的「破壞」,這段程式變得無法再利用,也會(huì)造成不利於測(cè)試驅(qū)動(dòng)開發(fā),AOP要解決程式被「破壞」的問題。
純Java? AOP 框架
動(dòng)態(tài)代理
https://openhome.cc/Gossip/SpringGossip/DynamicProxy.html
AspectJ 剖面設(shè)計(jì)
測(cè)試驅(qū)動(dòng)的系統(tǒng)架構(gòu)
最佳化決策
聰明地利用可明顯增加價(jià)值的標(biāo)準(zhǔn)
系統(tǒng)需要特定領(lǐng)域的語言
總結(jié)