準則: 關聯
關聯代表物件之間的結構關係。這個準則示範如何使用這個關係。
關係
主要說明

關聯

關聯代表不同類別的物件之間的結構關係;它們代表在某段持續時間內存在的兩個或更多類別的實例之間的連線。請對照暫時性鏈結,例如,只在作業持續時間內存在的鏈結。暫時性鏈結可以改用協同作業來建立模型,在這個情況下,鏈結只存在於特定有限的環境定義中。

您可以利用關聯來表示物件知道另一個物件。有時候,物件必須彼此保留指向對方的參照,以便互動,如相互傳送訊息;因此,在某些情況下,關聯可能會遵循序列圖或通訊圖中的互動型樣。

關聯名稱

大部分關聯都是二元的(在正好兩個類別之間),且會繪製成連接類別符號配對的實心路徑。關聯可以有名稱,或關聯角色可以有名稱。最好是有角色名稱,因為它們傳遞的資訊比較多。當只能命名一個角色時,只要預期關聯是從角色名稱所關聯的物件開始的單向連結,角色仍比關聯名稱好。

關聯通常都是在分析期間,在資訊足以適當指定角色名稱之前命名。當使用關聯名稱時,它應該反映關係的目的,而且是一個動詞詞組。關聯的名稱放在關聯路徑上,或相鄰於關聯路徑。

範例

在 ATM 中,收銀機提供自動提款機所發放的現金。為了使自動提款機能夠發放現金,它必須保留收銀機物件的參照;同樣地,如果收銀機的現金用完了,自動提款機物件必須收到通知,因此, 收銀機也必須保留自動提款機的參照。關聯便建立這個參照的模型。

範例關聯名稱

自動提款機收銀機之間的關聯稱為提供金額

關聯名稱若選得不好,可能造成混淆和誤導。下列範例說明好的命名和不好的命名。第一個圖使用關聯名稱,它們的語法正確(使用動詞詞組),但並沒有傳遞多少關係資訊。第二個圖使用角色名稱,它們傳遞了較多關聯參與特性的資訊。

圖解說明詳見隨附的文字。

關聯和角色名稱好與不好的用法範例

角色

關聯的每個端點都是一個角色,指定類別在關聯中所呈現的面貌。 每個角色都必須有名稱,相對於類別的角色名稱必須是唯一的。角色名稱應該是一個名詞,指示所關聯的物件相對於關聯起始端物件的角色。在與課務組的關聯中,教師的適當角色名稱便是講師;請避免類似 "has" 和 "contains" 的名稱,因為它們並未帶來類別關係的任何相關資訊。

請注意,關聯名稱和角色名稱的使用互斥:關聯名稱和角色名稱不能同時使用。角色名稱比關聯名稱好,除非資訊不足以適當指定角色的名稱(分析時往往如此;設計時,一律應該使用角色名稱)。沒有好的角色名稱,也就意謂著模型不完整或形態不好。

角色名稱放在關聯線端點旁。

範例

請設想訂單項目系統中各類別之間的關係。客戶可能會有兩個不同類型的地址:帳單送往一個地址,訂單送往若干地址。因此,如下所示,客戶和地址會有兩種關聯。關聯的標籤是相關地址對於客戶所扮演的角色

關聯範例

客戶地址訂單之間的關聯,顯示角色名稱和對應關係

對應關係

對於每個角色,您可以指定它的類別的對應關係,也就是這個類別可以有多少物件關聯於其他類別的單一物件。對應關係由角色上的文字表示式來指示。這個表示式是一份整數範圍清單(以逗號分隔)。範圍由一個整數(低值)、兩個點,再加上一個整數(高值)來表示;單一整數是有效範圍,'*' 符號表示「許多」,也就是無限個物件。'*' 符號本身相當於 '0..*',也就是任何數字,無也包括在內;這是預設值。選用的純量角色之對應關係是 0..1。

範例

上述範例顯示訂單和客戶之間的關聯,以及客戶和地址之間的關聯。這個圖說明訂單必須有相關聯的客戶(客戶端的對應關係是 1..1),但客戶不能有任何訂單(訂單端的對應關係是 0..*)。另外,客戶有一個帳單地址,但有一或多個出貨地址。為了使標記不雜亂,如果省略對應關係的話,便將它們假設為 1..1。

可導覽性

角色的可導覽性內容指出有可能利用關聯,從關聯的起始端類別導覽到目標類別。這可以採用許多方式來實作:利用直接物件參照,利用聯合陣列、雜湊表,或可讓物件彼此參照對方的任何其他實作技術。可導覽性是用張開的箭頭來表示,箭頭放在目標類別(導覽目標)旁之關聯線條的目標端。可導覽性內容的預設值是 true

範例

