《換個(gè)角度理解之設(shè)計(jì)模式》的草稿已經(jīng)放了一個(gè)多月了,始終感覺缺少點(diǎn)什么。最近因?yàn)楣ぷ餍枰谧xShiro,Thymeleaf源碼,而在閱讀過(guò)程中時(shí)不時(shí)地會(huì)回想起還在做.NET的時(shí)候看過(guò)的 《程序員的自我修養(yǎng)—鏈接、裝載與庫(kù)》一書的這樣一句話——“軟件開發(fā)領(lǐng)域的銀彈——引入中間層”。
說(shuō)句題外話,這本書當(dāng)初依然是聽取了很多人的推薦。但買回來(lái)之后才發(fā)現(xiàn)是講C艸的。得益于當(dāng)時(shí)的工資低但工作輕松,所以還是抽空看了一些。
1. 來(lái)源
下面這張圖是我剛剛專門從網(wǎng)上截取來(lái)的。

2. 解讀
我還是從兩個(gè)核心概念出發(fā)嘗試闡述下對(duì)這句話的理解。
2.1 推遲作決定的時(shí)機(jī)
對(duì)上面這句話的理解最直接的當(dāng)然就是推遲作決定的時(shí)機(jī)。中間層的引入最明顯的就是再次將必須做出決定的時(shí)機(jī)后延。時(shí)機(jī)的后延也就意味著我們?yōu)閼?yīng)對(duì)變動(dòng)留出了更多的空間,系統(tǒng)也因此變得更加牢固。
但是請(qǐng)記住,這種方式并不是完美無(wú)瑕的。引入中間層的一大弊端就是增加了理解上的難度,這也是考驗(yàn)架構(gòu)師的一個(gè)重要指標(biāo)——哪些才是必要的中間層?
本人曾經(jīng)總結(jié)過(guò)這樣一句話: “真正做出決定的時(shí)間點(diǎn)和假裝做出決定的時(shí)間點(diǎn)之間的間隔越大,系統(tǒng)將越靈活,越牢固。大部分系統(tǒng)不穩(wěn)定性的重要原因之一正是作決定的時(shí)機(jī)太早,導(dǎo)致之后作決定時(shí)被之前作下的決定所束縛,進(jìn)而處處受制”。
2.2 知道自己不該知道什么
中間層引入之后,對(duì)于中間層之上的調(diào)用者而言,它就不應(yīng)該去關(guān)心中間層之下的相關(guān)細(xì)節(jié),它只需要遵守中間層的契約,來(lái)獲取自己想要的結(jié)果。
看了上面這段語(yǔ)言,是否感覺這個(gè)中間層的解釋很像接口。沒錯(cuò),接口就是中間層的一種形式。
所以在你引入了中間層之后,
- 當(dāng)你處在中間層之上時(shí),一定要謹(jǐn)記自己該知道的,以及不該知道的。尤其是后者,你作出的假設(shè)越少,系統(tǒng)的靈活性越大。
- 而當(dāng)你位于中間層之下時(shí),而是謹(jǐn)記不要去關(guān)注中間層之外的其他問(wèn)題。這也符合很多前輩所教育我們的“不要對(duì)軟件的其它部分做出任何假設(shè)”,"編寫羞澀的代碼"。
3. 總結(jié)
雖然是做.NET的時(shí)候就看到了這個(gè)言論,但真正有所感悟的則是在轉(zhuǎn)入Java,看了這么多的源碼之后。
回頭想想曾經(jīng)看過(guò)的那些優(yōu)秀源碼,對(duì)于它們?cè)O(shè)計(jì)中的精密之處,彼此之間似乎越來(lái)越像了!