本章深入探討 UML 的狀態轉換圖(State Transition Diagram, STD),這是描述有限狀態機(Finite State Machine, FSM)的標準符號。FSM 在 GUI 互動、通訊協定與事件驅動系統中非常實用。
基本概念#
狀態圖的基本元素:
- 圓角矩形代表狀態(State)
- 箭頭代表轉換(Transition),標記格式為
event / action - event 是觸發轉換的事件
- action 是轉換發生時執行的動作

Figure 15.1: Simple login state machine
以登入狀態機為例:使用者輸入密碼(event),系統驗證後(action)決定轉換到「已登入」或「已鎖定」狀態。
特殊事件(Special Events)#
UML 狀態圖支援三種特殊事件:
- entry:進入狀態時自動觸發的動作
- exit:離開狀態時自動觸發的動作
- 自訂事件:在狀態內部處理的事件

Figure 15.2: States and special events in UML
自反轉換(Reflexive Transition)#
自反轉換是指從某個狀態觸發後回到同一個狀態的轉換。要注意的是,自反轉換會觸發 exit 和 entry 動作——先執行 exit,再執行 entry。

Figure 15.3: Reflexive transition
注意: 自反轉換與「內部轉換」不同。內部轉換不會觸發 exit 和 entry 動作,而自反轉換會。這個差異在設計 FSM 時容易被忽略。
超狀態(Superstates)#
當多個狀態共享相同的轉換時,可以用超狀態來消除重複:
- 將共享轉換的狀態群組成一個超狀態
- 超狀態上的轉換自動適用於所有子狀態
- 子狀態可以覆蓋(Override)超狀態的轉換

Figure 15.5: Overriding superstate transitions
階層式 Entry/Exit 動作#
超狀態也可以有自己的 entry 和 exit 動作,執行順序遵循階層規則:
- 進入子狀態時:先觸發超狀態的 entry,再觸發子狀態的 entry
- 離開子狀態時:先觸發子狀態的 exit,再觸發超狀態的 exit

Figure 15.6: Hierarchical invocation of entry and exit actions
初始與最終虛擬狀態#
- 初始虛擬狀態(Initial Pseudostate):實心圓點,代表狀態機的起始點,會自動轉換到第一個真正的狀態
- 最終虛擬狀態(Final Pseudostate):牛眼符號,代表狀態機結束

Figure 15.7: Initial and final pseudostates
使用 FSM 圖的時機#
技巧: FSM 圖最適合用在系統的行為是眾所周知且需要精確定義的場景,例如通訊協定、UI 互動流程等。不要對每一個物件都畫狀態圖——只在行為確實複雜且需要釐清時才使用。
狀態轉換表(State Transition Tables, STT)#
除了圖形化的 STD 之外,文字化的狀態轉換表(STT)是另一種實用的表示方式:
| 現在狀態 | 事件 | 新狀態 | 動作 |
|---|---|---|---|
| Locked | coin | Unlocked | unlock |
| Locked | pass | Locked | alarm |
| Unlocked | coin | Unlocked | thankyou |
| Unlocked | pass | Locked | lock |

Figure 15.8: Subway turnstile STD
重點: STT 比 STD 更適合持續演進的設計,因為文字格式更容易修改、版本控制與自動化處理。作者甚至開發了 SMC(State Machine Compiler),能直接從 STT 產生程式碼。
本章小結#
狀態圖是 UML 中表達事件驅動行為的強力工具,但不應被濫用。在敏捷開發中,優先考慮文字化的 STT 與自動化工具(如 SMC),將狀態機定義轉換為可執行的程式碼,而非維護一份精美但容易過時的圖。