《換個角度理解之設計模式》的草稿已經(jīng)放了一個多月了惋增,始終感覺缺少點什么芽突。最近因為工作需要在讀Shiro,Thymeleaf源碼脊阴,而在閱讀過程中時不時地會回想起還在做.NET的時候看過的 《程序員的自我修養(yǎng)—鏈接天通、裝載與庫》一書的這樣一句話——“軟件開發(fā)領域的銀彈——引入中間層”环葵。
說句題外話采呐,這本書當初依然是聽取了很多人的推薦茴厉。但買回來之后才發(fā)現(xiàn)是講C艸的旅掂。得益于當時的工資低但工作輕松赏胚,所以還是抽空看了一些。
1. 來源
下面這張圖是我剛剛專門從網(wǎng)上截取來的商虐。
2. 解讀
我還是從兩個核心概念出發(fā)嘗試闡述下對這句話的理解崖疤。
2.1 推遲作決定的時機
對上面這句話的理解最直接的當然就是推遲作決定的時機。中間層的引入最明顯的就是再次將必須做出決定的時機后延典勇。時機的后延也就意味著我們?yōu)閼獙ψ儎恿舫隽烁嗟目臻g劫哼,系統(tǒng)也因此變得更加牢固。
但是請記住割笙,這種方式并不是完美無瑕的权烧。引入中間層的一大弊端就是增加了理解上的難度,這也是考驗架構(gòu)師的一個重要指標——哪些才是必要的中間層伤溉?
本人曾經(jīng)總結(jié)過這樣一句話: “真正做出決定的時間點和假裝做出決定的時間點之間的間隔越大般码,系統(tǒng)將越靈活,越牢固乱顾。大部分系統(tǒng)不穩(wěn)定性的重要原因之一正是作決定的時機太早板祝,導致之后作決定時被之前作下的決定所束縛,進而處處受制”走净。
2.2 知道自己不該知道什么
中間層引入之后券时,對于中間層之上的調(diào)用者而言,它就不應該去關心中間層之下的相關細節(jié)温技,它只需要遵守中間層的契約革为,來獲取自己想要的結(jié)果。
看了上面這段語言舵鳞,是否感覺這個中間層的解釋很像接口震檩。沒錯,接口就是中間層的一種形式蜓堕。
所以在你引入了中間層之后抛虏,
- 當你處在中間層之上時,一定要謹記自己該知道的套才,以及不該知道的迂猴。尤其是后者,你作出的假設越少背伴,系統(tǒng)的靈活性越大沸毁。
- 而當你位于中間層之下時,而是謹記不要去關注中間層之外的其他問題傻寂。這也符合很多前輩所教育我們的“不要對軟件的其它部分做出任何假設”息尺,"編寫羞澀的代碼"。
3. 總結(jié)
雖然是做.NET的時候就看到了這個言論疾掰,但真正有所感悟的則是在轉(zhuǎn)入Java搂誉,看了這么多的源碼之后。
回頭想想曾經(jīng)看過的那些優(yōu)秀源碼静檬,對于它們設計中的精密之處炭懊,彼此之間似乎越來越像了并级!