一般 UML 書籍對 “關聯類別(assocation class)” 的定義及說明如下:
- An association class connection is a UML construct that allows an association connector to have attributes and operations (features).
「UML Distilled」一書提及:關聯類別(assocation class)允許你在關聯上面增加屬性、操作和其它(類別)特性。
書中所舉參考範例如下圖:
圖一 關聯類別 — 摘錄自 "UML Distilled 3rd edition"
文中說明為:從圖一,我們可以看見 Person(個人)可能會參加很多會議。我們必須保有這個人對這些會議的出席情況:藉由新增一個 attentiveness(出席意願)屬性到關聯上,我們可以達到這個目的。
說真的,我對以上對於關聯類別(assocation class) 的定義及說明並不盡滿意!
也有些說法是從 E-R(Entity-Relationship)的角度來說明 association class 是為了保存及紀錄額外的資訊(additional information)而衍生。因為在多對多的情況下,資訊儲存在任一個 class 下均不甚理想。 例如下圖二。
圖二 學生與科目的關聯
若需要記錄關於學生選擇了哪些課程的訊息,該記錄儲存在 "學生" 或是 "科目" 類別內均不太適合。所以為了記錄關於選課的資訊,於是衍生出關聯類別 "Student-Course" 或稱之為 "選課"。如下圖三。
圖三 學生與科目的關聯類別 — 選課
我仍覺得,因為要記錄額外的資訊而衍生出 "選課" 這樣的關聯類別,還是很不自然,"人工化" 的意味很重,而非從 Domain 的概念觀點來解釋。
我覺得,稱之為 "關聯類別(association class)" 實在挺不自然的,怎麼解釋說明都感覺不是那麼的合理化。
但,若從商業交易(Transaction)的角度來看時,那麼,反而會先看到 "事件(Event)" 的發生。例如上圖一的 "出席" 與圖三的 "選課"。然後,再找出相關聯於該事件的 "人" 與 "物"。
例如圖三,"選課" 這個事件的發起者為 "學生",而"學生" 所選課的 "物" 即為 "課程"。
所以,若從 "交易" 的角度來切入,關聯類別消失了,取而代之的是 "事件(Event)",而且,從 Domain 概念的層次來解釋也比較合理。
最後,再舉一個例子。
"教授" 與 "班級" 這兩個類別,是屬於多對多的關係。一個教授會在多個班級授課;相對地,一個班級會有好幾個教授來授課。顯然,一個很明顯的交易事件:授課,自然而然就會出現了,而且,在學校教務系統上,這樣的詞彙是合情合理的。
圖四 授課成為主要的類別
hi milkyway:
我們可以把問題轉移到 http://www.hsdc.com.tw 來討論。
關於技術面的文章,我在那邊也同時放了一篇。
說真的,就是因為我之前也不知道關聯類別是啥,我才去思考這問題。
建立軟體概念模型時,找出關聯類別並不是一件自然的事情。所以,我才會用另一個角度先找出 “event”。但,交易物件與關聯類別是兩回事,可不是等號。
小子駑鈍,照您的意思是說,我們可以從event的角度,去找到關聯類別(交易物件)囉!?
我還是不太了解關聯類別到底是啥!? 🙁
Hi milkyway:
不是這樣看待的。
從 Domain 的觀點,我已經不將之稱為「關聯類別」,而是從 “Event” 的角度來看待,來捕捉其交易物件。
關聯類別仍是關聯類別,與事件是沒有直接的關係。
所以關聯類別可以視為事件+資料保存的綜合體囉!?