引言
有一個認(rèn)可度比較高的對于軟件系統(tǒng)架構(gòu)的定義:職責(zé)明確的模塊或者組件、關(guān)聯(lián)關(guān)系、約束和指導(dǎo)原則。如下圖所示:
當(dāng)我們通過需求分析得到了業(yè)務(wù)的實例化規(guī)則以及領(lǐng)域模型之后,接下來就是進(jìn)行系統(tǒng)的架構(gòu),按照上面對架構(gòu)的定義,其中比較重要的步驟就是對系統(tǒng)進(jìn)行拆分與集成。
拆分的好處
將系統(tǒng)拆細(xì)之后主要可以簡化認(rèn)知與增加復(fù)用。
簡化認(rèn)知:將系統(tǒng)拆細(xì)后一次只需要理解少量的概念,在一個特定的范圍內(nèi)工作。在工作中與其他域的同事進(jìn)行合作的時候很難的地方就是概念的理解,面對一個新的名稱或者同一個名稱的不同用法(解釋)時往往難以短時間理解,因此在系統(tǒng)設(shè)計中沒有必要不要輕易的新增概念。
增加復(fù)用:當(dāng)把系統(tǒng)拆細(xì)之后,每個子系統(tǒng)都有自己特定的問題域,可以屏蔽一些特定的依賴(隔離了變化),因此可以增加復(fù)用度。
拆分的粒度
在目前的工作中,根據(jù)粒度的不同從大到小可以拆分成應(yīng)用、模塊(jar包)、包、類等幾種。
子域與應(yīng)用
拆分的原則與過程
拆分最重要的原則是:領(lǐng)域體現(xiàn)的業(yè)務(wù)能力,也就是說拆分出來的子系統(tǒng)有沒有可能成為一個獨立的業(yè)務(wù)。這里獨立的業(yè)務(wù)更多針對的是應(yīng)用級別的,當(dāng)然也可以暫時把子域放到一個應(yīng)用中,不過需要具備獨立出來的條件。就目前工作中較少遇到可以獨立應(yīng)用的機會。
拆分的過程:根據(jù)業(yè)務(wù)的流程,對每個業(yè)務(wù)流程進(jìn)行分析,看該業(yè)務(wù)流程是否符合獨立業(yè)務(wù)的條件(除了在目前的業(yè)務(wù)場景下使用,還有沒有可能為其他業(yè)務(wù)使用)。
集成
集成是由雙方組成的,依賴方與被依賴方,作為被依賴方,也就是服務(wù)提供方,主要有兩種方式,一種是產(chǎn)品化方式,不提供業(yè)務(wù)定制化能力,提供的是標(biāo)準(zhǔn)服務(wù),例如支付寶的支付服務(wù),短信的發(fā)送服務(wù)等;另外一種是供應(yīng)商方式,根據(jù)客戶的需求來定制一些服務(wù)接口,在業(yè)務(wù)部門,一般都是供應(yīng)商模式。作為依賴方,主要考慮是否新增防腐層,防腐層的好處是依賴倒置,可以隨時替換下游,方便測試等,不過增加了模型轉(zhuǎn)換的成本。
jar包與package
在應(yīng)用內(nèi)部,一般會按照橫向的層級以及縱向的業(yè)務(wù)來劃分。
橫向的層級劃分按照領(lǐng)域驅(qū)動分層一般如下。
jar包一般可以按照上面的模式來劃分,不過也可以通過package的方式來組織,只是一種邏輯的代碼組織方式,另外有一些公共的功能模塊也可以抽在這一層級,例如異常、日志、注解等。
然后是領(lǐng)域模塊下面按照各個聚合來劃分縱向的業(yè)務(wù)包package。
類
最后是類的填充與細(xì)化,可以是契約導(dǎo)向的編碼,由外而內(nèi),因為外部的場景是確定,內(nèi)部的模型可以通過場景來推到出來。
其他
上面基本列出了從領(lǐng)域模型到代碼劃分的大概過程,省略了很多細(xì)節(jié),不過可以作為實踐的一個指南,后面會結(jié)合一些具體的實例進(jìn)行分析。