在《不過時的經(jīng)典層架構(gòu)》里,有朋友留言關(guān)于Manager和Engine的概念,雖然朋友留言把概念解釋清楚了。為了避免其他人有同樣的疑問,這里我還是再解釋一下。 以上是經(jīng)典的四層架構(gòu),在這個架構(gòu)中,Manager和Engine(引擎)都是業(yè)務(wù)邏輯層的概念。Manager中文就是管理者,就是把行為管理起來。Engine是行為本身。咱們超出業(yè)務(wù)邏輯層,針對這個概念本身來看,什么是引擎行為呢?咱們很多朋友聽說過搜索引擎、計算引擎吧。為什么搜索引擎稱之為引擎呢?因?yàn)樗话悴皇仟?dú)立使用的,一般是嵌入到網(wǎng)站上,作為網(wǎng)站上的一個行為,這個行為是對信息進(jìn)行組織處理后,為用戶提供檢索服務(wù),并將相關(guān)信息展示給用戶。這個行為最重要的特點(diǎn)是整套一起使用。如果整套都是一起使用,易變性低,可以作為基礎(chǔ)操作,這就可以稱之引擎。Manager管理者這個角色與Engine引擎最大的不同就是易變性上,它組織了一個或者多個行為,如果這些行為都是一起使用,序列也不變,那也可以叫一個引擎。就像搜索引擎里綜合信息處理,提供檢索服務(wù)一樣。但是序列,也就是行為的組織方式易變,那就需要一個管理者來組織。下面會有例子說明為什么一定要清楚這個。 下面來說一下今天的正題,開閉架構(gòu)。 開放架構(gòu) 在開放架構(gòu)中,無論組件在哪一層,都可以隨意進(jìn)行調(diào)用。這些調(diào)用關(guān)系包含向上層調(diào)用,向下層調(diào)用,平行調(diào)用。開放架構(gòu)提供了無止境的靈活性,但是犧牲了封裝性,引入了耦合。 比如向上層調(diào)用:在四層架構(gòu)中,業(yè)務(wù)層調(diào)用客戶端。一旦UI變了,業(yè)務(wù)層就也得跟著變了。 但是實(shí)際中,那么傻的事情是很少發(fā)生的。但是,實(shí)際上有時候我們非常想,我暴露一個對外接口,這個接口作用就是調(diào)用一下數(shù)據(jù)庫做個處理。我何苦這么麻煩,先封裝一個XXManager,XXManager調(diào)用XXEngine,XXEngine還要調(diào)用XXAccess。其實(shí)這些里面只是直接調(diào)用了下一層,其他什么也沒有做,直接調(diào)用數(shù)據(jù)庫多省事啊。這里面就涉及到易變性封裝的問題,客戶端需求變了,要動很底層。 所以,當(dāng)然,開放架構(gòu)是目前不推薦的架構(gòu)形式。 封閉架構(gòu) 在封閉架構(gòu)中,不允許向上層調(diào)用和同級調(diào)用,只允許向下調(diào)用。這樣就犧牲了靈活性,但是封裝了易變性,同時促進(jìn)解耦。也是一般比較推薦的架構(gòu)。 但在咱們實(shí)際的項目中,會有一些同級調(diào)用的沖動。就是這種沖動會讓代碼很難維護(hù)。比如有段邏輯A,是Manager層的。另外來了一個需求B,正好可以復(fù)用這部分代碼,同時增加一些其他邏輯。那本著代碼復(fù)用,減少重復(fù)代碼的原則,我應(yīng)該直接調(diào)用A啊。為了不打亂層級,我把這段公共代碼抽到下一層Engine層。那這段邏輯也要調(diào)用Engine層啊,不又是同級調(diào)用了嗎?按照我的經(jīng)驗(yàn),一般這種情況是習(xí)慣于Engine層很薄導(dǎo)致的,可以檢查一下Engine同級調(diào)用的地方是不是可以直接調(diào)用Access不會引起很多重復(fù)代碼。如果不行,那說明咱們的業(yè)務(wù)邏輯過于復(fù)雜,四層不夠,架構(gòu)設(shè)計少了一層。 半開半閉架構(gòu) 在半開半閉架構(gòu)中,允許向下多層調(diào)用。我記得十幾年前,我特別喜歡寫數(shù)據(jù)庫存儲過程,代碼端可干凈了。因?yàn)檫壿嬋跀?shù)據(jù)庫那里,這個時候開放架構(gòu)是很合適的,因?yàn)橐坏┯懈膭樱诵母膭狱c(diǎn)在存儲過程,上面都要跟著變,當(dāng)然上層越少越好了。但是現(xiàn)在大型項目都不推薦使用存儲過程了,最重要的一點(diǎn)就是易變性。 這種調(diào)用也是封裝性和靈活性的妥協(xié),也是要避免的。 封閉架構(gòu)中規(guī)則的放松 封閉架構(gòu)過于嚴(yán)格,有些代碼編寫就會殊為不易。所以它有兩個明確的放松規(guī)則的例外: 調(diào)用工具 像日志和監(jiān)控埋點(diǎn)等工具,其他層均可調(diào)用。 弱引用 比如在兩個Manager之間使用了隊列作為調(diào)用方式,因?yàn)槭侨跻?,是允許同級調(diào)用的。 |
|