以UML官方認證的角度來看,VS2010對活動圖的支援,包含了大部分的初級概念,以及少數的中級概念。在前兩回文章中,我們已經認識了活動圖的初級概念,現在開始進入中級概念。在接下來的內容中,除了會介紹新的控制節點,也會回頭來談前面保留下來,未談完的特殊性質。

分叉節點與會合節點
這兩天看了一本好書《學習要像加勒比海盜》,書中提到:「新的知識如果能找到舊的知識架構做連接,它會依附得比較牢固。」我相信這個學習的方法,而我們現在正是用這個方法來學習新的UML元素。

所以,請你看到圖1的UML母模,「分叉節點」(Fork Node)和「會合節點」(Join Node)也是一種控制節點,跟其他的控制節點相同,主要都是用來控制、調節活動流程。

圖1 控制節點[UML母模]

圖2 分叉節點與會合節點

 

 

 

 

 

 

接著,我們來看分叉節點和會合節點的圖示,它們共用粗線條直線的圖示,如圖2所示。其實,UML共用圖示的情況不多,不過在活動圖的圖示上,就遇到了三個共用圖示的情況。你還記得另外兩種情況嗎?其中一種是活動和動作共用圓角矩形,另一種則是判斷節點和合併節點共用大的空心菱形。

先來看分叉節點,顧名思義,一條動線進入分叉節點之後,就可以分叉出多條「並行分流」(concurrent flow)。並行分流進入會合節點之後,便可以把分叉的支流再度會合起來。所以,在會合節點的圖形上,會呈現多條進入動線、一條離開動線的模樣。

以報名課程的流程為例,已經付了上課的訂金之後,可以並行購買課程教材,以及下載教材簡報,如圖3所示。不過,要特別注意的是,這裡除了並行執行這兩個動作外,整條流程會先暫停在會合節點處,等到兩個並行分流都執行結束、會合之後,整條流程才會繼續往下走。

圖3 並行支流

會合節點跟之前談到的合併節點,兩者其實很容易混淆初學者。請你看到圖4,我們把會合節點和合併節點這兩個概念,放在同一張活動圖中。

圖4 合併節點與會合節點

簡單來看,合併節點不需要等待支流,任一條動線進入合併節點之後,都可以往下進行。但是,會合節點則相反,它必須等待所有支流都到齊之後,才能繼續往下執行。

最後,我們打開分叉節點和會合節點的性質表來看,沒什麼特別的特性需要認識的。對了,粗線圖示有兩個方向可以選擇,你可以在方向的欄位處,選擇「橫向」(Horizontal)或「直向」(Vertical)。發送信號動作與接收事件動作
圖5 分叉節點與會合節點

 

 

 

 

 

 

 

發送信號動作」(Send Signal Action)與「接收事件動作」(Accept Event Action)兩者之間並沒有特殊關係,不需要一塊出現,也沒有共用圖示,純粹只是這兩個概念剛好都涉及到重要事件,所以就放在一起談,如圖5所示。

不用說了,你現在應該跟我一樣習慣,會想先知道在UML母模中,發送信號動作和接收事件動作,跟哪個概念有關?回憶一下,之前談到了三種活動節點,分別為:動作、物件節點、控制節點,而此處的發送信號動作和接收事件動作歸屬於「動作」(Action),如圖6所示。

圖6 栓可以指定型別或不指定

其實,接收事件動作和發送信號動作這兩個概念,簡單好懂又實用。簡單來說,接收事件動作就是在「等待」某一個特定事件發生,而發送信用動作則相對的是在「產生」某一個特定的信號。

以前面的報名課程流程來看,使用者在填寫報名課程完畢之後,主辦單位會發出一封報名成功的電子郵件,所以我們可以新增一個名為「發送報名成功電郵」的發送信號動作,如圖7所示。

圖7 發送信號與接收事件都是動作的一種[UML母模]

然後,整條報名課程的流程會先暫停住,通常會等待個幾天之後,等使用者轉帳付訂並且電郵通知主辦單位後,整條流程才會繼續往下跑。所以,我們把原先的「通知已付訂金」動作,改成此處的接收事件動作,或許會更為合適。

最後,我們打開兩者的性質表來看看,先看到圖8的發送信號動作性質表。除了發送信號動作的名稱之外,還有區域後置條件與區域前置條件,你有沒有印象好像在哪裡看過這兩個特性?

圖8 發送信號動作的性質表

回想起來了嗎?就在前兩回我們首度談到動作的概念時,曾經看過它的性質表,裡頭就有區域後置條件與區域前置條件。

