狀態圖::內部遷移
在為昨天的文章寫說明的時候,發現狀態圖中有錯誤,所以今天的文章就從糾錯開始。需求不變。
背景
還是先回到交通信號系統的例子,編程也好,設計也好,都講究一個對稱,交通信號系統有啟動過程,同樣也應該有停止過程。需求大致如下:
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)