什麼是 {union}?

我有很長的一段時間,沒有關心過 UML 在國內的發展情況了。從最初在「點空間」全力推廣 UML,翻譯有關 UML 的文章,到各論壇解答一些人使用 UML 的疑問,一直到我翻譯《UML 2 百寶箱》這本書,後面的這段時光,我就轉而去注意其他技術的發展。我相信把種子撒下,後面就等著發芽成長。我從未擔心過發不出芽,或無法成長,因為這是全世界軟體工業的趨勢,台灣軟體界不能置身事外。期間我唯一擔心過的,只是《UML 2 百寶箱》這本書的銷售業績不太好。

最近我忙著整理一些東西,突然想看看國內的 UML 有什麼新鮮事,所以把 UML 做關鍵字用 Google 搜尋台灣的網頁,如我所望,出現好多以前沒看過的網站,其中除了「矇矇的秘密基地」(Kenming Wang 推廣 UML 也不遺餘力),還有另一個網站吸引住我,就是「UML Blog」,我原先點進去的是個展示用的站,但可以很清楚的連到主站。進入主站,首先看看作者介紹,接著四處逛逛,在點入「UML FAQ」這個標籤的第一篇文章,突然看見作者參考《UML 2 百寶箱》這本書的一段內容。作者邱郁惠小姐這篇文章所立的標題是「OCUP::什麼是{union}?」,內容主要是有關於 UML 的 union 標籤方面,作者把自己所悟出的結果寫成文章。問題並非邱小姐對 union 的看法好不好,而是出在《UML 2 百寶箱》的那段文字,無論是原文,或是我翻譯的,說真的,看得懂才真的佩服。

邱小姐先引用《UML 2 Toolkit》那段的原文:「
The union tag indicates a derived value from a union subsets. The subsets tag shows the opposite, that the attribute or association represents a subset of the named property. These tag values allow the modeler to clearly define the specific elements in a composition relationship.

」接著把買來的二手中譯書《UML 2 百寶箱》拿來對照:「
union(合併)標籤表明衍生值是得自於把子集合(subsets)合併起來,而subset (子集合 <特性-名稱>)標籤所顯示的正好相反,而屬性或關聯表示名稱特性的子集合。這些標籤值使塑模人員可以很清楚地定義出,合成關係裡的特定元素。

」如果不要翻譯,叫我用講的,我會說:「
union 這個標籤表示說,某元素(屬性或關聯)把其所屬子集合的名稱特性合併成衍生值,而 subsets 標籤正好相反,顯示的只是屬性或關聯的部份名稱特性,塑模人員可以使用這些標籤值在合成關係裡把這些特定元素清楚的定義出來。

」無論怎麼說,除非對此有一定的認識或了然於胸,否則又會有多少人清楚這段話講什麼。問題在於《UML 2 Toolkit》的作者完全沒有進一步闡述 union 的意思,或舉例說明。但是在 subsets 方面,倒是有個實例,但是不在第八章延伸 UML 裡,這例子放在第四章類別、物件、與其關係裡的圖 4.55(中譯版在 153 頁,英文版在 129 頁),這個圖型說明政黨領袖的關聯,是政黨成員關聯的子集合(subset),兩個關聯是以依賴關係來表示,而且沒有把依賴關係的 {subsets} 標籤清楚的列出來,所以不是很明顯。

其實,要理解 union subset 這兩個標籤,不是那麼困難。誠如邱小姐所說的,簡單的想像成聯集和子集的關係就好了,當然,用這樣的聯想是很容易,但是這並不代表完整的理解 union 或 subsets 的意思。要具體理解這兩個標籤的用法,最好的參考書,我看到的應該是 《The Unified Modeling Language Reference Manual,Second Edition》,這是 James RumbaughIvar Jacobson、和 Grady Booch 三位大師所著,品質保證。就拿 union 意思解釋來說,書中簡單的定義成:「
A declaration that a property is defined as the union of a number of explicitly specified other properties.

」而對於 union 的語意說明則為:「
Sometimes the same property (an association end or attribute) can be modeled at more than one level of granularity, where a general level covers several cases and a more specific level expands each of those cases into several more specific cases. ...

... ...

」意思大概是說,把一個特性宣告為 union,就是定義此一特性合併了一些有明確指定的其他特性。這是由於有時候我們會根據特性(關聯端或屬性)的大小,把特性分解成不同的詳細程度,並塑造在不同的層級裡,一般層涵蓋了幾種情況,把一般層的這幾種情況分成更多的特定情況,再把這些特定的情況在特定層裡去做說明,union 就是為了這種情況存在的。如果對物件導向或層級系統有點概念的,這段文字就算很清楚了。如果覺得解釋的還不夠,沒關係,這本書還有個範例,我把圖例借過來,如下所示:


這是個關聯之間 unionsubsets 的關係,最高層有兩個類別,分別是 Vehicle(交通工具)和 SteeringControl(操縱控制)。每一個類別又分成幾個子類別,像是 Vehicle 的子類別有 Car(汽車)、Boat(船)、Horse(馬),而操作控制方面卻因交通工具的不同而有所差異,像是汽車只能經由方向盤(Wheel)來操縱,船是由船舵(Tiller)來操控,馬是經由韁繩(Reins)來控制。這三種操縱方式都不相同,而且關聯到特定的交通工具。因此,把 SteeringControl 宣告成 union,而把底下的操縱控制宣告成 subsets,用來說明 SteeringControl 類別所衍生出的子類別其操縱交通工具的特性皆異,並且關聯到特定的交通工具。如此一來就能明白的表示,我們不能用方向盤來操縱馬,不可以用韁繩來控制船,然而一般化關聯(即是 /Steering 這個關聯)卻能容許不同的操縱方式。

如果你是《UML 2 百寶箱》的讀者,這篇文章就算是對 union 那段譯文的注解,也算是我對這本書的補遺。假設你並非中譯本的讀者,或是壓跟兒沒看過這本書,那看看也罷,就當成是在學習,要不是邱郁惠小姐談到《UML 2 百寶箱》,或許就不會有這篇文章了。

留言

這個網誌中的熱門文章

langue ou langage

Pattren:樣式、模式或範式

似水流年(Year Flowing Like Water)