系統(tǒng)架構(gòu)中的拆分與集成

引言

有一個認(rèn)可度比較高的對于軟件系統(tǒng)架構(gòu)的定義:職責(zé)明確的模塊或者組件、關(guān)聯(lián)關(guān)系、約束和指導(dǎo)原則。如下圖所示:


架構(gòu)定義

當(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ū)動分層一般如下。

分層架構(gòu)
六邊形架構(gòu)

jar包一般可以按照上面的模式來劃分,不過也可以通過package的方式來組織,只是一種邏輯的代碼組織方式,另外有一些公共的功能模塊也可以抽在這一層級,例如異常、日志、注解等。

然后是領(lǐng)域模塊下面按照各個聚合來劃分縱向的業(yè)務(wù)包package。

領(lǐng)域模型結(jié)構(gòu)圖

最后是類的填充與細(xì)化,可以是契約導(dǎo)向的編碼,由外而內(nèi),因為外部的場景是確定,內(nèi)部的模型可以通過場景來推到出來。

由外而內(nèi)

其他

上面基本列出了從領(lǐng)域模型到代碼劃分的大概過程,省略了很多細(xì)節(jié),不過可以作為實踐的一個指南,后面會結(jié)合一些具體的實例進(jìn)行分析。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容