業(yè)務(wù)行為的分析和設(shè)計(jì)
Author:Anders小明
復(fù)雜業(yè)務(wù)行為通常看作是復(fù)雜規(guī)則與流程的集合。解決的基本方法依賴基本的思考方式:分解結(jié)構(gòu)。
分解的第一要素是:面向?qū)ο蟆獌?nèi)聚。通常面向?qū)ο罄碚摃?huì)告訴我們?cè)O(shè)計(jì)的設(shè)計(jì)原則是:這個(gè)對(duì)象是什么。這樣的做法對(duì)于Domain Model或者比較適合,但對(duì)應(yīng)于Service或者Application層的對(duì)象并不合適。這一類對(duì)象在需求的上的描述最典型是過程式!過程式描述的最大特點(diǎn)是告訴我們?cè)趺醋觯?dāng)我們應(yīng)用面向?qū)ο笤O(shè)計(jì)時(shí),相對(duì)于怎么做,我們要關(guān)心的是需求做什么。
1.1 分解行為的是所有工作的第一步:
分解的過程(手段),可以簡(jiǎn)單說有兩個(gè)層次:
第一層:把邏輯分解到不同繼承體系的對(duì)象上;
第二層:把邏輯分解到同一繼承體系的對(duì)象的不同抽象層次上。
兩個(gè)層次(手段)的內(nèi)在的理論是:做什么其實(shí)是一種行為抽象,而正如我們所知的,抽象是有層次和排列的。第一層分解在于解決頂層抽象,而第二層就解決其下層的抽象,如此反復(fù),就可以完成整個(gè)邏輯抽象的排列。
不過,有時(shí)我寧愿用另外一種更實(shí)戰(zhàn)的說法來解釋這樣的做法:利用面向?qū)ο蠓椒ǎP(guān)注于做什么來確定抽象模型,而把怎么做分解為抽象模型的派生類型。
無論是做什么,還是怎么做,需要注意的一點(diǎn)是:在知識(shí)級(jí)上隱式概念的印射,在操作級(jí)上有其投影。
接下來我們面臨其它一些技術(shù)問題。
1.2 確定邏輯的組合操作關(guān)系
在分解行為的過程中,我們先分解出了不同的對(duì)象體系,在知識(shí)級(jí)別(分析層次)上看,工作已經(jīng)完成,不過在操作級(jí)別(設(shè)計(jì)層次)上看,我們還需要解決一個(gè)問題。
不同的對(duì)象體系在系統(tǒng)中,根據(jù)場(chǎng)景,表現(xiàn)為兩種角色:調(diào)用者和被調(diào)用者。由于被調(diào)用者的派生體系(不同的怎么做),調(diào)用者面臨著一個(gè)選擇,選擇一個(gè)或者一組合適的被調(diào)用對(duì)象。
如何選擇有兩種方式:設(shè)計(jì)時(shí)(部署時(shí))和運(yùn)行時(shí)確定。
設(shè)計(jì)時(shí)(部署時(shí))很簡(jiǎn)單,在程序中寫上特定派生類型,基本算是hardcode。通常發(fā)生在調(diào)用方其對(duì)象體系的葉子節(jié)點(diǎn)直接調(diào)用被調(diào)用方的葉子節(jié)點(diǎn)。此時(shí),調(diào)用者是被動(dòng)選擇,交給所有的被調(diào)用者(通常是葉子節(jié)點(diǎn)),每個(gè)被調(diào)用者采取合適邏輯操作組合。
另一種是運(yùn)行時(shí),是調(diào)用者主動(dòng)選擇(通過一個(gè)工廠),根據(jù)一定規(guī)則,判斷選取合適的一個(gè)或者一組action執(zhí)行。通常利用外部如數(shù)據(jù)庫(kù),或者工廠+反射,利用對(duì)應(yīng)被調(diào)用者的Specification來確定。
主動(dòng)選擇可以是簡(jiǎn)單的if…else…來完成,當(dāng)選擇的影響因素多后可以采用的方式是決策表。
兩者比較如下:
|
矩陣/決策表 |
面向?qū)ο蠓绞?/span> |
優(yōu)點(diǎn): |
直接了當(dāng),信息獲取明確; |
隨相關(guān)因素的增長(zhǎng),維護(hù)的復(fù)雜度曲線平緩升高,低于矩陣,決策表;在與,或,非計(jì)算上相對(duì)明確;層次化結(jié)構(gòu)有助于學(xué)習(xí); |
缺點(diǎn): |
隨相關(guān)因素的增長(zhǎng),維護(hù)的復(fù)雜度曲線快速升高;但在與,或,非計(jì)算上不明確; |
相關(guān)信息獲取不十分明確; |
本質(zhì): |
排列組合的平面化結(jié)構(gòu)。這是其優(yōu)缺點(diǎn)的根源; |
排列組合的層次化結(jié)構(gòu); |
開發(fā): |
運(yùn)行時(shí)確定,變更相關(guān)因素對(duì)于開發(fā)有重大影響; |
轉(zhuǎn)化為部署時(shí)確定,運(yùn)行時(shí)結(jié)構(gòu)明確 |
分解后的行為,除了處理怎么做的流程,還有各種各樣的規(guī)則:包括了Selection的Specification外,還包括Validation的Specification,Build的Specification以及Calculation的Specification。
除了后兩種是行為外(不包括它們參數(shù)的來源),其它兩種業(yè)務(wù)規(guī)則本身來說,其有三種實(shí)現(xiàn)方式:
a) 多態(tài)(面向?qū)ο蠓绞剑?br /> b) 簡(jiǎn)單決策表(映射表),用顯示的行表(and關(guān)系)保存路由選擇(運(yùn)行時(shí)確定)。
c) 樹形決策表(映射表),用顯示的樹表(and/or關(guān)系)保存路由選擇(運(yùn)行時(shí)確定)。
1.4. 行為的異步分解
大部分行為的分解,都是同步的!然而在復(fù)雜系統(tǒng)中還是存在行為的異步分解,這樣設(shè)計(jì)看起來更像是Data Flow Pattern,存在的理由不一,有的是出于性能原因,有的出于業(yè)務(wù)原因(在金融系統(tǒng)中可以看到這樣的例子,例如:為了保證關(guān)鍵業(yè)務(wù)數(shù)據(jù)的存在,通常是一些價(jià)格或者利率,白天提請(qǐng)的交易行為,分為兩步,第一步即使完成,而第二步動(dòng)作必須在晚上進(jìn)行)。