狀態圖::內部遷移

在為昨天的文章寫說明的時候,發現狀態圖中有錯誤,所以今天的文章就從糾錯開始。需求不變。

背景

還是先回到交通信號系統的例子,編程也好,設計也好,都講究一個對稱,交通信號系統有啟動過程,同樣也應該有停止過程。需求大致如下:

1.操作者通過操作停止按鈕關閉系統

2.如果系統處於準備狀態(雙方向紅燈),則直接關閉。

3.如果某個方向處於通行狀態(綠燈),則切換成安全停止狀態(黃燈),安全停止時間經過以後,系統關閉。

4.如果正處於安全停止狀態(黃燈),安全停止時間(不需要重新開始計時)經過以後,系統關閉。

5.任何一種情況,斷電之前系統必須處於雙方向紅燈狀態。

加入了停止過程之後,交通信號系統的狀態圖變成下面這個樣子。為了說明方便,狀態圖中的相關要素進行了著色處理。

追加處理說明

操作者通過操作停止按鈕關閉系統

從狀態圖的角度來看,就是系統收到了一個ShutDownSwitchPressed事件。

如果系統處於準備狀態(雙方向紅燈),則直接關閉。

因為雙方向信號已經都是紅燈,所以系統可以直接停止。從狀態圖來說就是Idle狀態中如果發生ShutDownSwitchPressed事件,直接遷移到完了狀態。參見圖中的紅色遷移。

如果某個方向處於通行狀態(綠燈),則切換成安全停止狀態(黃燈),安全停止時間經過以後,系統關閉。

如 果系統處於Road1Go狀態時發生了ShutDownSwitchPressed事件,那麼不等Road1GoTimeout發生,系統就會從 Road1Go狀態遷移到Road1StopSafely狀態(藍色遷移線)。與此同時,作為ShutDownSwitchPressed遷移的效應行 為,ShutingDown標誌被設為true(藍框內處理)。

Road1StopSafely狀態的處理正常進行,等 Road1StopSafelyTimeout事件發生以後系統離開Road1StopSafely(粉色遷移),遇到choice偽狀態,對 ShutingDown的狀態進行判斷,如果結果為true,則遷移到完了狀態(綠色遷移)。

如果正處於安全停止狀態(黃燈),安全停止時間(不需要重新開始計時)經過以後,系統關閉。

如果這時發生了,ShutDownSwitchPressed事件,則系統發生一次內部遷移,狀態的進入行為和退出行為都不會被執行,只是執行內部遷移的效應行為,ShutingDown標誌被設為true(粉色框內處理)。

Road1StopSafely 狀態的處理正常進行,等Road1StopSafelyTimeout事件發生以後系統離開Road1StopSafely(粉色遷移),遇到 choice偽狀態,對ShutingDown的狀態進行判斷,如果結果為true,則遷移到完了狀態(綠色遷移)。

任何一種情況,斷電之前系統必須處於雙方向紅燈狀態。

Road1StopSafely狀態的退出行為將Road1方向的信號設定為紅色,可以保證兩個方向的信號均為紅色。

參考資料:

14.2 Behavior StateMachines (8)--內部遷移

14.2 Behavior StateMachines (10) --記法

打開方法如下:

1.進入【面向對象思考】 公眾號

2.打開【UML】-【UML2.5中文譯文】菜單

3.選擇【狀態圖】分類

4.選擇相關文章

以上就是今天的文章,歡迎點贊,關注並推薦給您的朋友!

閱讀更多更新文章,請關注【面向對象思考】微信公眾號!


推薦閱讀:

EA&UML日拱一卒--序列圖(Sequence Diagram)::連續
EA&UML日拱一卒--活動圖::活動分區
R語言學習筆記——R語言面向對象編程系列2
狀態圖::開篇
EA&UML日拱一卒--類圖::協作(collaboration)

TAG:面向對象編程 | 面向對象分析與設計 | UML建模 |