在訂單項目範例中,訂單客戶之間的關聯可以雙向導覽:訂單必須知道哪個客戶下了訂單客戶必須知道他下了哪些訂單。當沒有箭頭時,假設這項關聯可以雙向導覽。

客戶地址之間的關聯上,客戶必須知道它的地址,但地址並不知道有哪些客戶(或其他類別,因為許多東西都會有地址)關聯於地址。因此,客戶一端的可導覽性內容關閉之後,會產生下圖:

關聯的可導覽性範例

更新的訂單項目系統類別,顯示關聯的可導覽性。

自我關聯

有時候,類別會關聯於自己。這不必然表示這個類別的實例有與自己的關聯;這通常是表示類別的一個實例有與相同類別其他實例的關聯。在自我關聯的情況中,當辨別關聯的用途時,角色名稱非常重要。

範例

請設想下列包含員工 (Employee) 類別的自我關聯:

自我關聯的範例

在這個情況下,員工可以有與其他員工的關聯;如果有的話,他們便是管理人員 (manager),其他員工是他們的職員 (staff) 成員。關聯可以雙向導覽,因為員工知道他們的管理人員,管理人員也知道他的職員。

多重關聯

在類別之間繪製兩個關聯,表示物件是兩重相關;給定的物件可以透過各個關聯來鏈結到不同的物件。每個關聯都是獨立的,用角色名稱來識別。如上所示,客戶可以有對於相同類別不同實例的關聯,每個關聯都有不同的角色名稱。

角色排序

當關聯的對應關係大於 1 時,相關聯的實例可以排序。角色的依序內容表示排定了參與關聯的實例次序;依預設,它們是未排定次序的集。這個模型並不指定如何維護排序;更新依序關聯的作業必須指定更新元素的插入位置。

鏈結

關聯的個別實例稱為鏈結;因此,鏈結是實例之間的關係。鏈結可以傳送訊息,鏈結也可以指示物件之間的參照和聚集。請參閱技術:通訊圖,以取得詳細資訊。

關聯類別

關聯類別是一項也有類別內容(如屬性、作業和關聯)的關聯。它的顯示方式是從關聯路徑畫一條虛線,連到含有關聯的屬性、作業和關聯的類別符號。屬性、作業和關聯適用於原始關聯本身。關聯中的每個鏈結都會有指出的內容。最常用的關聯類別是多對多關係的核對(請參閱下面的範例)。原則上,關聯和類別的名稱應該相同,但必要的話,也可以接受分開的不同名稱。退化關聯類別只包含關聯的屬性;在這個情況下,您可以忽略關聯類別名稱來降低分開的重要性。

範例

展開先前的員工範例,請設想員工(職員)為另一位員工(管理人員)工作的情況。管理人員定期評量職員,反映他們在特定時段的效能。

這項評價不能是管理人員或職員獨有的屬性,但我們可以依下圖所示,將這項資訊關聯於關聯本身:

關聯類別的範例

關聯類別評價 (Appraisal) 會擷取關聯本身的相關資訊

限定關聯

限定元用來進一步限制和定義關聯於另一個實例的一組實例;物件和限定元值會跨越關聯來識別唯一物件組,形成一個組合索引鍵。限定通常會減少相對角色的對應關係;網路對應關係顯示關聯於第一個類別和給定限定元值之相關類別的實例數目。限定元繪製成在附加於限定類別之關聯端點的小框。它們是關聯的一部分,不是類別的一部分。限定元框可以包含多個限定元值;限定基礎是整份值清單。 限定關聯是關聯屬性的變式。

範例

請設想行項目 (Line Item)產品 (Product) 間之關聯的下列修正:行項目有一項指向所訂購產品的關聯。每個行項目都指向正好一個產品,產品則可以在多個行項目中訂購。當利用 ProductCode 限定元來限定這項關聯時,我們會額外指出每個產品都有唯一產品碼,且行項目正是利用這個產品碼來關聯於產品

限定關聯

行項目產品之間的關聯有 ProductCode 限定元。

多元關聯

多元關聯是在三個或更多類別之間的關聯,其中單一類別可以重複出現。多元關聯繪製成大的菱形,每個參與的類別都會有一個關聯路徑。這是關聯的傳統實體關係模型符號。二元形式沒有菱形,可以更加緊密,因為在真實模型中,會有大量關聯。多元關聯很少見,將它們提升到類別,也可以建立它們的模型。多元關聯也可以有關聯類別;顯示方式是從菱形畫一條虛線來連到類別符號。角色可以有角色名稱,但對應關係比較複雜,最好是藉由列出候選鍵來指定。在給定對應關係之後,對應關係代表對應於其他 N-1 個物件之給定值組的實例數目。您可以利用限定的關聯或關聯類別來刪除多元關聯的大部分使用情況。它們也可以用一般類別來取代,不過,這會失去參與物件的給定值組只能有一項鏈結的限制。