在UML各款圖中,我認為類別圖比其他圖都要來的重要些。類別圖有幾項重要的價值,包括提供了一個整體的靜態結構,讓整個系統可以共用。也可以支援各式用例和物件互動,能抽象化問題領域中的事物,除此之外,類別圖還能同時提供程式結構和資料結構。

下列這些條目是我個人研究並使用UML/OOAD十多年來,萃取出來關於類別圖的最佳實務,條列出來跟你分享一番:

1. 從「人事時地物數」中尋找物件:其實尋找物件並不難,多練習幾次,眼光就會比較準確啦!不過,我個人有一個簡單的物件種類歸納,歡迎你拿來參考使用,如下:

● 人:個人、角色、職務、種族、團隊、組織。

● 事:事件、交易、工作片段、步驟、流程、計畫。

● 時:時間、日期、時間片刻、時段。

● 地:地點、地圖、路線、路徑、目標。

● 物:物品、種類、軟體系統、硬體設備。

● 數:演算法、數學公式、運算、操作。

2. 可以套用交易樣式但別因此受限於交易樣式:交易樣式或者各式的分析樣式,其實多多認識、練習套用都有助於繪製出更棒的類別圖的,但千萬別因此而受限於這些名家的樣式上頭,什麼樣的狀況、什麼樣的領域,都想要硬套樣式,這樣會過猶不及,也不是件好事啦。

3. 無須太早「分派責任」給物件:分派責任本來就是比較困難的工作,所以不需要強迫自己太早為物件定義操作。在繪製類別圖時,不妨依序尋找類別、結合關係、個體數目、屬性、組合關係或聚合關係、一般化關係,最後才是透過繪製循序圖的過程,順便分派責任、定義操作。

4. 善用用例敘述和循序圖來定義並檢驗物件的操作:上一條已經提過,繪製類別圖時,晚些考慮操作,可以延後到繪製循序圖時,才將在循序圖中所建立的訊息,同步回饋且對應成類別圖中的物件操作。至於,已經定義好的物件操作,也可以透過繪製循序圖的過程,一次又一次地檢驗物件操作是否分派妥當、顆粒度是否適中、以及責任是否明確等等。

5. 分析階段採用預設的能見度:性質(包含屬性和結合端)的能見度預設為私有等級,至於操作的能見度則預設為公開等級。分析階段採用預設的能見度就可以了,不需要強制要求分析師一定要能夠分辨能見度。不過,能見度會直接反應在實作上,所以設計階段的類別圖一定要釐清能見度。目前UML預設的能見度等級有四種,依照透明程度,從最透明到最不透明依序為:公開等級、套件等級、保護等級、私有等級。

6. 盡量別用聚合關係:在實作上,聚合關係與結合關係的編碼相同,通常只有組合關係要特別注意,實作上會有差別。所以,我會建議,如果不是組合關係這種強烈的「整體─部分」關係的話,就用一般的結合關係就好了,盡量別用聚合關係。

7. 子類別最好盡量少重新定義繼承而來的一切:子類別透過一般化關係,其實可以繼承四個部份,分別為:語意(概念)、性質、操作、限制(Constraint)。其中的性質包含了屬性和靜態關係,像是結合關係、聚合關係和組合關係。還有,子類別也會繼承父類別身上的限制,這是一般比較少提到的。子類別繼承了這一切之後,當然都是可以重新定義的,但是我們會希望盡量少重新定義,這樣就不需要花時間去查知子類別到底重新定義了什麼,同時繼承架構也會單純些。

8. 重新定義繼承而來的結合關係時,才需要重新繪製結合關係:如果子類別沒有重新定義結合關係上頭的結合名稱、個體數目等等的特性時,通常不需要特別繪製出繼承而來的結合關係,這就跟子類別不會特別顯示出繼承而來的屬性與操作一樣。

請看到圖1的範例,原先訪客和密碼之間的個體數目是「0..1」,表示可以設置一個密碼,也可以不設置密碼。但是,若我們規定所有學員一定要設置一個密碼,所以必須重新定義個體數目才行,因此重新繪製了結合關係,如圖2所示。

圖1 訪客可以不設密碼

圖2 學員一定要設一個密碼

9. 最好以概念而非功能的角度建立一般化關係:在一般化關係的架構中,所有參與其中的類別必須屬於同一種概念,像是:滑鼠(父類別)、有線滑鼠(子類別)、無線滑鼠(子類別),如圖3所示。

圖3 以概念為主

圖4 誤用一般化關係
有些無線滑鼠具備簡報筆的功能,千萬別因為想要繼承簡報筆的功能,而建構了簡報筆(父類別)、雷射筆(子類別)、無線滑鼠(子類別)的一般化架構,如圖4所示。這是一種誤用,因為在概念分類上,我們不會說「無線滑鼠是一種簡報筆」,通常我們會說「無線滑鼠有簡報筆的功能」。

10. 抽象類別與介面是不同的,前者是概念導向,後者則是服務導向:通常抽象類別不會獨自存在,而是會搭配著一般化關係出現,透過一般化關係讓子類別繼承抽象父類別定義好的一切。早期的程式語言還未完整支援物件導向技術時,曾經把抽象類別挪用做介面,因此造成很多開發人員會不小心混用抽象類別與介面。雖然,抽象類別確實具有介面特性,但是它跟介面還是不同的。

比方說,前頭的圖4的範例,如果我們改成圖5,讓雷射筆和無線滑鼠都實現簡報功能介面,這樣它們不就都具備了簡報功能了嗎!

圖5 實現簡報功能

而且,無線滑鼠如果不想自己實現簡報功能,其實也無妨,也可以透過依賴關係委託雷射筆提供實作,如圖6所示。或者,也可以讓雷射筆繼承簡報筆已經事先定義好的一切,如圖7所示。

圖6 透過依賴關係委託雷射筆提供實作
圖7 抽象類別與介面

介紹完這些類別圖最佳實務,你必須實際運用才能了解它的助益,下一回,我將用一個實際案例來示範如何繪製類別圖。

專欄作者

熱門新聞

Advertisement