目錄
1、概述
2、狀態
2.1、狀態的組成
3、轉移
3.1、轉移的組成
4、高級狀態和轉移
4.1、進入效應和退出效應
4.2、內部轉移
4.3、do活動
4.4、延遲事件
4.5、子狀態機
5、子狀態
5.1、非正交子狀態
5.2、歷史狀態
5.3、正交子狀態
6、分叉與匯合
7、主動對象
8、常用建模技術
8.1、為對象生命周期建模
使用交互,可以對共同工作的對象群體的行為建模。
使用狀態機,可以對單個對象的行為建模。
狀態機是一個行為,它說明對象在它的生命期中響應事件所經歷的狀態序列以及對那些事件做出的反應。
狀態機對系統的動態方面建模,
描述一個類、一個用況或整個系統的實例的生命期。這些實例可能響應諸如信號、操作或計時這樣的事件。當事件發生時,某些效應將依賴對象的當前狀態而發生。
效應(effect)是對狀態機中的行為執行的規約。效應最后將細化為某些引起對象狀態改變或值的返回的動作的執行。對象的狀態(state)是指對象滿足某些條件、執行某些活動或等待某些事件的一段時間。
可以用兩種方式來可視化執行的動態:
1)一種是強調從活動到活動的控制流(使用活動圖)
2)另一種是強調對象可能呈現的狀態和這些狀態之間的轉移(使用狀態圖)。
????????在一個對象的生命期中,可能出現各種各樣的事件,如信號、操作的調用、對象的創建和撤銷、時間的推移或某些條件的改變。
????????在響應這些事件時,對象通過某些動作(某種計算)做出反應,這些動作導致對象狀態改變。
????????可以使用狀態機來對任何建模元素(通常是類、用例,或是整個系統)的行為建模。狀態機可以用狀態圖來可視化。可以關注由事件引發的對象行為,這對反應式系統建模很有用。
1、概述
狀態機 (state machine)是一種行為,它說明對象在它的生命期中響應事件所經歷的狀態序列以及它們對那些事件的響應。
狀態 (state)是指對象的生命期中的條件或狀況,在此期間對象將滿足某些條件、執行某些活動或等待某些事件。
事件 (event)是對一個在時間和空間上占有一定位置的有意義的發生的規約。在狀態機的語境中,一個事件是一個激勵的發生,它能夠觸發一個狀態轉移。
轉移 (transition)是兩個狀態之間的一種關系,它指明對象在第一個狀態中執行一定的動作,并當特定事件發生或特定的條件滿足時進入第二個狀態。
活動 (activity)是狀態機中進行的非原子執行。
動作 (action)是一個可執行的原子計算,它引起模型狀態改變或值的返回。
圖形上,狀態用一個圓角的矩形表示,轉移用一條從源狀態指向新狀態的有向實線表示。
用狀態機能最好地說明對象的行為必須響應異步消息,或者它的當前行為依賴于過去。這包括能夠接收信號的類的實例,其中包括許多主動對象。
可以用狀態機來對接口的行為建模
2、狀態
狀態是對象的生命期中的一個條件或狀況,在此期間對象將滿足某些條件、執行某些活動或等待某些事件。
2.1、狀態的組成
(1)名稱(name)一個將本狀態與其他狀態區分開的文本串;狀態可以是匿名的,即沒有名稱。
(2)進入/退出效應(entry/exit effect)分別為進入和退出該狀態時所執行的動作。
(3)內部轉移(internal transition)不導致狀態改變的轉移。
(4)子狀態(substate)狀態的嵌套結構,包括非正交(順序活動)或正交(并發活動)子狀態
(5)延遲事件(deferred event)指在該狀態下暫不處理,將推遲到該對象的另一個狀態下排隊處理的事件列表。
在對象的狀態機中有兩個可能要定義的特殊狀態。第一個是初始狀態,表示狀態機或子狀態的默認開始位置。初始狀態用一個實心的圓表示。第二個是最終狀態,表示該狀態機或外圍狀態的執行已經完成。最終狀態用一個內部含有一個實心圓的圓圈表示(牛眼睛)。
初始狀態和最終狀態實際上都是偽狀態。它們除了名稱外,都沒有正規狀態的通常部分。
3、轉移
轉移是兩個狀態之間的一種關系,表示對象在某個特定事件發生而且特定的條件滿足時將在第一個狀態中執行一定的動作,并進入第二個狀態。
當狀態發生這樣的轉變時,轉移被稱作激活了。
在轉移激活之前,稱對象處于源狀態;激活后,則稱對象處于目標狀態。
例如,當 tooCold(帶有參數desiredTemp)這樣的事件發生時,Heater可能從Idle狀態轉移到Activating狀態。
3.1、轉移的組成
(1)源狀態(source state)即受轉移影響的狀態,如果一個對象處于源狀態,當該對象接收到轉移的觸發事件而且監護條件(如果有)滿足時,將激活一個離出的轉移。
(2)事件觸發器(event trigger)是一個事件,源狀態中的對象識別了這個事件,則在監護條件滿足的情況下激活轉移。
(3)監護條件(guard condition)是一個布爾表達式,當因事件觸發器的接收而觸發轉移時,對這個布爾表達式求值:若表達式取值為真則激活轉移;若為假則不激活,此時若沒有其他的轉移能被這個事件觸發,則該事件丟失。
(4)效應(effect)是一個可執行的行為(比如動作),它可以直接作用于擁有狀態機的對象,并間接作用于對該對象可見的其他對象。
(5)目標狀態(target state)即在轉移完成后的活動狀態。
一個轉移可能有多個源(在這種情況下,它表示來自多個并發狀態的一個匯合),
也可能有多個目標(在這種情況下,它表示發往多個并發狀態的一個分岔)
可以用一個衍型為send 的依賴來顯式地顯示一個信號發送到的對象,
該依賴的源為狀態,目標為這個對象。
4、高級狀態和轉移
高級特征包括進入效應、退出效應、內部轉移、do 活動和延遲事件。
這些特征作為一個文本串顯示在狀態符號的文本分欄內。
4.1、進入效應和退出效應
每當進入一個狀態時,執行某個設置動作;當離開一個狀態時,執行某個清理動作。
在狀態符號中包括一個進入效應(以關鍵字entry標記)和一個退出效應(以關鍵字exit標記
),各自帶有一個適當的動作。每當進入該狀態時,就執行它的進入動作;每當離開該狀態時,就執行它的退出動作。
4.2、內部轉移
一旦處于一個狀態內,將遇到想在不離開該狀態的情況下處理的事件,這被稱為內部轉移(internal
?transition)。它通過執行一個效應來響應事件,但不改變狀態。而且不執行進入或退出動作。
關鍵字 entry、exit和 do都是保留字,不能用作事件的名字。
4.3、do活動
當對象處于一個狀態時,它一般是空閑的,在等待著一個事件的發生。希望對一個持續的活動建模。在處于一個狀態的同時,對象做著某些工作,并一直繼續直到被一個事件所中斷。
4.4、延遲事件
在3.1圖中,假定只有一個離開這個狀態、并由事件contact觸發的轉移。當處于Tracking狀態時,除了事件contact和那些由其子狀態處理的事件之外,其他事件都將被丟棄。也就是說事件可以發生,但它將被忽略,而且不因為該事件的出現而產生任何動作。
延遲事件的實現需要有一個內部事件隊列。如果一個事件發生,并被列為延遲事件,則進入隊列。一旦對象進入一個不延遲這些事件的狀態,這些事件就會從這個隊列中取走。
4.5、子狀態機
在一個狀態機中可以引用另一個狀態機。被引用的狀態機稱為子狀態機(submachine)。
5、子狀態
組合狀態既可能包含并發(正交的)子狀態也可能包含順序(非正交的)子狀態。
5.1、非正交子狀態
????????上圖表示通過使用嵌套子狀態,Active狀態有一個子結構,包括子狀態Validating、Selecting、Processing和Printing。當顧客將信用卡插入ATM機時,ATM的狀態從Idle轉移到Active。在進入Active狀態時,執行進入動作readCard。從子結構的初始狀態開始,控制從 Validating 狀態傳遞到Selecting 狀態,再到 Processing 狀態。在 Processing 狀態之后,控制可能返回到Selecting狀態(如顧客選擇另一個事務)或可能轉移到Printing狀態。在Printing狀態之后,有一個完成轉移返回到 Idle狀態。注意,Active狀態有一個退出動作來吐出顧客的信用卡。
????????由cancel事件觸發的從Active狀態到Idle狀態的轉移。在Active的任何子狀態中,顧客都可能取消這個事務,并使ATM返回到Idle狀態。
非正交子狀態將組合狀態的狀態空間分成一些不相交的狀態。
?一個嵌套的非正交狀態機最多有一個初始子狀態和一個最終子狀態。
5.2、歷史狀態
想要它記住在離開組合狀態之前最后活動著的子狀態
例如,在對一個通過網絡進行無人值守的計算機備份的代理的行為建模時,如果它曾被中斷(例如,被一個操作員的查詢中斷),希望它記住是在該過程的什么地方被中斷的。
用一個包含符號H的小圓圈來表示一個淺歷史狀態。
允許一個包含非正交子狀態的組合狀態來記住源自組合狀態的轉移之前最后的活動子狀態。
在上圖中,假定處于BackingUp和Copying狀態中時,事件query被發出。控制離開Copying和BackingUp(必要時執行其退出動作),并返回到Command狀態。當Command的動作完成后,完成轉移返回到組合狀態BackingUp的歷史狀態。這一次,由于這個嵌套狀態機有了歷史,所以控制傳回到Copying狀態(繞過了Collecting狀態),因為Copying是從BackingUp轉移之前的最后一個活動子狀態。
符號H表示淺歷史,它只記住直接嵌套的狀態機歷史。
符號H*的小圓圈表示深歷史。深歷史將在任何深度上記住最深的嵌套狀態。
如果僅有一層嵌套,那么深歷史和淺歷史狀態在語義上是等同的。
如果有多于一層的嵌套,那么淺歷史只能記住最外層的嵌套狀態,而深歷史則可以在任何深度上記住最深層的嵌套狀態。
5.3、正交子狀態
在一個對象的語境中并行執行的兩個或多個狀態機。
上圖顯示了對圖5.1中的Maintenance狀態的一個擴展。
Maintenance被分解為兩個正交區域:Testing和Commanding,它們在Maintenance狀態中嵌套顯示,并用一條虛線分開。
每個正交區域進一步分解為非正交子狀態
當控制從 Idle 狀態傳送到Maintenance狀態時,控制就分岔為兩個并發的流——這個對象將同時處于Testing區域和Commanding區域。而且,當處于 Commanding區域時,這個對象將處于 Waiting狀態或者Command狀態。
?
6、分叉與匯合
下圖它從Idle狀態轉到兩個嵌套狀態,即Self diagnose和區域Commanding的最終狀態。(最終狀態也是一個真實的狀態,可以作為轉移的目標)。如果在Self diagnose狀態活動時發生了錯誤,就會激活到Repair的隱式的匯合轉移:無論是Self diagnose狀態,還是Commanding區域內的任意活動狀態都會被退出。
圖中還有一個到狀態Offline的顯式的匯合轉移。只有當 Testing devices 狀態和 Commanding 區域的最終狀態是活動的,而且disconnect事件發生,才會激活這個轉移;如果兩個狀態都不活動,則該事件無效。
?
7、主動對象
對并發建模的另一種方式是使用主動對象。因而,不是把一個對象的狀態機劃分成兩個或多個并發區域,而是定義兩個主動對象,每個負責一個并發區域的行為。
如果這些并發控制流中的一個控制流的行為受到其他控制流狀態的影響,就用正交區域來建模。
如果這些并發流中的一個控制流的行為受到與其他控制流來往的消息的影響,就用主動對象來建模
如果并發流之間的通信很少或根本就沒有,那么選擇哪種建模方法就全憑個人感覺了,通常用主動對象建模會使設計決策更明顯。
8、常用建模技術
8.1、為對象生命周期建模
交互用來對一起工作的對象群體的行為建模
而狀態機用來對單個對象的整個生命期的行為建模
主要描述以下3種事物:
1)對象能夠響應的事件,
2)對這些事件的響應,
3)過去對當前行為的影響。
為對象的生命期建模,還包括決定該對象能夠有意義地響應事件的次序,從對象的創建時開始,一直到它被撤銷。
?
建立過程:
- 設置狀態機的語境,不管它是一個類、一個用況,還是整個系統。
- 如果語境是一個類或一個用況,則找出相鄰的類,包括這個類的所有父類和通過依賴或關聯到達的所有類。這些鄰居是動作的候選目標或在監護條件中包含的候選項。
- 如果語境是整個系統,則將注意力集中到這個系統的一個行為上。理論上,系統中每個對象都可以是系統生命期模型中的一個參加者,而且除了最微小的系統之外,建立一個完整的模型將是非常棘手的。
- 建立這個對象的初始狀態和最終狀態。為了指導模型的剩余部分,可能要分別聲明初始狀態和最終狀態的前置條件和后置條件。
- 判斷這個對象可能響應的事件。如果已經說明,則將在對象的接口中發現這些事件;如果還沒說明,就要考慮在語境中哪個對象可能與該對象交互,然后發現它們可能發送哪些事件。
- 從初始狀態開始到最終狀態,列出這個對象可能處于的頂層狀態。用由適當的事件觸發的轉移將這些狀態連接起來,接著向這些轉移中添加動作。
- 識別任何進入動作或退出動作(尤其當發現它們所適用的慣用法被用于狀態機時)。
- 如果需要,通過使用子狀態來擴充這些狀態。
- 檢查在狀態機中提供的所有事件是否和該對象接口所期望的事件相匹配。類似地,檢查該對象的接口所期望的所有事件是否都被狀態機所處理。最后,留意明顯地想忽略這些事件的地方。
- 檢查在狀態機中提到的所有動作是否由對象的關系、方法和操作所支持。
- 通過跟蹤狀態機(不管是手工地還是通過工具),根據期望的事件順序及其響應進行檢查。尤其要努力尋找那些不可達狀態和可能導致機器停止的狀態。
- 在重新安排狀態機之后,按所期望的順序再一次檢查,以確保沒有改變該對象的語義。
上圖在這個控制器類的生命期中有 4個主要的狀態:
“初始化”Initializing(控制器開始運行)、“空閑”Idle(控制器準備好,并等待警報或來自用戶的命令)、“命令”Command(控制器正在處理來自用戶的命令)和“活動”Active(控制器正在處理一個警報條件)。
當第一次創建這個控制器對象時,首先進入Initializing狀態,然后無條件地進入Idle狀態。這兩個狀態的詳細信息并不顯示,但要顯示Idle狀態中帶有時間事件的自轉移。
這種時間事件在嵌入式系統中是常見的,它常常有一個心跳定時器,每隔一段時間就檢查一下系統的健康狀況。
當接收到一個“警報”alarm事件(包括參數s,表示發生錯誤的傳感器)時,控制從Idle狀態轉移到Active狀態。
進入Active狀態時,setAlarm作為進入動作執行,控制首先傳送到Checking狀態(驗證這個警報),然后傳送到Calling狀態(呼叫警報公司以登記這個警報),最后傳送到Waiting 狀態。僅當“清除”clearing 警報時,或是用戶向控制器發“注意”attention信號以通知可能發布一個命令時,才退出狀態Active和Waiting。
注意這里沒有最終狀態。這在嵌入式系統中也是常見的,希望系統無限期地運行。
?
?