天天看點

UML之狀态機圖

狀态機圖

基本概念: 狀态機圖,UML 1.x規範中稱狀态圖,是一個展示狀态機的圖。

狀态機圖基本上就是一個狀态機中元素的投影,這也就意味着狀态機圖包括狀态機的所有特征。狀态機圖顯示了一個對象如何根據目前狀态對不同僚件做出反應的動态行為。

狀态機圖主要由狀态和轉換兩種元素組成。

狀态機

  狀态機是一種行為,它說明對象在其生命周期中響應事件所經曆的狀态變化序列以及對那些時間的響應。

  一般情況下,一個狀态機依附于一個類,用來描述這個類的執行個體的狀态及其轉換,和對接收到的事件所做出的響應。此外,狀态機也可以依附于用例、操作、協作等元素上,描述它們的執行過程。

  狀态機從對象的初始狀态開始,響應事件并執行某些動作,進而引起狀态的轉換;在新狀态下又繼續響應事件并執行動作,如此循環進行到對象的終結狀态。

狀态機主要由狀态、轉換、事件、動作和活動5部分組成。

1)狀态表示對象的生命周期中的一種條件或情況。

2)轉換表示兩種狀态間的一種關系。

3)事件表示在某一時間與空間下所發生的有意義的事情。

4)動作表示一個可執行的原子操作,是UML能夠表達的最小計算單元

5)活動表示狀态機中的非原子執行,一般由一系列動作組成。

UML之狀态機圖

狀态機圖作用:狀态機圖用于對系統的動态方面進行模組化,适合描述一個對象在其生命周期中的各種狀态及狀态的轉換。

狀态機圖的作用主要展現在以下幾點:

1)狀态機圖描述了狀态轉換時所需的觸發事件和監護條件等因素,有利于開發人員捕捉程式中需要的事件。

2)狀态機圖清楚地描述了狀态之間的轉換及其順序,這樣就可以友善地看出事件的執行順序,狀态機圖的使用節省了大量的描述文字。

3)清晰的事件順序有利于開發人員在開發程式時避免出現事件錯序的情況。

4)狀态機圖通過判定可以更好地描述工作流在不同的條件下而出現的分支。

狀态機圖的組成: 簡單狀态、轉換、僞狀态。

簡單狀态

  狀态是狀态機圖的重要組成部分,它描述了一個對象穩定在的某一個持續過程或所處狀況,與動态行為的執行所産生的結果。

  當對象滿足某一狀态的條件時,該狀态被稱為激活的。

  在UML中,狀态分為簡單狀态與複合狀态。

    a.簡單狀态就是沒有嵌套的狀态。

    b.初态和終态是兩個特殊的狀态,分别表示狀态機的入口狀态和出口狀态。對于一個不含嵌套結構的狀态機,隻能有一個初态,可以有一個或多個終态甚至沒有終态。

UML之狀态機圖

狀态一般由狀态名稱、子狀态、入口動作和出口動作、内部執行活動、内部轉換和可推遲事件組成。對于簡單狀态而言,不會有子狀态。

狀态名稱:可以把一個狀态與其他狀态分别開來,即狀态名稱必須在目前層次内保持唯一。沒有名稱的狀态被稱為匿名狀态。

入口動作與出口動作:由其它狀态轉移到目前狀态或從目前狀态轉移到其它狀态時要附帶完成的動作。表示為“entry /動作表達式”和“exit /動作表達式”。

内部執行活動:當對象進入一個狀态時,在執行完入口動作後就開始執行該活動。使用“do/活動表達式”來表示。

内部轉換:指的是不導緻狀态改變的轉換。内部轉換隻有源狀态而沒有目标狀态。表示為“事件名稱(事件參數)/活動表達式”。

可推遲事件:不會觸發狀态的轉換,且當對象處于該狀态時事件可能會被推遲,但不會丢失。格式為“事件名稱/defer”。

轉換

轉換是兩種狀态間的一種關系。它指明當特定事件發生或特定條件滿足時,處于某狀态(源狀态)的對象将執行某一動作或活動并進入另一狀态(目标狀态)。

轉換表示為從源狀态指向目标狀态的實線箭頭,并附有轉換的标簽。轉換的标簽格式如下:

 ⌊轉換名稱:⌋opt 事件名稱opt ⌊(參數清單)⌋opt ⌊[監護條件]⌋opt ⌊/效果清單⌋opt

轉換——轉換名

轉換名稱是轉換的辨別符。在實際使用中,為了防止轉換名稱與轉換的觸發器或監護條件混淆,一般不必為轉換命名。

