《架構(gòu)整潔之道》終于到了《整潔架構(gòu)》一章。
整潔架構(gòu)書中畫了個(gè)同心圓,外層依賴內(nèi)層,內(nèi)層不能依賴外層。

這個(gè)同心圓依賴關(guān)系規(guī)則的出發(fā)點(diǎn)是認(rèn)為外部的是多變的、可替換的、可移植的、開發(fā)者不希望花太大精力投入的。
最外層是設(shè)備、數(shù)據(jù)庫、外部接口、用戶界面、web這類框架與驅(qū)動(dòng)程序。如之前所說,系統(tǒng)設(shè)計(jì)的時(shí)候盡可能延后決策,這就要求系統(tǒng)設(shè)計(jì)的時(shí)候?qū)υO(shè)備等進(jìn)行抽象,至少要做一個(gè)隔離層。這啟發(fā)我們不要依賴于具體的底層實(shí)現(xiàn)如交互方式,以便將來做平臺(tái)移植的時(shí)候減少投入人力。近期我對(duì)我們的代碼架構(gòu)做了一次評(píng)估調(diào)查,發(fā)現(xiàn)底層通信方式的變更導(dǎo)致了某個(gè)組件整個(gè)重寫,這就是不合理的依賴帶來的代價(jià)。我也一直強(qiáng)調(diào),不要把外部接口引到組件內(nèi)部,甚至想把這一條作為代碼合入的自動(dòng)化檢查標(biāo)準(zhǔn),也是考慮到外部變更會(huì)導(dǎo)致內(nèi)部頻繁修改。
所謂隔離層,書中也稱作網(wǎng)關(guān)、展示器、控制器。旁邊也標(biāo)注了叫做接口適配器。接口適配器很好理解,總有一個(gè)層要隔離外部變化,并把外部消息轉(zhuǎn)為內(nèi)部能夠處理的數(shù)據(jù)。那么展示器是什么?我想應(yīng)該是圖像顯示類程序中對(duì)圖像數(shù)據(jù)的中間處理,與之相對(duì)的是像素點(diǎn)直接處理函數(shù)??刂破魇鞘裁??書中沒有細(xì)說,似乎是參數(shù)配置模塊,負(fù)責(zé)系統(tǒng)對(duì)配置參數(shù)的響應(yīng)與轉(zhuǎn)發(fā)。
用例層,書中也稱作應(yīng)用級(jí)業(yè)務(wù)邏輯。這部分應(yīng)該是根據(jù)參數(shù)配置,生成場景,所以我更希望叫做場景層。參數(shù)配置好之后,業(yè)務(wù)實(shí)體按照?qǐng)鼍皥?zhí)行。
系統(tǒng)的核心是業(yè)務(wù)實(shí)體。業(yè)務(wù)實(shí)體也應(yīng)該是分層的,分為流程層與實(shí)現(xiàn)層。流程層定義了系統(tǒng)業(yè)務(wù)架構(gòu),實(shí)現(xiàn)層實(shí)現(xiàn)這些流程的細(xì)節(jié)。
既然有分層,就必然存在層次邊界問題,書中沒有細(xì)說,我談一下我的理解。從性能和復(fù)雜度平衡角度,我認(rèn)為所有的復(fù)雜度應(yīng)該盡量向外層靠攏,接口適配層能完成的工作就不要到場景層和領(lǐng)域?qū)?。上面四層不是絕對(duì)的,至少我覺得還必須有基礎(chǔ)設(shè)施層,用于提供整體公用的宏定義、小工具實(shí)現(xiàn)等功能。
整潔架構(gòu)和組件,是從不同的角度在定義系統(tǒng)。整潔架構(gòu)可以是組件內(nèi)的,也可以是組件外的,是一種架構(gòu)設(shè)計(jì)方法。組件按照康威定律,必然與團(tuán)隊(duì)是對(duì)應(yīng)的,組件邊界即團(tuán)隊(duì)工作邊界。下面談一下組件邊界。
組件邊界在第13章已經(jīng)講過組件聚合三原則,這里主要講組件邊界是怎樣形成的。我在書里寫了這么一行字“變化方向->抽象->形成邊界”,邊界不是一次形成的,而是在演進(jìn)的過程中新的變化方向引入了新的抽象,抽象后形成了新的邊界?,F(xiàn)存的邊界也不是一成不變的,隨著需求的增加,團(tuán)隊(duì)之間進(jìn)行著邊界的突圍與撕裂,被撕裂的組件工作量越來越大,因?yàn)橐粋€(gè)邊界的讓步將引發(fā)后續(xù)一大批需求的改動(dòng),這個(gè)時(shí)候我感到非常困惑,架構(gòu)師是否應(yīng)該參與到這類爭執(zhí)不下的邊界沖突中來作為一個(gè)中立者給出從系統(tǒng)角度的合理結(jié)論,似乎屬于架構(gòu)師的責(zé)任,但這些微觀的小邊界又往往是很難說清的。近期我對(duì)架構(gòu)的評(píng)估調(diào)查,也著重調(diào)查了組件邊界爭執(zhí)的問題,爭執(zhí)往往是因?yàn)榻M件間存在相同的概念,而相關(guān)概念的各自責(zé)任又沒有由架構(gòu)師確定下來,相關(guān)問題的解決之道還需要深入摸索。