對(duì)“領(lǐng)域模型”有“忽如一夜春風(fēng)來”的感覺,太多書籍在談它。將學(xué)習(xí)心得記錄下來,與大家分享。

什么是領(lǐng)域模型?
領(lǐng)域模型是對(duì)領(lǐng)域內(nèi)的概念類或現(xiàn)實(shí)世界中對(duì)象的可視化表示。又稱概念模型領(lǐng)域?qū)ο竽P?/strong>、分析對(duì)象模型

什么是概念類呢?
概念類是思想、事物或?qū)ο蟆?br>這樣的解釋,仍然顯得抽象。還是先看圖吧!

(圖一)
利用上圖,我們可以從概念類符號(hào)內(nèi)涵外延三個(gè)方面來考慮。
符號(hào):表示概念類的詞語或圖形。
內(nèi)涵:概念類的定義。
外延:概念類所適用的一組示例。
對(duì)應(yīng)于上圖,我們使用符號(hào)Sale來表示購(gòu)買交易事件的概念類;Sale的內(nèi)涵可以陳述為“表示購(gòu)買交易的事件,并且具有日期和時(shí)間”;Sale的外延為“世界上所有銷售實(shí)例的集合”。

為什么要?jiǎng)?chuàng)建領(lǐng)域模型?
降低與OO建模之間的表示差異

領(lǐng)域?qū)榆浖惖拿Q要源于領(lǐng)域模型中的名稱,以使對(duì)象具有源于領(lǐng)域的信息和職責(zé)。
打個(gè)比方,你可以用一長(zhǎng)串0和1來表示“薪水冊(cè)”,可是這種軟件表示與我們腦中的薪水冊(cè)領(lǐng)域模型之間存在巨大的差異,這將影響我們對(duì)軟件的理解和修改。而OO建模則可以減小這一差異。

那又如何創(chuàng)建領(lǐng)域模型呢?
可以通過以下三個(gè)步驟:
一. 尋找概念類
二. 將其繪制為UML類圖中的類
三. 添加關(guān)聯(lián)和屬性

如何找到概念類?
1)重用和修改現(xiàn)有的模型。
這是首要最佳最簡(jiǎn)單的辦法。可以從已發(fā)布的領(lǐng)域模型和書籍中獲得。
2)使用分類列表
示例:


(圖二)
3)確定名詞列表
在對(duì)領(lǐng)域的文本性描述中識(shí)別名詞和名詞短語,將其作為候選的概念類或?qū)傩浴?br>缺點(diǎn):自然語言的不精確性,不同名詞短語可能表示同一概念類或?qū)傩裕送饪赡苓€有歧義。
建議與概念類分類列表一同使用。

在實(shí)踐中,在發(fā)現(xiàn)概念類時(shí),一般直接為其繪制UML類圖

常見錯(cuò)誤:把應(yīng)該是概念類的事物表示為屬性。
準(zhǔn)則:如果我們認(rèn)為某概念類X不是現(xiàn)實(shí)世界中的數(shù)字或文本,那么X可能是概念類而不是屬性
考慮一下航空預(yù)定領(lǐng)域。destination應(yīng)該作為Flight的屬性,還是作為單獨(dú)的概念類Airport?

(圖三)
在現(xiàn)實(shí)世界里,目的地機(jī)場(chǎng)不會(huì)被看作是數(shù)字或文本,而是一占據(jù)大規(guī)模空間的事物。因此,Airport應(yīng)該是個(gè)概念,而不是屬性。

描述類包含描述其他事物的信息。例如,ProductDescription記錄Item的價(jià)格、圖片和文字描述。
為什么使用描述類?
假設(shè):雀巢咖啡,大受歡迎,銷售一空。這就意味著雀巢咖啡的所有Item實(shí)例都從計(jì)算機(jī)存儲(chǔ)器中被刪除。這時(shí)如果有人問:雀巢咖啡多少錢一盒?那將沒法回答。因?yàn)閮r(jià)格是記錄在實(shí)例上的,而這些實(shí)例都已經(jīng)被刪除。由此可以看出,需要其他事物來記錄雀巢咖啡的描述(規(guī)格說明)。

