解析UML狀態(tài)機視圖狀態(tài)和轉換
本節(jié)和大家一起學習一下UML狀態(tài)機視圖的概念,這里主要介紹一下UML狀態(tài)機視圖的狀態(tài)和轉換兩部分內容,相信通過本節(jié)的介紹你對UML狀態(tài)機視圖有一定的了解。下面是具體介紹。
UML狀態(tài)機視圖狀態(tài)和轉換
◆狀態(tài)
狀態(tài)描述了一個類對象生命期中的一個時間段。它可以用三種附加方式說明:在某些方面性質相似的一組對象值;一個對象等待一些事件發(fā)生時的一段時間;對象執(zhí)行持續(xù)活動時的一段時間。雖然狀態(tài)通常是匿名的并僅用處于該狀態(tài)時對象進行的活動描述,但它也可以有名字。
在狀態(tài)機中,一組狀態(tài)由轉換相連接。雖然轉換連接著兩個狀態(tài)(或多個狀態(tài),如果圖中含有分支和結合控制),但轉換只由轉換出發(fā)的狀態(tài)處理。當對象處于某種狀態(tài)時,它對觸發(fā)狀態(tài)轉換的觸發(fā)器事件很敏感。狀態(tài)用具有圓形拐角的矩形表示。如圖6-2所示。
圖6–2狀態(tài)
◆轉換
我們再來看一下UML狀態(tài)機視圖的轉換。從狀態(tài)出發(fā)的轉換定義了處于此狀態(tài)的對象對外界發(fā)生的事件所做出的反應。通常,定義一個轉換要有引起轉換的觸發(fā)器事件、監(jiān)護條件、轉換的動作和轉換的目標狀態(tài)。表6–2列出了幾種轉換和由轉換所引起的隱含動作。

轉換的種類
描述
語法
入口動作
進入某一狀態(tài)時執(zhí)行的動作
entry/action
出口動作
離開某一狀態(tài)時執(zhí)行的動作
exit/action
外部轉換
引起狀態(tài)轉換或自身轉換,同時執(zhí)行一個具體的動作,包括引起入口動作和出口動作被執(zhí)行的轉換
e(a:T)[exp]/action
內部轉換
引起一個動作的執(zhí)行但不引起狀態(tài)的改變或不引起入口動作或出口動作的執(zhí)行
e(a:T)[exp]/action
表6–2轉換的種類及隱含動作
◆1.外部轉換
我們先來看一下UML狀態(tài)機視圖中的外部轉換,它是一種改變活動狀態(tài)的轉換,它是最普通的一種轉換。它用從源狀態(tài)到目標狀態(tài)的箭頭表示,其他屬性以文字串附加在箭頭旁(如圖6–3所示)。
圖6–3外部轉換

◆2.觸發(fā)器事件
觸發(fā)器事件是引起轉換的事件。事件可以有參數,以供轉換的動作使用。如果一個信號有后代,那么信號中的任一個后代都可以引起轉換。例如,如果轉換將MouseButton作為觸發(fā)器,那么MouseButtonDown可以觸發(fā)這個轉換(如圖6–1)。
事件并不是持續(xù)發(fā)生的,它只在時間的一點上發(fā)生。當一個對象接收到一個事件時,如果它沒有空閑時間來處理事件,就將事件保存起來。對象一次只處理一個事件,在對象處理事件時轉換必須激發(fā),事件過后是不會被記住的(某些特殊的延遲事件除外,在觸發(fā)一個轉換前或處延遲被解除前,這類事件被保存起來)。如果兩個事件同時發(fā)生,它們被每次處理一個。沒有觸發(fā)任何轉換的事件被簡單地忽略或遺棄,這并不是一個錯誤,忽略不想要的事件要比詳細指明所有事件容易得多。
◆3.監(jiān)護條件
UML狀態(tài)機視圖中轉換可能具有一個監(jiān)護條件,監(jiān)護條件是一個布爾表達式。監(jiān)護條件可以引用對象的屬性值和觸發(fā)事件的參數。當一個觸發(fā)器事件被觸發(fā)時,監(jiān)護條件被賦值。如果布爾表達式的值為“真”,那么觸發(fā)事件即,使轉換有效。如果布爾表達式的值為“假”,則不會引起轉換。監(jiān)護條件只能在觸發(fā)事件發(fā)生時被賦值一次。如果在轉換發(fā)生后監(jiān)護條件由原來的“假”變?yōu)?ldquo;真”,則因為賦值太遲而不能觸發(fā)轉換。
從一個狀態(tài)引出的多個轉換可以有同樣的觸發(fā)器事件,但是每個轉換必須具有不同的監(jiān)護條件。當其中一個監(jiān)護條件滿足時,觸發(fā)器事件會引起相應的轉換。通常,監(jiān)護條件的設置要考慮到各種可能的情況以確保一個觸發(fā)器事件的發(fā)生應該能夠引起某些轉換。如果有些情況沒有考慮到,一個觸發(fā)器事件沒有引起任何轉換,那么在狀態(tài)機視圖中要忽略這個事件。一個事件的發(fā)生只能同時引起一個轉換(在一個控制線程中)。如果一個事件可能引起多個轉換,那么其中只有一個轉換有效。如果兩個相互矛盾的轉換同時有效,則無法確定到底發(fā)生了哪個轉換。這兩個轉換隨機地發(fā)生一個,或者由系統(tǒng)的實現(xiàn)細節(jié)決定究竟發(fā)生哪一個,但是對建模者來說,無法預料這種轉換產生的后果。#p#
◆4.完成轉換
沒有標明觸發(fā)器事件的轉換是由狀態(tài)中的活動的完成引起的(即完成轉換)。完成轉換也可以帶一個監(jiān)護條件,這個監(jiān)護條件是在狀態(tài)中的活動完成時被賦值的(而不是完成以后)。
◆5.動作
當轉換被引起時,它對應的動作被執(zhí)行。UML狀態(tài)機視圖中動作是原子性的,一般是一個簡短的計算處理過程,通常是一個賦值操作或算術計算。另外還有一些動作,包括給另一個對象發(fā)送消息、調用一個操作、設置返回值、創(chuàng)建和銷毀對象,沒有被定義的控制動作用外部語言來進行詳細說明。動作也可以是一個動作序列,即一系列簡單的動作。動作或動作序列的執(zhí)行不會被同時發(fā)生的其他動作影響或終止。按照UML中的概念,動作的執(zhí)行時間非常短,與外界事件所經歷的時間相比是可以忽略的,因此,在動作的執(zhí)行過程中不能再插入其他事件。然而,實際上任何動作的執(zhí)行都要耗費一定時間,新到來的事件必須被安置在一個隊列中。
整個系統(tǒng)可以在同一時間執(zhí)行多個動作。我們說動作是原子性的,并不是說整個系統(tǒng)是原子性的。系統(tǒng)能夠處理硬件的中斷和多個動作的時間共享。動作在它的控制線程中是原子性的。一旦開始執(zhí)行,它必須執(zhí)行到底并且不能與同時處于活動狀態(tài)的動作發(fā)生交互作用。但動作不能用于表達處理過程很長的事物。與系統(tǒng)處理外部事件所需要的反應時間相比,動作的執(zhí)行過程應該很簡潔,否則系統(tǒng)不能夠做到實時響應。
一個動作可以使用觸發(fā)器事件的參數和對象的屬性值作為表達式的一部分。
表6–3列出了各種動作及描述。
表6–3動作的種類