對于一個轉換,除了源狀态、目标狀态外,還要有事件、監護條件和效果清單等内容。這三個部分的内容對轉換不是必需的,在使用時要根據轉換所表達的具體語義來添加相應内容。

轉換——事件

事件是在某一時間與空間下所發生的有意義的事情,是系統執行中發生的值得模組化的事物。

事件一般被狀态或轉換所發送和接收。在轉換中被接收的事件也被稱為該轉換的觸發器或觸發事件。

事件包含一個參數清單(可能為空),用于從事件的産生者向其接收者傳遞資訊。

對應于觸發器轉換,沒有明确的觸發器的轉換成為結束轉換或無觸發器轉換,是在狀态的内部活動執行完畢後隐式觸發的。

能夠在觸發器中接收的事件有以下四種:

1)調用事件:調用事件表示對象接收到一個調用操作的請求。其期待的結果是事件的接收者觸發一個轉換并執行相應的操作。

2)改變事件:改變事件的發生依賴于事件中某個表達式所表達的布爾條件。改變事件沒有參數,要一直等到條件被滿足才能發生。

3)信号事件:信号由一個對象準确地送給另一個或一組對象。發送給一組對象的信号可能觸發每個對象的不同轉換。

4)時間事件:時間事件的發生依賴于事件中的一個時間表達式。比如,可以讓對象進入某狀态後經過一段給定的時間或到達某個絕對時間後發生該事件。

UML之狀态機圖

轉換——監護條件

監護條件是一個轉換被激發之前必須滿足的一個條件。

監護條件是一個布爾表達式,可以根據觸發器事件的參數、屬性和狀态機所描述的對象的連結等寫成。當轉換接收到觸發事件後,隻有監護條件為真,轉換才能被激活。

對監護條件的檢驗是觸發器計算過程的一部分,對于每個事件監護條件隻檢查一次。如果事件被處理時監護條件為假,那麼除非再次接收到一個觸發事件,将不會再重新計算監護條件的值。

轉換——效果清單

效果清單是一個過程表達式,在轉換被激活時執行,表示轉換附加的效果。

效果清單包括多個動作,可以根據操作、屬性、擁有對象的連接配接、觸發器事件的參數等寫成。動作可以是一個指派語句、算術運算、發送事件、調用對象的屬性或操作、建立或銷毀對象等。

效果的表達文法與其實作的具體内容有關。

UML之狀态機圖

例子(1):簡單的狀态機圖—吃飯狀态

做需求時,需要了解以下六種元素:起始、終止、現态、次态(目标狀态)、動作、條件,我們就可以完成一個狀态機圖了

UML之狀态機圖

①現态:是指目前所處的狀态。

②條件:又稱為“事件”,當一個條件被滿足,将會觸發一個動作,或者執行一次狀态的遷移。

③動作:條件滿足後執行的動作。動作執行完畢後,可以遷移到新的狀态,也可以仍舊保持原狀态。動作不是必需的,當條件滿足後,也可以不執行任何動作,直接遷移到新狀态。

④次态:條件滿足後要遷往的新狀态。“次态”是相對于“現态”而言的,“次态”一旦被激活,就轉變成新的“現态”了。

畫狀态機圖的注意事項:

1、避免把某個“程式動作”當作是一種“狀态”來處理。那麼如何區分“動作”和“狀态”?“動作”是不穩定的,即使沒有條件的觸發,“動作”一旦執行完畢就結束了;而“狀态”是相對穩定的,如果沒有外部條件的觸發,一個狀态會一直持續下去。

2、狀态劃分時漏掉一些狀态,導緻跳轉邏輯不完整。是以在設計狀态機時,我們需要反複的檢視設計的狀态圖或者狀态表,最終達到一種牢不可破的設計方案。

例子(2)需求崗工作狀态

UML之狀态機圖

僞狀态

概念:僞狀态指的是在狀态機中具有狀态的形式,卻具有特殊行為的頂點。

  當一個僞狀态處于活動時,系統不會處理事件,而是瞬間自動轉換到另一個狀态,并且這種轉換是沒有事件進行顯式觸發的。

最常見的僞狀态包括初态、選擇、分叉與結合、曆史狀态等。

  a.初态:初态實際上不是一個真正的狀态,它更像是狀态機的入口。初态的具體語義概念是模糊的且是瞬時的,不能存在觸發器進行觸發,否則對象将可能會長時間停留在一個語義不明的初态中。

  b.選擇是狀态機中的一個僞狀态節點,用于表達狀态機中的分支結構。

    一個選擇節點将一個轉換分割為兩個片段,即将觸發事件與監護條件分離。

    選擇節點不同分支上的監護條件應該覆寫所有情況,否則狀态機将不知道如何運作。

