5.3.1 對簡單依賴建模
一種常見的依賴關係是兩個類之間的連接,其中的一個類知識使用另一個類作爲它的操作參數。
對這種使用關係建模,要做如下的工作:
- 創建一個依賴,從含有操作的類指向該操作用作參數的類。
5.3.2 對單繼承建模
在對系統的詞彙建模中,經常會遇到在結構和行爲上與其他的類相似的類。
可以把這樣的每一個類建模爲獨立的、不相關的抽象。
但更好的方法是提取所有共同的結構特徵和行爲特徵,並把它們提升到較爲一般的類中,特殊類從中繼承這些特徵。
對繼承關係建模,要做如下的工作:
- 給定一組類,尋找兩個或兩個以上的類的共同職責、屬性和操作。
- 把這些共同的職責、屬性和操作提升到較爲一般的類中。如果需要,創建一個新類,用以分配這些元素(但要小心不要進入過多的層次)。
- 畫出從每個特殊類到它的較一般的父類的泛化關係,用以表示特殊的類繼承較一般的類。
5.3.3 對結構關係建模
當用依賴或泛化關係建模時,可能是對錶示了不同重要級別或不同抽象級別的類建模。給定兩個類間的依賴,則一個類依賴另一個類,但後者沒有前者的任何信息。給定兩個類間的泛化關係,則子類從它的父類繼承,但弗雷沒有任何子類所特有的信息。簡而言之,依賴和泛化關係都是不對稱的。
當用關聯關係建模時,是在對相互同等的兩個類建模。給定兩個類間的關聯,則這兩個類以某種方式相互依賴,並且常常從兩邊都可以導航。依賴是使用關係,泛化是“ is - a - kind - of”關係,而關聯描述了類的對象之間相互作用的結構路徑。
對結構關係建模,要做如下工作:
- 對於每一對類,如果需要從一個類的對象到另一個類的對象導航,就要在這兩個類之間說明一個關聯。這是關聯的數據驅動觀點。
- 對於每一對類,如果一個類的對象要與另一個類的對象相互交互,而後者不作爲前者的過程局不變量或者操作參數,就要在這兩個類之間說明一個關聯。這是關聯的行爲驅動觀點。
- 對於這樣的每一個關聯,要說明其多重性(特別是當多重性不爲*時,其中*是默認的多重性)和角色名(特別是在有助於解釋模型的情況下)。
- 如果關聯中的一個類與另一端的類相比,前者在結構或者組織上是一個整體,後者看起來像它的部分,則在靠近整體的一端用一個菱形對該關聯進行修飾,從而把它標記爲聚合。
怎樣才能知道一個給定類的對象何時必須與另一個類的對象相互作用?
答案是,CRC卡和用況分析非常有助於考慮結構性和行爲性腳本。在有兩個或兩個以上的類用數據關係進行交互的地方說明一個關聯。
CRC卡
在CRC建模中,用戶、設計者、開發人員都有參與,完成對整個面向對象工程的設計。
CRC(Class-Responsibility-Collaborator)卡是一個標準索引卡集合,每一張卡片表示一個類。
類名在最上方,類的職責在左側,類的協作關係放在右側。
5.4 提示和技巧
在用 UML 對關係建模時,要遵循如下策略:
- 僅當被建模的關係不是結構關係時,才使用依賴。
- 僅當關系時“ is-a-kind-of ”關係時,才使用泛化。往往可以用聚合代替更多繼承。
- 小心不要引入循環的泛化關係。
- 一般要保持泛化關係的平衡;繼承的層次不要太深(大約多於 5 層應該想一想),也不要太寬(代之以尋找可能的中間抽象類)。
- 關聯主要用於對象間有結構關係的地方。不要用關聯來表示暫時關係,例如過程的參數或局部變量。
在用 UML 繪製關係時,要遵循如下策略:
- 要一致地使用平直的線或斜線。平直的線給出的可視化提示強調了相關事物之間的連接都集中到一個共同事物。在複雜的圖中斜線則經常有更好的空間效果。
在同一個圖中使用兩種線型,有助於把人們的注意力引導到不同的關係組上。
- 除非絕對必要,否則要避免連線交叉。
- 僅顯示對理解特定的成組事物必不可少的關係。避免使用多餘的關係(個別是多餘的關聯)。