活動圖(Activity Diagram)是一個非常實用的圖款,適合用來具體呈現「企業流程」(Buisness Process)或「工作流程」(Workflow)等等的活動流程觀點。
雖然,以物件導向的實作技術而言,程序員無法「按圖施工」,直接將活動圖的設計內容對應成程式碼。但是,以分析師的角度來看,活動圖光是用來協助釐清並具體呈現繁雜的企業流程,其實就已經值回票價了。
所以,讓我們從活動圖開始學習UML,也讓我們從活動圖開始著手分析設計。但是,為什麼是從活動圖開始呢?在後續內容中,我會詳加說明我的看法。
優點:較少的物件導向特徵
活動圖涵蓋較少的物件導向思維和特徵,倘若以初級和中級概念來看,分析師根本不需要具備物件導向思維,就可以繪製出活動圖了。我個人認為,這是活動圖容易學習和上手的最主要原因之一。
優點:易於跟客戶溝通流程
活動圖、用例圖和循序圖是VS2010/UML圖中,具備較多流程觀點的圖款。不過,雖說它們具備流程觀點,但在實際上,這三款圖卻是以不同的角度來展現流程。
其中,以活動圖所採用的依序步驟,最能夠讓分析師用來與客戶溝通流程。至於,用例圖將流程封裝成一個個近似獨立的單元;還有循序圖則以一群物件互傳訊息的方式,來展現系統內部一群物件協力實現流程的運作過程。
優點:找尋用例並且串接用例
活動圖除了可以協助分析師釐清並具體展現企業流程外,還可以用來協助找尋用例、挖掘可能遺漏了的用例,以及用來展現用例的串接情況。
剛才我們提到了,「用例」(Use Case)將流程封裝成一個個近似獨立的單元,倘若分析師讓活動圖中的「動作」(Action),盡可能是一對一對應用例的形式,就可以透過活動圖來展現用例的串接情況了。簡單來說,動作是一個不可切割的流程片段,活動圖中包含了一組動作,透過流程動線(flow edge)來連接動作。在稍後的內容中,我們很快就會學到動作的概念了。
因此,在分析設計工作中,分析師一開始可以透過活動圖展現企業流程,並且在稍後的分析工作中,還可以善用活動圖來尋找用例,並且繪製用例圖。
更有價值的,分析師可以透過活動圖來檢驗並挖掘遺漏的用例。許多專案失敗的重要原因之一,來自於「需求暴增」。為什麼需求會暴增?追根究柢,很可能是分析師一開始便遺漏了需求,以致於客戶會在專案中後期緊急追加需求。所以,分析師可以善用活動圖來挖掘出遺漏的用例,進行更切合實際的成本估算,為客戶和公司帶來雙贏的成果。
VS2010中的活動圖
以UML官方認證的角度來看,VS2010對活動圖的支援,包含了大部分的初級概念,以及少數的中級概念,如圖1所示。
圖1 活動圖的工具箱
活動圖工具箱中的「註解」(Comment)和「連接線」(Connector),我要特別說明一下。先說註解,在所有的UML圖款中,都可以使用像便利貼圖示的註解,在其內放置備註文字。
比較特別的是此處的連接線,在VS2010中利用連接線來代替活動節點(Activity Node)之間的活動動線(Activity Edge),常見如動作之間的控制流程(Control Flow),或者動作與物件節點(Object Node)之間的物件流程(Object Flow)。動作、物件節點,都是活動節點,而之間的控制流程和物件流程即為活動動線。VS2010會視活動節點的不同,自動判斷活動節點之間該產生控制流程或者物件流程。
再者,如果我們把連接線使用在註解和元素之間的話,VS2010也會智慧地幫我們產生虛線,如圖2所示。不過,老實說,這條虛線有點問題,它多了一個實心小圓。請看到圖3,這是開源軟體StarUML中的圖示,正確的註解連接線應該是沒有實心小圓的虛線。
在後續文章中,我會分別說明活動圖中的初級概念和中級概念,現在,先從初級概念開始。動作、起訖和動線
首先,我們要來談活動圖中最最基本的概念:動作(Action)、起點(Initial Node)、活動終點(Activity Final Node)以及活動動線(Activity Edge),如圖4所示。
圖4 動作、起訖和動線
UML模式元素繁多,透過UML的「母模」(metamodel)來學習這些模式元素,有助於我們將這些模式元素分門別類,形成一個有組織的知識架構。請你先看到圖5,這是UML母模的一個小片段,UML使用自己的類別圖(Class Diagram)來呈現母模。
此處,我們先不解釋UML母模的細部概念,先來理解圖5就好了。我來解釋圖5給你聽,這張圖表達了活動節點(Activity Node)分為兩類,其中一種是動作(Action),另一種則是控制節點(Control Node)。而且,控制節點往下又細分成兩小類:其中一種控制節點為起點(Initial Node),另一種控制節點為活動終點(Activity Final Node)。
先提醒你,活動節點底下有很多種元素,圖5中的動作和控制節點只是其中兩種,後續我們有機會認識其他的模式元素時,可能會看到更多種類的活動節點。同樣的,控制節點的情況也一樣,有很多種控制節點,此處先看到其中兩個。
圖5 動作、起點與活動終點[UML母模]
接著,請你再看到圖6,我把模式元素的專有圖示秀出來,方便你一邊認識模式元素的組織結構,一邊記憶相關的圖示;畢竟UML是一種圖形語言,圖示便是它的關鍵字。
圖6 母模與圖示
圖7 報名課程的活動圖
好了,現在我們再回過頭來看一張最簡單的活動圖,如圖7所示。整張活動圖的活動流程從起點開始,中間會經過數個動作,最後控制流程會進入活動終點,然後整張活動圖就結束了。圖7具體呈現了一條簡單的報名課程流程,主要會經過三個動作,分別為:查看課程、報名課程、通知付訂,然後整條活動流程就結束了。
我們可以這麼說,一張活動圖主要表達一個活動,而這個活動呈現了一項行為(behavior)。行為可以被拆解成數個細小的步驟,或者說,數個細小的步驟組成一項行為。
因此,活動圖中包含了數個細小的動作,每一個動作即為一個不可以再往下細分的單一步驟。
此處,我們用一、兩句簡單明確的句子,來定義動作、起點和活動終點,如下:
˙動作(Action):動作是活動(Activity)中的一個步驟(single step),而且它具有不可分解的特性。
˙起點(Initial Node):當一條活動被啟動時,流程即從起點開始往下執行。
˙活動終點(Activity Final Node):任一條動線進入活動終點時,整張活動圖即告終止,即便有還未跑完的流程分支,也會全部終止。
圖8 動作的行為特性
最後,請你打開動作的性質表(Properties),我們來談動作的行為特性,如圖8所示。這四個行為特性,恰好可以分為兩組。
先來說明「正文」(Body)和「語言」(Language)。我們可以在動作的正文處,記錄這個動作的內容,並且透過此處設定的語言來解讀正文內容,所以這兩個特性其實是相關的。
比方說,我們可以在某一個動作的正文處,放置一小段C#的程式碼,然後在語言處就標示為C#,用以告知觀看者必須使用C#語言來解讀動作正文。當然,更常見的是使用一般的自然語言,像是中文或英文等等的自然語言,來撰寫動作正文。
再來,看到圖9母模中的「區域後置條件」(Local Postconditions)與和「區域前置條件」(Local Precondition),這兩者都是一種限制(Constraint)。一個動作可以包含多個限制,也就是說,一個動作執行前必須滿足前置條件,而該動作執行結束,也必須滿足後置條件。
圖9 區域的後置條件或前置條件[UML母模]
圖10 放在註解中
不過,動作的前置條件或後置條件放在動作的特性表中,無法突顯重要的限制條件。倘若,你想要突顯重要的限制條件的話,可以善用註解圖示,將限制條件放置在標示<>或<>字眼的註解圖示內,如圖10所示。
前面我們提醒過了,VS2010的註解連線圖示有誤,端點處不應該出現實心小圓的,這邊我們再度提醒你,請你特別注意正確的UML圖示。控制流程
前面,我們還留了一個「控制流程」(Control Flow)沒談,現在我們回過頭來看這個元素。首先,請你看到圖11的母模,活動動線(Activity Edge)有兩種,其中一種是控制流程,另一種是物件流程(Object Flow)。然後,活動動線的兩端會連接活動節點。
圖11 活動節點與活動動線[UML母模]
圖12 連接線(Connector)
稍前,我們也提醒過,VS2010的活動圖工具箱中提供了一個多用途的連接線,如圖12所示。點選了連接線之後,再點選來源動作的圖示,拖曳至目標動作,就會產生一條帶箭頭的實線,這條就是控制流程,如圖13所示。
圖13 控制流程
透過控制流程,可以指出來源動作執行結束之後,接著應該執行哪一個目標動作。我們先點選圖13中的連接線,打開連接線的性質表確認一下,如圖14所示。打開連接線的性質表之後,我們可以發現這個元素是控制流程,它連接兩個動作,其中的來源動作是「查看課程」,而另一個目標動作是「報名課程」。
此外,特別注意到,在圖14控制流程的性質表中,有一個「警戒條件」(Guard)的行為特性。我們可以在控制流程上頭設置警戒條件,一旦警戒條件成真(true)時,才能夠從來源動作轉換到下一個目標動作。想像一下,警戒條件就像路上的檢查哨,通過檢查哨才能夠進到下一個動作。
圖14 控制流程的性質表
圖15 警戒條件
請看圖15的範例,我們在報名課程與通知付訂之間的控制流程上,設置了一個「收到報名成功電郵」的警戒條件,如果沒有報名成功的話,就無法執行通知付訂的動作。
警戒條件的文字會放置在中括號內,這是UML的語法規定,你在編寫警戒條件時,不需要額外加中括號,任何遵守UML語法的工具都會自動加上中括號,我們可以打開控制流程的性質表確認一下,如圖16所示。
圖16 不需要加中括號
圖17 只能有一個警戒條件[UML母模]
對了,一條活動動線上頭,最多只能設置一個警戒條件。我們可以看到圖17的UML母模中,指出只能設置一個警戒條件。物件流程與物件節點
你可能會疑問,為什麼VS2010可以這麼有智慧的知道,兩個動作之間的連接線應該採用控制流程,而不是其他諸如物件流程(Object Flow)呢?簡單回答,那是因為UML語法中有規定,進入物件節點(Object Node)或者離開物件節點的活動動線,必須是可以傳遞物件或資料的物件流程。
也就是說,前面我們提到的控制流程是無法傳遞物件或資料的。如果某一個來源動作執行結束之後,會產出某些物件或資料傳遞給下一個目標動作時,就必須改用物件流程來傳遞產出的物件或資料了。請你找到活動圖工具箱中的矩形圖示,那個就是物件節點的圖示,如圖18所示。
圖18 物件節點與動線
假設,報名課程動作執行完後,會產出一份填寫完整的「報名表」資料給下一個目標動作的話,那我們就可以放置一個物件節點,並且建立報名課程動作與報名表物件節點之間的物件流程,如圖19所示。
圖19 報名表
你可以練習畫出圖圖19的活動圖,然後一一點選活動動線,你就會發現除了連接報名表的兩條動線是物件流程,其他動線都是控制流程。請看到圖20的性質表,這是報名課程和報名表之間的物件流程的性質表,我們可以看到在物件流程上頭,一樣可以設置警戒條件。
圖20 物件流程的性質表
其餘四個特性都屬於高級概念,通常用在即時系統(Real-Time System)的設計上,商用系統幾乎用不到,所以除了少用,同時也比較難懂,無怪乎UML官方把它們歸到高級概念。正因如此,所以我們也就不打算談這四項高級概念了。
細心的你可能有發現到,圖20中的報名表是一種活動節點。沒錯,物件節點也是活動節點的一種,前面我們提到了兩種活動節點,分別為:動作和控制節點,這邊又多了認識了一種活動節點,如圖21所示。
圖21 物件節點也是活動節點的一種
至於,用來表達物件或資料的物件節點,除了「型別」(Type)的特性屬於初級概念外,其餘三項概念都屬於中級概念,我們一樣留到中級概念介紹時才來說明,如圖22所示。
圖22 物件節點的性質表
物件節點可能代表某一個類別(Class)所誕生的物件,也可能代表一項資料;因此,我們可以指定物件節點的型別為某一個類別,讓活動圖中的物件節點與類別圖中的類別連結起來。
圖23 註冊(Registration)
比方說,我們可以先產生一個名為「註冊」(Registration)的類別,如圖23所示。接著,打開報名表物件節點的性質表,將其中的型別設定成此處的註冊類別。
設定了物件節點的型別之後,回過頭來看活動圖,你會發現活動圖中的物件節點已經出現了所屬的類別名稱了,如圖24所示。特別注意到,「物件:類別」這樣的表示格式是UML的規定,物件名稱寫在前面,中間以冒號隔開類別名稱。
圖24 報名表:Registration
圖25 指定或不指定型別[UML母模]
既然要學UML,那我們就認真並深入的學個整套吧!所以,最後我們還是要來看一下UML母模,看它是怎麼描述物件節點和型別之間的關係的,如圖25所示。物件節點可以指定最多一個型別,或者根本就不指定型別,也可以。
除了前面看到的物件節點,還有輸入栓(Input Pin)、輸出栓(Output Pin)和活動參數節點(Activity Parameter Node),其實都是物件節點的一種,如圖26所示。不過這三種物件節點,就是下一回要介紹的內容了。
圖26 物件節點、栓和活動參數節點
專欄作者
熱門新聞
2024-12-27
2024-12-24
2024-11-29
2024-12-22
2024-12-20