目的
|
定義分析類別所依賴的其他類別。
定義類別必須知道的其他分析類別中之事件。
定義分析類別負責維護的資訊。
|
為了完成責任,類別經常會依賴其他類別來提供必要的行為。關聯用來說明跨類別的關係,可協助我們瞭解類別的耦合性;更深入瞭解類別耦合性及儘可能歸納耦合性,可協助我們建置更好、更具復原力的系統。
下列步驟定義類別的屬性及類別之間的耦合性:
類別利用屬性來儲存資訊。明確地說,當資訊符合下列條件時,便使用屬性:
-
「依值」參照;也就是說,它只是資訊的值,而不是資訊的位置或物件 ID(其中的較重要者)。
-
只有它所屬的物件「擁有」它;沒有其他物件會參照這項資訊。
-
由只會取得、設定資訊,或簡單轉換資訊的作業來存取;這項資訊沒有提供值以外的「真正」行為。
另一方面,如果資訊有複雜行為、有兩個或更多物件共用它,或有兩個或更多物件「依參照」來傳遞它,這項資訊就應該建模成個別的類別。
屬性名稱應該是一個清楚指出屬性保留什麼資訊的名詞。
屬性的說明應該描述屬性將儲存什麼資訊;當屬性名稱足以明顯反映儲存的資訊時,它便是選用的。
屬性類型是屬性的簡式資料類型。例如 string、integer、number。
首先,請研究將行為散佈於分析類別中所產生之互動圖中的鏈結。類別之間的鏈結表示兩個類別的物件必須彼此通訊來執行使用案例。我們開始設計系統之後,可以利用幾種方式來實現這些鏈結:
-
物件可以有「廣域」範圍,這時系統中的任何物件都可以向它傳送訊息
-
物件可以接收當作參數傳來的第二個物件,之後,它可以將訊息傳給被傳遞的物件。
-
物件與訊息所送往的物件可以有永久關聯。
-
在作業的範圍內,可以建立和毀損物件(也就是「暫時」物件),這些物件算是作業的「本端」物件。
不過,在類別「生命」初期的這個點仍太早,無法做這些決策:我們的資訊尚不足以進行有知識經驗基礎的決策。因此,我們在分析中建立關聯和聚集來代表(和「傳送」)必須在兩個類別的物件之間傳送的任何訊息。(聚集是一種特殊的關聯形式,它表示物件參與「整體/部分」的關係(請參閱技術:關聯和技術:聚集))。
我們將在作業:類別設計中,修正這些關聯和聚集。
請每個類別各繪製一份類別圖來顯示每個類別與其他類別的關聯:
訂單項目系統組件的分析類別圖範例
請只將焦點放在實現使用案例所需要的關聯;除非因互動圖而需要,否則,請勿新增您覺得「可能」存在的關聯。
請提供關聯角色名稱和對應關係。
-
角色名稱應該是一個名詞,表示所關聯的物件相對於關聯物件所扮演的角色。
-
除非清楚證明是其他情況,否則,假設對應關係是 0..*(零對多)。對應關係 0 隱含這項關聯是選用的;請確定您有這個意圖;如果物件可能不存在,使用這項關聯的作業就必須相應地調整。
-
您可以指定較窄的對應關係限制(如 3..8)。
-
在對應關係範圍內,可以指定可能性。因此,如果對應關係是 0..*,在 85% 的情況中預期是 10 和
20,請記下它;在設計期間,這項資訊非常重要。比方說,如果要利用關聯式資料庫來實作持續性儲存庫,較窄的限制有助於組織更好的資料庫表格。
請寫下關聯的簡要說明來指示如何使用關聯,或關聯代表什麼關係。
物件有時需要知道「目標」物件何時發生某項事件,而「目標」並不需要知道事件發生時會需要通知的所有物件。訂閱關聯便是這種事件通知相依性的簡單表示法,它使我們能夠用簡要的方式來表現這個相依性。
兩個物件之間的訂閱關聯表示,當被訂閱的物件發生特定事件時,訂閱起始端的物件會收到通知。訂閱關聯有一項條件,用來定義會使訂閱者收到通知的事件。如需詳細資訊,請參閱技術:訂閱關聯
訂閱關聯的條件應該透過抽象特性來表示,而不是透過它的特定屬性或作業來表示。在這個方式下,關聯起始端的物件會保持與所關聯之實體物件可能變動的內容無關。
在下列情況下,需要訂閱關聯:
-
物件會受到另一物件內發生的事件影響
-
必須建立新物件來處理某些事件,例如當發生錯誤時,必須建立一個新視窗來通知使用者
-
物件需要知道另一個物件何時產生實例、何時變更或毀損
「被訂閱」的物件通常都是實體物件。實體物件通常是被動的資訊儲存庫,含有通常與其資訊儲存責任相關的任何行為。當實體物件有了改變,許多其他物件通常都需要得知。訂閱關聯使實體物件不需要知道所有這些其他物件,這些物件只是將它的意願「登錄」在實體物件中,當實體物件有了改變,它們就會獲得通知。
目前為止,這都只是「分析花招」:在設計中,我們必須定義這項通知如何確實運作。我們可能會購買一個通知架構,也可能需要自行設計和建置。但目前只需要指出有這種通知就行了。
關聯的方向顯示只有訂閱起始端的物件知道兩個物件之間的關係。訂閱的說明完全在訂閱起始端的物件內。相關聯的實體物件則是依照一般方式來定義,完全不考慮其他物件可能對它的活動感興趣。這也隱含了您可以在不變更所訂閱之物件的情況下,在模型中新增或移除訂閱起始端的物件。
|