EA&UML日拱一卒--活動圖::活動
上篇文章說明對象流相關的內容,但是迴避了解方程的細節,這部分在留給接下來的文章來說明。今天的內容是說明活動(activity)的概念以及活動的動作機制。
語義
活 動是對行為的說明,它描述了計算過程順序和並發的步驟。狀態機和活動有相似之處,它們都描述了一段時間中出現的狀態序列以及引起狀態之間改變的條件。兩者 的不同點在於狀態機關注的是執行或者經歷一次計算的單個對象的狀態,而活動關注的則是計算本身的狀態,它可能跨越多個對象,並且顯式地對活動節點之間的控 制流和信息流建模。
活動具有輸入和輸出參數,分別代表了提供給活動執行所需的值以及執行活動所產生的值。活動可以作為參數化的行為(behaviour)附加到其他各種行為上。
動作(活動也一樣)要求其所有的輸入上都出現令牌,並且會在所有的的輸出上都產生令牌。
執行規則基本上是並發的。如果兩個活動節點被不同的令牌集合激活,那麼它們可以並發執行。這意味著節點之間沒有內在的執行順序。
----UML參考手冊(第二版)
示例
上面的內容來自UML參考手冊,理解中文本身沒有問題,但是和實際結合起來就沒有那麼容易了。我們以前一篇文章中那個解一元二次方程流程為例進行說明。這部分就來就是原創了。先上圖。
中間的圓角方框SolveEquation中的內容就是活動。該活動是對解一元二次方程的說明,它描述了計算過程順序和並發的步驟。
SolveEquation活動具有3個輸入參數(係數a,b,c)和1個輸出輸出參數solution,分別代表了提供給活動執行所需的值以及執行活動所產生的值。
SolveEquation的執行是並發的。如果兩個活動節點被不同的令牌集合激活,那麼它們可以並發執行。這節點之間沒有內在的執行順序。
當InputA動作(這裡假設得到的a!=0)完成以後,執行令牌轉移到InputB的同時,SolveEquation的輸入a也得到執行令牌,SolveEquation內部使用a變數的節點的輸入pin也同時得到令牌。
這裡也包含判斷a是否為0的判斷節點。判斷節點只有一個輸入,已經具備了執行條件,因為a不等於0,所以計算delta值的動作的a管腳的得到令牌。
參見下圖中紅線部分。這一切可以認為是和InputB並發執行的。
在a!=0這個分支中一共有四個處理,下面3個處理需要等待delta的計算結果。而計算delta的處理需要等待b, c兩個輸入管腳上的令牌。
InputB處理結束以後,InputC處理的同時,b管腳得到令牌,同時分發給SolveEquation處理內部各個Action的b管腳。參見下圖中藍線部分。
這時計算delta的處理還差c管腳上的令牌沒有到達,所有處理繼續等待。
InputC處理結束後,c管腳得到令牌,分發給所有粉色線相連的管腳。終於可以計算delta值了。
delta值計算完成以後,根據判斷結果,執行令牌被傳送到適當的處理。該處理結束後,在輸出管腳生成計算結果並隨著令牌轉移給SoloveEquation活動的輸出管腳上。
接下來計算結果伴隨著令牌轉移到表示結果的ShowSolution處理後,整個流程結束。
你理解了么?
以上就是今天的文章,如果它能給您帶來些許收穫,歡迎點贊並推薦給您的朋友!
閱讀更多更新文章,請關注【面向對象思考】微信公眾號!
推薦閱讀:
※狀態圖::遷移
※Python面向對象小總結
※EA&UML日拱一卒--類圖::枚舉類型(enumeration)
※實用OOPC
※EA&UML日拱一卒--活動圖::活動分區