在UML官方認證的分類中,「樣版」(Template)屬於高級認證的考試主題,也就是說,它是屬於比較少用且難懂的概念。一般在編寫程式的實作上,樣版的編碼同樣是屬於比較高階且難懂的,不過懂得使用樣版的開發者,可能會覺得樣版很好用,因為可以少掉一些因為型別不同而造成的重工吧!

簡單來說,樣版透過設定「參數」(Parameter)的方式,讓開發人員可以藉由繫結(Bind)不同的參數值,產生不同的繫結元素。這樣說起來有點抽象,本來就不是很容易懂得的概念,就更難以理解了。所以,偷懶一點,我們直接來看一個範例,或許就會比較容易理解。

圖1 學員清單
假設,在報名系統中,我們有一個「學員清單」(StudentList)類別,就是用來保存某一班學員的清單,我們主要設計了兩個操作,分別為:新增學員和移除學員,如圖1所示。

接著,我們又發現需要一個課程清單,但是其實課程清單跟學員清單做的事情一模一樣,只是要加入到清單中的元素不一樣;課程清單加入課程,而學員清單加入學員。

當然,我們要怎麼處理上述的情況,以便獲取一些開發彈性、節省一點開發成本,方法一定有很多種啦。比方說,我們可以透過設計一個名為「清單」(List)的樣版類別,然後把要加入到清單的元素設為參數,如圖2所示。

圖2 樣版類別

在VS2010/UML的操作上,直接新增一個類別,然後設定類別性質表中的「樣版參數」(Template Parameters),就會出現雙矩形的樣版圖示了,如圖3圖4所示。

圖3 樣版參數

圖4 樣版參數的性質表

請仔細看到圖4的樣版參數性質表中,除了參數名稱外,主要得設定參數種類。

一般如果是以我們自訂的類別、介面、列舉型別做為參數的話,那參數種類就要選擇相對應的類別、介面、列舉型別。如果是指定特定的數值的話,就要選擇字串、整數、布林。再者,也可以指定特定的操作和性質(Property),性質包含屬性和結合。

圖5 約束型別不見了
此外,在圖4的樣版參數性質表中還有一個「約束型別」(Constrainted Type),它主要搭配類別和介面參數種類使用。比方說,如果我們選擇「字串」(String)做為參數種類時,約束型別的欄位就會消失不見,正如圖5所示。

約束型別用來限制參數的類別,通常沒有指定,代表未設限。但是,如果有需要的話,我們也是可以指定特殊的類別。比方說,我們可以指定「訪客」做為約束型別,如圖6所示。一旦,我們設定訪客做為約束型別之後,就只能繫結訪客類別或者它底下的子類別,譬如此處的學員。

圖6 約束型別

不過,樣版類別是不能直接誕生個體的,因為我們還沒有指定參數值給它。所以,接下來我們可以設計兩個「繫結類別」(Bound Class),分別將學員和課程做為樣版參數的實值,繫結原先的清單樣版,如圖7所示。如此一來,在編譯(compile)時,編譯器就會以學員或課程替代掉原先的元素。

圖7 樣版類別與繫結類別

在VS2010/UML的操作上,同樣先新增一個類別,然後在類別性質表的「樣版繫結」(Template Binding)欄位,指定我們打算繫結的樣版—清單,然後再指定學員做為「元素」樣版參數的實值,如圖8所示。

圖8 樣版繫結

對了,如果剛才我們有設定「訪客」做為約束型別的話,此處的清單樣版就不能夠繫結「課程」了,因為課程不是訪客的子類別。

類別圖的價值
如果,再額外加上一項重要性的評比的話,我會覺得類別圖比其他圖都要來的重要些。類別圖之所以重要,主要在於它可以提供下列重要的價值:
● 整個系統共用的靜態結構:類別圖最有價值之處,主要是因為它提供了一個整體的靜態架構,讓整個系統可以共用。為了共用,所以必須夠穩定、必須夠彈性、必須夠好用等等,而這些都會讓它的重要性提高,也同時讓它的價值性提高。

● 支援各式用例和物件互動:用例代表著使用者具體的期望,這些都靠著穩定的類別結構在底下支撐著。

● 抽象化問題領域中的事物:類別圖反映了問題領域中重要的事物,抽象得好,系統將容易開發並維護。

● 兼具程式結構和資料結構:開發者會依照類別圖的內容來實作程式結構和資料結構。因此,類別圖設計不佳,將直接影響系統實體。

專欄作者

熱門新聞

Advertisement