本章深入探討 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)是另一種實用的表示方式:

現在狀態事件新狀態動作
LockedcoinUnlockedunlock
LockedpassLockedalarm
UnlockedcoinUnlockedthankyou
UnlockedpassLockedlock

Figure 15.8: Subway turnstile STD

重點: STT 比 STD 更適合持續演進的設計,因為文字格式更容易修改、版本控制與自動化處理。作者甚至開發了 SMC(State Machine Compiler),能直接從 STT 產生程式碼。

本章小結#

狀態圖是 UML 中表達事件驅動行為的強力工具,但不應被濫用。在敏捷開發中,優先考慮文字化的 STT 與自動化工具(如 SMC),將狀態機定義轉換為可執行的程式碼,而非維護一份精美但容易過時的圖。