第12章 狀態機圖 12-1 狀態機圖的基礎 12-2 狀態機圖的符號 12-3 再談狀態與轉換 12-4 狀態機圖的塑模範例 12-5 繪製狀態機圖 12-6 綜合練習
12-1 狀態機圖的基礎-說明 UML活動圖和狀態機圖(State Machine Diagrams)都可以描述系統物件的動態行為,不過,活動圖是描述物件行為的流程;狀態機圖則是描述單一物件行為的狀態,也就是物件生命周期之中觸發事件造成的狀態轉換。 狀態機圖可以呈現4+1觀點軟體系統模型的邏輯觀點,如下圖所示:
12-1 狀態機圖的基礎-種類 行為狀態機(Behavioral State Machines):使用狀態、事件和轉換來描述單一物件的行為。 協定狀態機(Protocol State Machines):描述一系列觸發事件和物件回應的狀態,但沒有顯示狀態轉換的行為,換句話說,協定狀態機不包含任何行為實作的內容,而只是描述事件和回應狀態的合法順序,例如:資料庫存取介面物件和通訊協定TCP/IP。
12-1 狀態機圖的基礎-目的 一般來說,我們使用狀態機圖的主要目的,如下所示: 塑模系統的動態行為。 描述一個物件生命周期中的不同狀態。 定義狀態機圖來塑模一個物件的狀態。
12-2 狀態機圖的符號 12-2-1 狀態 12-2-2 轉換
12-2 狀態機圖的符號 描述登入(Login)物件輸入使用者帳號和密碼登入系統的狀態機圖,如右圖所示:
12-2-1 狀態-簡單狀態 狀態(States)也稱為簡單狀態(Simple State),它是指物件在其生命周期中處於特殊立場或滿足一些條件,可以執行指定動作或等待一些事件,隨著時間的改變,物件的狀態也會跟著轉變。 狀態可以決定物件如何回應事件,也就是說,從一個狀態,在觸發事件後,轉換至另一個狀態,它是使用圓角長方形來表示,內容是唯一的狀態名稱,如下圖所示:
12-2-1 狀態-起始虛擬狀態與終止狀態 狀態機圖使用和活動圖相同的起始與終止符號代表起始和終止狀態,不過,狀態機圖的起始狀態稱為起始虛擬狀態(Initial Pseudostate),可以表示從一個虛擬的起始狀態轉換至一個真實狀態,簡單的說,起始虛擬狀態表示一連串狀態轉變的開始,如下圖所示:
12-2-2 轉換-說明 轉換(Transitions)是兩個狀態之間的關係(Relationship),它是使用箭頭連接線來連接兩個狀態,表示從來源狀態因觸發轉換至目的狀態,如下圖所示:
12-2-2 轉換-語法 在轉換連接線上方可以標示轉換原因的觸發、條件和動作(如果不只一個,請使用「,」分隔),其基本語法如下所示: 觸發[防衛條件]/動作 上述語法的觸發(Trigger)是轉換原因,可能是事件(Event)或訊號(Signal),之後的方括號是防衛條件,如果有防衛條件,表示當條件為真true時,才允許狀態轉換,在「/」斜線後是動作,如果有,表示我們需要執行動作來完成狀態轉換。
12-2-2 轉換-語法(觸發) 觸發就是狀態轉換原因的事件,當連接線上標示觸發,表示當此事件發生時,就從來源狀態轉換至目的狀態。事件是在某一時間點發生的事,可以是呼叫物件的方法、滿足布林運算式、時間條件(after 30秒)或訊號等。 例如:在本節前狀態機圖的移動滑鼠(Move)、送出(Submit)、重試(Retry)和取消(Cancel)等事件。
12-2-2 轉換-語法(防衛條件) 防衛條件是狀態轉換的條件,當觸發產生時,還需要防衛條件為真true,才執行狀態轉換。
12-2-2 轉換-語法(動作) 動作是在觸發產生且防衛條件為真true時,就執行此動作來完成狀態轉換,換句話說,我們需要執行完動作,才會進入轉換的目的狀態。
12-3 再談狀態與轉換 12-3-1 內部轉換 12-3-2 狀態轉換的種類 12-3-3 自身轉換 12-3-4 虛擬狀態 12-3-5 訊號 12-3-6 組合狀態
12-3-1 內部轉換-說明 內部轉換(Internal Transitions)是顯示在狀態中的轉換,因為並不會轉換其目前的狀態,所以沒有使用連接線來表示狀態改變,例如:在輸入密碼狀態中,按下按鍵是一個事件,但此事件不會導至轉換輸入密碼狀態,我們可以使用內部轉換keypress來進一步描述狀態的內容。
12-3-1 內部轉換-符號 內部轉換是顯示在狀態圓角長方形的下半部分,如下圖所示:
12-3-1 內部轉換-語法 內部轉換的基本語法,如下所示: 動作名稱/行為 上述語法的動作名稱是發生的內部事件,當產生此事件後,執行位在「/」斜線之後的行為。在狀態機圖的內部轉換有幾種標準動作,其說明如下所示: Entry(進入):進入狀態後第一件發生的事,可以觸發此動作指定的行為,以輸入密碼狀態為例就是「設定回應字元為「*」號且重設密碼欄位」。 Exit(離開):離開狀態最後一件發生的事,以輸入密碼狀態為例就是「設定回應字元為正常」。 Do(做):在狀態存在時所做的事,例如:輸入密碼狀態是在取得密碼,和播放DVD的播放狀態是在讀取DVD等。
12-3-2 狀態轉換的種類- 說明 在狀態機圖執行狀態轉換時,因為轉換條件有觸發和防衛條件,所以筆者準備使用播放DVD的狀態機圖為例,說明各種不同組合下的狀態轉換,如下圖所示:
12-3-2 狀態轉換的種類- 沒有觸發和沒有防衛條件的轉換 轉換如果沒有指定觸發和防衛條件,當來源狀態的內部轉換完成後,就會立刻轉換至目的狀態,例如:在播放狀態播完DVD後,就轉換至停止狀態,如下圖所示:
12-3-2 狀態轉換的種類- 只有觸發的轉換 轉換如果有指定觸發但沒有指定防衛條件,當觸發產生時,就馬上執行狀態轉換,例如:在暫停狀態按播放鍵,可以轉換至播放狀態,如右圖所示:
12-3-2 狀態轉換的種類- 只有防衛條件的轉換 轉換可以只使用防衛條件來作選擇,當防衛條件為真true時,就執行狀態轉換。在第12-3-3節的狀態機圖片斷就是只有防衝條件的轉換。
12-3-2 狀態轉換的種類- 同時有觸發和防衛條件的轉換 轉換如果有指定觸發和防衛條件,當觸發產生時,需要滿足防衛條件,才會執行狀態轉換,例如:在停止狀態按播放鍵,而且必須已經置入DVD後,才會轉換至播放狀態,如下圖所示:
12-3-3 自身轉換 自身轉換(Self-Transitions)是指擁有轉換至自己本身的轉換,例如:自動換片CD播放機的播放狀態就擁有自身轉換,如下圖所示:
12-3-4 虛擬狀態-說明 虛擬狀態(Pseudostates)除了狀態機圖的起始虛擬狀態外,還提供多種虛擬狀態,可以讓我們連接多個轉換、使用條件決定轉換和平行處理多個轉換。
12-3-4 虛擬狀態-連接虛擬狀態 連接虛擬狀態(Junction Pseudostate)是用來連接多個轉換,其符號和起始狀態相同,我們可以使用連接虛擬狀態來合併多個狀態,換句話說,連接虛擬狀態可以有1到多個進入轉換,但只有1個離開轉換。例如:從圖書館借一本書的狀態機圖,如下圖所示:
12-3-4 虛擬狀態-選擇虛擬狀態 選擇虛擬狀態(Choice Pseudostate)可以使用布林條件判斷執行的轉換,使用活動圖的決策節點,在選擇虛擬狀態的每一條離開轉換加上防衛條件來判斷下一步的轉換,和連接虛擬狀態的差異在於只顯示分歧而沒有合併情況,例如:修改第12-3-3節自動換片CD播放機,如下圖所示:
12-3-4 虛擬狀態-終止虛擬狀態 終止虛擬狀態(Terminate Pseudostate)隱含狀態機的物件生命已經結束,它是使用大X符號表示,換句話說,進入終止虛擬狀態如同執行消滅物件的操作,如下圖所示:
12-3-5 訊號-說明 訊號(Signal)可以非同步在物件之間傳遞,當狀態機圖需要強調轉換和轉換行為時,觸發可以使用接收訊號和送出訊號來驅動轉換,如下所示: 送出訊號(Sending Signal):代表非同步傳送一個送出訊號的動作,擁有一個進入轉換和一個離開轉換。 接收訊號(Receipt Signal):代表一種沒有內部轉換的狀態,表示接收到一個訊息來導致離開轉換的產生。
12-3-5 訊號-範例1 狀態機圖是使用和活動圖相同的訊號符號,例如:在銀行帳戶提款,如果餘額不足,就送出訊號來處理帳戶餘額不足,如下圖所示:
12-3-5 訊號-範例2 在另一個狀態機圖的片斷可以接收訊號來進行處理,如下圖所示:
12-3-6 組合狀態-說明 組合狀態(Composite State)是用來擴充狀態元素,可以在同一個狀態中擁有一至多個狀態機,也稱為巢狀狀態機。當組合狀態同時擁有多個狀態機,而且每一個狀態機是位在不同區域(Region),區域之間使用虛線分隔,則每一個區域的狀態機稱為子狀態(Substates)。
12-3-6 組合狀態-簡單組合狀態 簡單組合狀態只包含一個區域的組合狀態,通常是因為狀態太過複雜,我們需要在狀態中使用子狀態來表示,例如:撥打室內電話的狀態機圖,如下圖所示:
12-3-6 組合狀態-進入點 進入點(Entry Point)是一種虛擬狀態,它是進入組合狀態的進入點,在組合狀態的每一個區域只允許一個進入點。一般來說,當沒有使用起始虛擬狀態進入子狀態時,我們可以使用進入點來轉換至子狀態,如下圖所示:
12-3-6 組合狀態-離開點 離開點(Exit Point)類似進入點也是一個虛擬狀態,可以代替終止狀態來離開組合狀態,通常都是因為錯誤產生,所以使用離開點來離開組合狀態,如下圖所示:
12-4 狀態機圖的塑模範例 12-4-1 客戶追蹤的狀態機圖 12-4-2 ATM提款的狀態機圖 12-4-3 訂單的狀態機圖
12-4-1 客戶追蹤的狀態機圖-問題描述 客戶追蹤是在記錄目前公司客戶的狀態,以便從眾多客戶中找出有價值的優良客戶,其問題描述如下所示: 公司客戶在登記後,但未下訂單前,其狀態是登記狀態,等到客戶第一次下訂單,其狀態改為有交易狀態,如果在半年之內消費一萬元,就是優良客戶,其狀態是優良狀態,但是,如果客戶付款有延遲,就會改為觀察狀態,優良客戶如果退貨2次,就會改為有交易客戶。
12-4-1 客戶追蹤的狀態機圖-步驟一 Step 1:從起始虛擬狀態開始,公司在輸入客戶資料後,預設狀態是登記狀態,如下圖所示:
12-4-1 客戶追蹤的狀態機圖-步驟二 Step 2:當客戶第一次下訂單且成功建立訂單後,產生下訂單事件,客戶狀態轉換至有交易狀態,如右圖所示:
12-4-1 客戶追蹤的狀態機圖-步驟三 Step 3:客戶訂單如果延遲付款,就觸發轉換至觀察狀態,這些客戶是需要特別注意的客戶,如下圖所示:
12-4-1 客戶追蹤的狀態機圖-步驟四 Step 4:如果客戶在半年內交易超過一萬元,就轉換至優良狀態的客戶,這些是公司最有價值的客戶,如右圖所示:
12-4-1 客戶追蹤的狀態機圖-步驟五 Step 5:優良客戶的訂單如果延遲付款,也會轉換至觀察狀態;如果退貨超過2次,就會轉換至有交易狀態,如右圖所示:
12-4-2 ATM提款的狀態機圖-可能狀態 當使用者在ATM自動櫃員機操作提款作業流程的活動圖,請參閱第7-2-4節,以ATM角度(不是使用者角度)可能產生的一些狀態,即ATM物件的可能狀態,如下所示: 卡片進入 取得密碼 歸還卡片 確認密碼 取得金額 送出款項
12-4-2 ATM提款的狀態機圖-狀態機圖
12-4-3 訂單的狀態機圖-問題描述 訂單狀態機圖是針對訂單Order物件建立狀態轉換的狀態機圖,其問題描述如下所示: 訂單在建立但尚未付款前是位在已收到狀態,等到收到付款後,就轉換至已確認狀態,訂單如果取消就進入已取消狀態,否則包裝進入已裝箱狀態和準備送貨,在送貨後轉換至已送貨狀態,不論是取消或完成送貨的訂單都需要在一個月內歸檔。
12-4-3 訂單的狀態機圖-狀態機圖
12-5 繪製狀態機圖 12-5-1 繪製狀態與轉換 12-5-2 繪製內部轉換 12-5-3 繪製組合狀態
12-5-1 繪製狀態與轉換-新增狀態 在「工具箱」視窗拖拉【起始虛擬狀態】、【狀態】或【終止狀態】至編輯區域後,即可新增狀態和輸入狀態名稱,如下圖所示:
12-5-1 繪製狀態與轉換-新增轉換 在狀態機圖的狀態之間建立連接線就是【邊線/轉換】,請在「工具箱」視窗選【邊線/轉換】,然後在來源狀態上按一下,拖拉至目的狀態上,放開滑鼠按鍵,可以建立轉換之間的箭頭連接線,如下圖所示:
12-5-1 繪製狀態與轉換- 在轉換上輸入轉換原因的觸發、防衛條件和動作 選轉換,然後移動滑鼠游標至連接線上方,可以看到一個長方形淺藍色長方形,按二下可以直接輸入轉換原因的觸發、防衛條件和動作,事實上,我們就是在指定轉換名稱,如下圖所示:
12-5-2 繪製內部轉換 狀態的內部轉換是在「屬性」視窗的【狀態】標籤建立,如下圖所示:
12-5-3 繪製組合狀態 在「工具箱」視窗拖拉【組合狀態】至編輯區域後,即可新增組合狀態,和輸入組合狀態名稱,目前它和前述的簡單狀態並沒有什麼不同,如下圖所示:
12-6 綜合練習-租片物件的狀態機圖
12-6 綜合練習-購物訂單物件的狀態機圖
12-6 綜合練習-課程物件的狀態機圖
End