◆6.狀態(tài)改變
當動作執(zhí)行完畢后,轉換的目標狀態(tài)被激活,這時會觸發(fā)出口動作或入口動作的執(zhí)行。
◆7.嵌套狀態(tài)
狀態(tài)可以被嵌套在其他的組成狀態(tài)之內(看下一段)。從一個外部狀態(tài)出發(fā)的轉換可以應用于這個狀態(tài)所有的內部嵌套狀態(tài)。任何一個內部嵌套狀態(tài)被激活時,轉換都有可能發(fā)生。組成狀態(tài)可用于表達例外和異常,因為組成狀態(tài)上的轉換適用于所有它所嵌套的狀態(tài),不需要每個嵌套狀態(tài)顯式地單獨處理異常。
◆8.入口和出口動作
一個跨越多個嵌套層次的轉換可能會離開或進入某個狀態(tài)。只要轉換進入或離開某個狀態(tài),則該狀態(tài)可能包含要被執(zhí)行的動作。進入一個狀態(tài)可能會執(zhí)行一個依附于該狀態(tài)的入口動作。如果轉換離開初始狀態(tài),那么在轉換的動作和新狀態(tài)的入口動作被執(zhí)行前,執(zhí)行該狀態(tài)的出口動作。
入口動作通常用來進行狀態(tài)所需要的內部初始化。因為不能回避一個入口動作,任何狀態(tài)內的動作在執(zhí)行前都可以假定狀態(tài)的初始化工作已經完成,不需要考慮如何進入這個狀態(tài)。同樣,無論何時從一個狀態(tài)離開都要執(zhí)行一個出口動作來進行后處理工作。當出現(xiàn)代表錯誤情況的高層轉換使嵌套狀態(tài)異常終止時,出口動作特別有用。出口動作可以處理這種情況以使對象的狀態(tài)保持前后一致。入口動作和出口動作原則上依附于進來的和出去的轉換,但是將它們聲明為特殊的動作可以使狀態(tài)的定義不依賴狀態(tài)的轉換,因此起到封裝的作用。
◆9.內部轉換
我們再來看一下UML狀態(tài)機視圖中內部轉換。內部轉換有一個源狀態(tài)但是沒有目標狀態(tài)。內部轉換的激發(fā)規(guī)則和改變狀態(tài)的轉換的激發(fā)規(guī)則相同。由于內部轉換沒有目標狀態(tài),因此轉換激發(fā)的結果不改變本狀態(tài)。如果一個內部轉換帶有動作,它也要被執(zhí)行,但是沒有狀態(tài)改變發(fā)生,因此也不需要執(zhí)行入口和出口動作。內部轉換用于對不改變狀態(tài)的插入動作建立模型(如,記錄發(fā)生的事件數目或建立幫助信息屏)。
盡管入口動作和出口動作的執(zhí)行是由進入或離開某狀態(tài)的外部轉換所引起的,除了使用保留字entry和exit代替觸發(fā)事件名稱之外,入口和出口動作使用與內部轉換相同的表示法。
一個自身轉移會激發(fā)狀態(tài)上的入口動作和出口動作的執(zhí)行(從概念上來講,自身轉換從一個狀態(tài)出發(fā)后又會到自身狀態(tài)),因此,自身轉換不等價于內部轉換。圖6–4說明了入口動作、出口動作和內部轉換。

圖6–4內部轉、入口動作和出口動作
【編輯推薦】
- UML狀態(tài)圖及其組成元素簡介
- UML狀態(tài)圖創(chuàng)建過程中需要注意問題
- UML建模風格 UML狀態(tài)圖表現(xiàn)形式解析
- 在回歸測試中UML狀態(tài)圖切片的應用
- UML用戶指南--UML圖簡介
























