UML和模式應用讀書筆記四(領域模型與類圖)

領域模型

association vs attribute

association 用於實例之間關係,attribute則用於需要記住的信息
一般來說人們會比較實例的而比較屬性的
value object更像是data type

ID

考慮這樣的productId,由countryCode+manufacturaterCode+id組成,但是我覺得這樣的情況應該視爲邏輯編碼,除了用來查詢外不應當做唯一id使用,更加不能解析該id,因爲countryCode有可能改變(換了國家),另外manufacturaterCode沒有包含countryCode也是令人奇怪.

number attribute

一般來說涉及到數量的時候會有單位,典型的就是Money

示例

s:開始 r:精化

科目 製品 初始 細化 E1->En 構造 C1-Cn 移交 T1->Tn
業務建模 領域模型 s
需求 用例模型 s r
設想 s r
補充性規格說明 s r
詞彙表 s r
設計 設計模型 s r
軟件架構文檔 s
數據模型 s r

從理論的角度來看,理論與實踐應當是一致的
從實踐的角度來講,實踐與理論其實是不同的

概念分類列表

  • 有形對象
    CreditCard , Check
  • 事務
    CashPayment , CreditPayment , CheckPayment
  • 其他外部的計算機或機電系統
    CreditAuthorizationService
  • 抽象名詞概念
  • 機構組織
  • 金融,工作,合同,法律事務等的記錄

將概念類劃分爲子類的動機

  • 子類有額外的有意義的屬性
  • 子類有額外的有意義的關聯
  • 子類概念操作,處理,反應或使用不同於其超類或其他子類,而這些方式是我們所關注的
  • 子類概念表示了一個活動體(如動物,機器人),其行爲與超類或者其他子類不同,而這些行爲使我們所關注的.

簡化繼承樹

在這裏插入圖片描述
在這裏插入圖片描述

abstract conceptual class

定義
如果類C的每個成員也必須是某個子類的成員,則類C被稱爲抽象概念類

準則
識別抽象類,在領域模型中使用斜體字標識抽象類的名稱,或者使用{abstract}關鍵字標識

狀態

準則
不要講概念X的狀態建模爲X的子類,有兩個辦法可供選擇

  • 定義狀態類層次結構,並將其與類X關聯
  • 在領域模型中忽略概念的狀態,而在狀態圖中加以反映

在這裏插入圖片描述

繼承

採用一種面嚮對象語言,通過創建類層次結構,軟件子類繼承超類的屬性和操作定義.繼承是使超類的特性適應於子類的軟件機制,它支持對子類代碼的重構,將其置入超類之中,形成類層次結構.因此,在領域模型中討論繼承沒有意義,而當我們轉向設計和實現視圖時它纔有重要意義.

association class

準則
在領域模型中增加關聯類的可能線索有:
有某個屬性與關聯相關
關聯類的實例具有依賴於關聯的生命週期
兩個概念之間有多對多關聯,並且存在與自身相關的信息

aggregation & composite

準則
在下述情形下,可以考慮組合關係

  • 部分的生命期在組成的生命期界限內,部分的創建和刪除依賴於整體
  • 在物理或者邏輯組裝上,整體-部分關係很明確
  • 組成的某些屬性(例如位置)會傳遞給部分
  • 對組成的操作(例如銷燬,移動等)可能傳遞給部分

益處
有利於澄清部分對整體依賴的領域約束
有助於使用GRASP creator模式
對整體的複製,拷貝這些操作會傳遞給部分

時間間隔

文中舉了一個價格變動的問題,提出了兩種解決方案,一種是產品只記錄當前價格,然後在銷售時複製產品價格到訂單,另一種方案是產品有多個價格.作者傾向於後者,因爲這樣有利於以後對價格變動進行分析.圖形如下
在這裏插入圖片描述

作爲概念的角色 & 關聯中的角色

在這裏插入圖片描述
文中提到下面一種編碼更清晰,但是不夠靈活,無法處理一個人同時擁有多個角色的情況

導出元素

準則
要避免在圖中顯示導出元素,因爲這些導出元素在沒有增加新信息的情況下還會增加複雜性.然而,如果導出元素是重要的術語,而缺乏這一術語會削弱理解,這時就需要在圖中增加導出元素.

對於上面的準則,書中給出的特例是Sale的total屬性

受限關聯

看上去讓關聯更清晰(也許能從Set轉爲Map),但是書中認爲這個做法並不好,因爲沒有增加信息(我認爲是增加了的),除非這種受限關聯有價值,否則不用(在我看來,就是Map的key如果是自身的id的話就沒啥用,如果是另一個東西的id也許就有用,特別的是指向current的指向)

類圖

屬性

三種方法

  • 屬性文本表示法
  • 關聯線表示法
  • 兩者皆有

在這裏插入圖片描述

屬性文本格式

visibility name:type multiplicity=default(property-string)
準則:如果沒有給出可見性,則通常假設屬性是私有的

關聯性

  • 導航性箭頭 由源對象指向目標對象
  • 多重性放置在目標一端,而不是源一端
  • 角色名只放置在目標一端,用以表示屬性名稱

集合

在這裏插入圖片描述

composition

組合關係有以下幾層含義

  • 在某一時刻,部分的實例只屬於一個組成實例
  • 部分必須總是屬於組成(不存在遊離的)
  • 組成要負責創建和刪除其部分,既可以自己來也可以與其他對象協作

在這裏插入圖片描述
個人觀點,由於創建時總會有必填項與外鍵關聯,所以上面要求組成要創建部分的限定不夠厲害,而另一方面,幾乎不存在刪除操作,所以組成要刪除部分的約束也沒啥用

限定關聯

當存在一對多,特別是一的一方的主鍵是多的一方的邏輯主鍵時,可以通過補充缺失的字段來鎖定唯一
在這裏插入圖片描述

關聯類

這個在DB中作爲多對多的關係表,由於有了額外的屬性,所以也就需要一個專門的類,爲何不改成兩個一對多的關係呢?我認爲是改了之後就修改了原有的語義.(何況關聯類可能是當初沒有的,後來新增的,當然對設計不能大改)
在這裏插入圖片描述

方法

格式

visibility name(parameter-list):return-type(property-string)
準則:如果沒有表示可見性,則通常假設操作是公共的

create

使用<<contructor>>來標識構造方法

getter

一般省略

關鍵字

關鍵字 含義 用法示例
<<actor>> 類元爲參與者 置於類名稱之上
<<interface>> 類元爲藉口 置於類名稱之上
{abstract} 抽象元素,不能實例化 置於類元名稱或操作名稱之後
{ordered} 具有強制順序的一組對象 置於關聯的端點

單實例類

作圖上就是右上角標個1,我覺得還不如<<singleton>>來的明確,另外單實例類有點違背OO

主動類

active object運行於自己控制的執行線程之上.毫無疑問,主動對象的類即爲主動類.在UML中,主動類使用左右兩邊爲雙豎線的類框來表示

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章