(圖四)
何時(shí)需要?
1. 需要有關(guān)商品或服務(wù)的描述,獨(dú)立于任何商品或服務(wù)的現(xiàn)有實(shí)例。
2. 刪除其所描述事物(如Item)的實(shí)例后,導(dǎo)致信息丟失,而這些信息是需要維護(hù)的,但是被錯(cuò)誤地與所刪除的事物關(guān)聯(lián)起來。
3. 減少冗余或重復(fù)信息。

關(guān)聯(lián)
什么是關(guān)聯(lián)?
關(guān)聯(lián)是類(類的實(shí)例)之間的關(guān)系,表示有意義和值得關(guān)注的連接。

(圖五)
何時(shí)表示關(guān)聯(lián)?
1. 如果存在需要保持一段時(shí)間的關(guān)系,將這種語義表示為關(guān)聯(lián)(“需要記住”的關(guān)聯(lián))。
2. 從常見關(guān)聯(lián)列表中派生的關(guān)聯(lián)。

準(zhǔn)則:要避免在領(lǐng)域模型中加入太多的關(guān)聯(lián)

在領(lǐng)域建模過程中,關(guān)聯(lián)不是關(guān)于數(shù)據(jù)流、數(shù)據(jù)庫外鍵聯(lián)系、實(shí)例變量或軟件方案中的對(duì)象連接的語句;關(guān)聯(lián)聲明的是針對(duì)現(xiàn)實(shí)領(lǐng)域從純概念角度看有意義的關(guān)系。

在UML中如何對(duì)關(guān)聯(lián)命名?
以“類名-動(dòng)詞短語-類名”的格式為關(guān)聯(lián)命名,其中的動(dòng)詞短語構(gòu)成了可讀的和有意義的順序。
圖五對(duì)應(yīng)于:VideoStore Stocks Video

多重性
定義了類A有多少個(gè)實(shí)例可以和類B的一個(gè)實(shí)例關(guān)聯(lián)。(見圖五)
多重性的值表示在特定時(shí)刻(而不是在某個(gè)時(shí)間跨度內(nèi))有效關(guān)聯(lián)的實(shí)例數(shù)量。

(圖六)

多重性是和語境有關(guān)的。

兩個(gè)類之間的多重關(guān)聯(lián):

(圖七)

常見關(guān)聯(lián)列表:

(圖八)

屬性
什么是屬性?
屬性是對(duì)象的邏輯數(shù)據(jù)值。

何時(shí)展示屬性?
當(dāng)需求(例如,用例)建議或暗示需要記住信息時(shí),引入屬性。

(圖九)
導(dǎo)出屬性(derived attribute):可以由其他信息導(dǎo)出的屬性。

準(zhǔn)則:大部分屬性類型應(yīng)該是“簡(jiǎn)單”數(shù)據(jù)類型,例如數(shù)字和布爾。通常,屬性的類型不應(yīng)該是復(fù)雜的領(lǐng)域概念,例如Sale或AirPort。

準(zhǔn)則:領(lǐng)域模型中屬性的類型更應(yīng)該是數(shù)據(jù)類型

準(zhǔn)則:通過關(guān)聯(lián)而不是屬性來表示概念類之間的關(guān)系

(圖十)

領(lǐng)域模型是概念透視圖,不是軟件透視圖。在設(shè)計(jì)模型中,屬性可以是任何類型。

準(zhǔn)則:任何屬性都不表示外鍵

(圖十一)

結(jié)論
沒有所謂唯一正確的領(lǐng)域模型。所有模型都是對(duì)我們?cè)噲D要理解的領(lǐng)域的近似。領(lǐng)域模型主要是在特定群體中用于理解和溝通的工具。有效的領(lǐng)域模型捕獲了當(dāng)前需求語境下的本質(zhì)抽象和理解領(lǐng)域所需要的信息,并且可以幫助人們理解領(lǐng)域的概念、術(shù)語和關(guān)系。


參考資料:
1. 《UML和模式應(yīng)用》(第三版)



歡迎大家訪問我的個(gè)人網(wǎng)站 萌萌的IT人