UML之狀态機圖

例子(3)訂單狀态機圖

UML之狀态機圖

複合狀态

概念:複合狀态是指包含有一個或多個嵌套狀态機的狀态。

a.順序複合狀态:當順序複合狀态被激活時,隻有一個子狀态會被激活。

b.并發複合狀态:複合狀态中包括兩個或多個并發執行的子狀态機。

在複合狀态中,我們可以先将一部分細小的狀态組合成一個狀态機,把這個新的狀态機作為總狀态機圖中的一個複合狀态來呈現。

順序複合狀态

順序複合狀态又被稱為非正交狀态,是僅含一個狀态機的複合狀态。

當順序複合狀态被激活時,隻有一個子狀态會被激活。它隻增加了一層子結構,沒有增加額外的并發性。

UML之狀态機圖

并發複合狀态

并發複合狀态,也稱正交複合狀态,是包括兩個或多個并發執行的子狀态機的複合狀态。

并發複合狀态将複合狀态分成若幹個正交區域,每個區域都有一個相對獨立的子狀态機。如果該并發複合狀态是激活的,那麼該狀态中每個區域都将有一個狀态是激活的。

UML之狀态機圖

曆史狀态

曆史狀态是應用于複合狀态的一種僞狀态,它代表上次離開該複合狀态時的最後一個子狀态。

當一個來自于複合狀态外的轉換為複合狀态内的曆史狀态時,将使曆史狀态所記錄的子狀态被激活。

深曆史狀态儲存的更深的嵌套層次中的子狀态。

UML之狀态機圖

狀态機圖的模組化技術

為對象的生命周期模組化

  确定狀态機的語境。

  設定狀态機的初态和終态。

  決定該對象的狀态機中可能需要響應的事件。

  從初态到終态,列出這個對象可能處于的所有頂層狀态。用轉移将這些狀态連接配接起來,明确轉移的觸發器和監護條件,接着向轉移中添加效果動作。

  識别狀态是否需要有入口動作和出口動作。

  如果需要,使用子狀态來對頂層狀态進行嵌套。

  檢查狀态機中提供的事件是否與所期望的相比對;檢查所有事件是否都已經被狀态機所處理。

  檢查狀态機中的動作是否能由類或對象的關系、操作等支援。

  跟蹤狀态機,確定狀态機是良構的,即不存在無法到達的狀态,也不會發生停機。

例子(4)音樂播放

UML之狀态機圖

例子(5)取消航班

UML之狀态機圖

例子(6)系統程序狀态機圖

UML之狀态機圖

案例

新生入學後,學校在三個月内按照國家招生規定對其進行複查。複查合格者予以注冊,取得學籍。複查不合格者,學校差別情況予以處理,直至取消入學資格。

學生有如下情況之一者,應予休學:

      (一)因傷病經學校指定醫院診斷,須停課治療、休養一學期1/3時間;

      (二)一學期請假缺課超過該學期總學時的1/3;

      (三)傳染性肝炎、肺結核等傳染性疾病;

      (四)因某種特殊原因,學校認為必須休學。

學生休學至少一學期,一般以一年為限。學生複學後,休學之前已記入成績檔案的考核成績繼續有效,并作為學籍處理依據.

學生複學按下列規定辦理:

     (一)學生因傷病休學申請複學時,須持有二級甲等以上醫院診斷書,證明身體健康,并經學校指定醫院複查合格,方可複學;

    (二)學生休學期滿後應于學期的注冊期内持有關證明,經教務處核準後編入原專業相應班級選課學習;

 學生有下列情況之一者,應予退學:

(一)學生在讀期間,3次出現在一學期中取得的課程學分不足10學分(不含重修和補考學分;畢業學期除外;第一次提出警告,第二次提出退學警告,由教務處公布名單,院系負責通知學生家長);

(二)休學、保留學籍期滿,在規定期限内不辦理複學手續;

(三)休學累計滿二年,經複查不合格;

(四)因傷病需要休學,經學校動員後仍不辦理休學手續;

(五)經學校指定醫院确診患有疾病,或意外傷殘無法繼續在校學習;

(六)未請假離校連續2周末參加學校規定的教學活動;

 (七) 超過學校規定期限未注冊而又無正當事由;

(八)本人要求退學。

     學生在規定的學習年限(4年制3~6年,5年制4~7年)内修完本專業培養計劃規定的全部教學環節,取得注冊專業規定的畢業學分,準予畢業,發給畢業證書。