狀態機圖(State Machine Diagram),是用於描述單一物件在其生命週期中,因事件觸發而產生的狀態變化的重要工具。狀態機圖的主要目的是幫助開發者和設計者理解對象在其生命周期內的行為和狀態變化,並作為系統設計和實現的工具。它可以用於需求分析、系統設計、嵌入式系統開發和文檔編寫等階段。
狀態機圖的核心概念
狀態機圖主要用於描述單一物件在其生命週期內,由於事件觸發而產生的狀態變化。它著重於「物件在不同時間點可能處於的狀態」,以及「導致這些狀態變化的事件」。與活動圖著重於流程不同,狀態機圖更關注物件的狀態及其轉換。
狀態機圖的基本元素
狀態(State):代表物件在某個時間點的狀況或條件。以圓角矩形表示,矩形內寫上狀態名稱。
- 範例: 「未登入」、「已登入」、「購物中」、「已付款」、「已出貨」。
初始狀態(Initial State):表示物件的起始狀態,以實心圓表示。一個狀態機圖通常只有一個初始狀態。
結束狀態(Final State):表示物件的最終狀態,以帶有實心圓的圓圈表示。一個狀態機圖可以有多個結束狀態。
轉換(Transition):表示狀態之間的變化,以帶箭頭的線段連接兩個狀態。箭頭的方向表示狀態變化的方向。轉換上通常會標示觸發轉換的事件(Event)和守護條件(Guard Condition,可選)。
事件(Event):觸發狀態變化的觸發器,例如使用者操作、時間觸發、訊息接收等。
守護條件(Guard Condition):一個布林表達式,只有在該條件為真時,轉換才會發生。以
[]
方括號括起來表示。
狀態機圖的類型
簡單狀態機圖: 只包含基本元素,描述簡單的狀態轉換。
階層式狀態機圖: 允許狀態的巢狀結構,用於描述更複雜的狀態轉換。一個狀態可以包含子狀態,形成階層關係。
複合狀態機圖: 包含並行區域(Concurrent Regions),允許物件同時處於多個狀態。
狀態機圖的注意事項
著重於單一物件: 狀態機圖主要描述單一物件的狀態變化,而不是多個物件之間的互動。
使用清晰的狀態名稱和事件名稱: 狀態名稱和事件名稱應該清晰易懂,準確地表達其含義。
避免過度複雜: 避免在一個圖中包含過多的狀態和轉換,可以將複雜的狀態機分解成多個較小的圖表。
狀態機圖實踐
明確定義物件和目的:
針對單一物件建模: 狀態機圖的重點在於描述單一物件的生命週期,因此應針對特定的物件繪製,而不是試圖用一張圖涵蓋多個物件的互動。
明確圖表的目的: 在繪製之前,先確定圖表要表達的重點,例如:描述某個物件的狀態變化、分析某個物件的行為、設計某個物件的狀態模式
清晰定義狀態:
使用簡潔且具體的狀態名稱: 使用簡潔、具體的名詞或名詞片語描述狀態,例如「未登入」、「已登入」、「處理中」、「已完成」、「錯誤」。
避免使用模糊的狀態名稱: 避免使用含糊不清的詞語,例如「正常狀態」、「異常狀態」,應盡可能使用更具體的描述。
考慮狀態的粒度: 狀態的粒度應適中,過於粗略的狀態無法提供足夠的細節,過於細微的狀態則會使圖表過於複雜。
區分穩定狀態和暫態: 穩定狀態是物件停留一段時間的狀態,而暫態則是短暫的過渡狀態,應區分清楚。
正確使用轉換:
清晰地標示事件: 在轉換箭頭上清晰地標示觸發轉換的事件名稱,例如「登入按鈕點擊」、「訂單提交」、「逾時」。
使用動詞或動詞片語描述事件: 事件應使用動詞或動詞片語描述,例如「使用者登入」、「系統啟動」、「資料接收」。
標示守護條件(Guard Condition): 如果轉換有條件限制,應在轉換箭頭旁使用
[]
方括號標示守護條件,例如[密碼正確]
、[庫存足夠]
。避免不必要的轉換: 只繪製必要的轉換,避免過多的轉換使圖表難以理解。
考慮轉換的完整性: 確保在所有可能的事件下,物件都有明確的狀態轉換路徑。
恰當地使用初始狀態和結束狀態:
只有一個初始狀態: 一個狀態機圖通常只有一個初始狀態,表示物件的起始狀態。
可以有多個結束狀態: 一個狀態機圖可以有多個結束狀態,表示物件的不同結束方式。
善用複合狀態(Composite State)和子狀態(Substate):
使用複合狀態處理複雜的狀態結構: 當一個狀態本身包含更複雜的狀態轉換時,可以使用複合狀態來組織這些子狀態,提高圖表的模組化和可讀性。
區分 OR 狀態和 AND 狀態: 複合狀態可以包含 OR 狀態(子狀態互斥)或 AND 狀態(子狀態並行)。
注意歷史狀態(History State):
- 使用歷史狀態記住先前的子狀態: 當從一個複合狀態離開後,如果需要記住先前停留的子狀態,可以使用歷史狀態。