由於,發送信號動作和接收事件動作都是動作的一種,所以它們繼承了動作的區域後置條件與區域前置條件的特性。所以,同樣地,請你在打開接收事件動作的性質表來看,一定也會看到區域後置條件與區域前置條件的特性,如圖9所示。

圖9 接收事件動作的性質表

不過,你一定已經發現到接收事件動作多了一個是否為「反序列」(IsUnmarshall)的特性,它的預設值是「否」(False)。反序列特性的預設值為否,意味著接收事件動作會把接收到的「事件物件」(event object),整個物件放到輸出栓(Output Pin)中,如果需要輸出事件物件的話。

相反的,如果反序列設定值改成「真」(True)的話,意味著事件物件中的屬性(attributes)會被拆出來放到多個輸出栓中。

以物件導向技術而言,大多採用序列化的技術,將物件的屬性封裝在一起傳送,所以這裡的反序列特性預設值才會被設成「否」。呼叫行為動作與呼叫操作動作
圖10 呼叫行為動作與呼叫操作動作

 

 

 

 

 

 

 

最後,我們來看另兩個還未談到的中級概念 「呼叫行為動作」(Call Behavior Action)和「呼叫操作動作」(Call Operation Action),如圖10所示。

接著來看在UML母模中,呼叫行為動作和呼叫操作動作被歸屬在哪個概念底下,如圖11所示。其實,在前面出現發送信號動作的UML母模時,我們已經看到了「調用動作」(Invocation Action),不過當時沒做任何解釋,現在這邊又出現了,而且它的底下還多了一個「呼叫動作」(Call Action)。

簡單來看,調用動作或呼叫動作都是動作的一種,比較特別的是,它們是一種會引發(invoke)行為的動作。也就是說,呼叫行為動作和呼叫操作動作,其實都是一種會引發行為的動作;更仔細的區分的話,呼叫行為動作會引發「行為」(behavior),而呼叫操作動作則是會引發「操作」(operation)。

圖11 呼叫動作[UML母模]

圖12 類別與操作

 

 

呼叫操作動作比較容易懂,所以我們先來看這個概念的範例。請你看到圖12,我們先產生一個名為「簡報」(Slide)的類別,其內有一個「下載」(Download)的操作。

接著,我們把原先的「下載教材簡報」動作刪除,重新改成此處的呼叫操作動作,請點選VS2010活動圖工具箱內的呼叫操作動作圖示,把它新增到活動圖中,並且命名為「下載教材簡報」,如圖13所示。

圖13 呼叫操作動作

不過,這樣還不夠,我們還得打開呼叫操作動作的性質表,設定它的「操作」(Operation)欄位為簡報類別的下載操作,如圖14所示。再者,在呼叫操作動作的性質表中,我們還得設定這個操作是同步還是非同步,它的預設值是「真」(True),也就是說,這是個同步操作。

圖14 呼叫操作動作的性質表

在UML圖示上,呼叫操作動作的圖示採用圓角矩形,就跟一般的動作圖示相同,要不是設定了操作之後,會在呼叫操作動作名稱底下多一行,用小括號框住的類別和操作字串的話,兩者其實是分辨不出來的,如圖15所示。至於,呼叫行為動作呢?就是會引發「行為」。相較之下,呼叫操作動作引發「操作」,操作是很小的動作片段,而「行為」則是指較大、較複雜、較長時間的一連串動作的組合。

圖15 類別::操作

圖16 類別::操作

 

 

 

 

 

因此,我們可以用呼叫行為動作來代表一個「活動」,一個內部包含許多小動作的活動。比方說,在教學單位中,報名課程之後會進行課程,然後會有課後評估等等,這樣的一條流程中,每一個活動底下都包含了更小的動作,所以適合使用呼叫行為動作來表達這幾個活動,如圖16所示。

不過,呼叫行為動作的圖示同樣採用圓角矩形的圖示,所以你現在應該馬上可以聯想到,是否應該在性質表中設定「行為」(Behavior),在圖示上頭才能分辨出呼叫行為動作和一般的動作的不同。沒錯,正是如此,所以我們打開呼叫行為動作的性質表,指定另一張名為「報名課程」的活動圖,做為它所引發的行為,如圖17所示。

圖17 類別::操作

一旦,我們設定了呼叫行為動作背後將引發的另一條活動流程之後,圖示上將會有所不同,會出現一個向下的階層圖示,如圖18所示。這樣一來,是不是就立即可以判斷出來「報名課程」正是一個呼叫行為動作。

圖18 類別::操作

 

 

 

 

到目前為止,我們已經談完了新的中級概念元素,下一回,我們要回過頭來談物件節點、活動參數節點、輸入栓與輸出栓,這幾個初級概念中有關的中級概念特性。

專欄作者

熱門新聞

Advertisement