UML超新手入門(10)狀態圖型 by Michael | CodeData
top

UML超新手入門(10)狀態圖型

分享:

UML超新手入門(9)合作圖型 << 前情

「狀態圖型、Statechart diagrams」用來顯示軟體系統中特定的狀態情形,如果軟體系統中某一項作業的生命週期是非常重要的,而且在生命週期當中,會變換不同的狀態時,你就需要使用狀態圖型,它可以確認邏輯的正確性和是不是有未考慮到的情況。

這裡提到的「狀態」,與物件圖型裡的「物件狀態」是不一樣的。在物件圖型的物件狀態指的是物件屬性的值,經由物件的屬性值來瞭解物件在某一個特定時間的狀態;而狀態圖型中的物件狀態有可能是物件屬性的值,但是在很多情況下,它就不是單純的物件屬性值。執行緒的狀態就是最好的例子,一個執行緒可能包含了許多共同合作的類別,它們的狀態是由執行緒的機制來控管生命週期:

umlandjava_10_01

不過在使用狀態圖型前,有一個前提是一定要考慮的,就是這些生命週期必須是「有限的狀態」。這一點非常重要,因為你要排除所有具備不確定生命週期的情況,再根據實際的需要,畫出狀態圖型。

狀態節點

狀態圖型使用兩個特定的符號來表示生命週期的開始和結束:

  • 初始狀態(Initial state),使用實心黑色的圓型
  • 結束狀態(Final state),使用實心黑色的圓型,外層包圍著空心的圓型

umlandjava_10_02

除了初始和結束節點外,狀態節點用來表示生命週期中的某一種狀態,它分成上、下兩個區格:

  • 名稱區格(Name compartment)
  • 內部轉換區格(Internal transitions compartment)

下列的狀態圖型中,都是省略內部轉換區格的狀態節點:

umlandjava_10_03

下列的狀態圖型中,是包含名稱區格和內部轉換區格的狀態節點:

umlandjava_10_04

名稱區格

名稱區格內的文字表示生命週期中的一個狀態,在UML的規格中並沒有規定一定要填寫,如果一個狀態節點沒有狀態名稱,就稱為「匿名狀態」,一般來說比較不會遇到這樣的情形。

內部轉換區格

內部轉換區格用來表示狀態節點內部的轉換狀況,使用四種標籤來表示從進入到離開狀態節點之間作了哪些動作:

  • entry:進入狀態節點時的動作
  • exit:離開狀態節點時的動作
  • do:停留在這個狀態節點時執行的動作

除了這三種UML規定的標籤外,你可以使用下列的格式定義自己的動作:

umlandjava_10_05

下列的狀態節點,用來表示在輸入密碼欄位時的狀態,使用內部轉換區格來顯示使用者在輸入密碼時的動作:

umlandjava_10_06

轉換

在狀態圖型中,兩個狀態節點之間的標示稱為「轉換、transition」,用來表示原始狀態如何轉換到目的狀態:

umlandjava_10_07

導致狀態轉換的事件,使用下列的語法來宣告:

umlandjava_10_08

在上列宣告事件的語法中:

  • 事件名稱:通常會是方法的名稱。
  • 參數:可選擇性的宣告。傳遞給事件的參數。
  • 條件:可選擇性的宣告。表示導致狀態轉換的條件。

一個造成狀態改變的事件,可能會非常複雜,例如修改資料表格中的某一筆資料,在事件裡還會有資料鎖定、修改與釋放鎖定的動作,你可以使用條件和動作來說明比較複雜的事件:

umlandjava_10_09

子狀態

在狀態圖型中,可能會出現下列的狀況:

umlandjava_10_10

為了簡化上列的圖型,你可以使用一個狀態節點把「low hot water」和「low cool water」包裝起來:

umlandjava_10_11

使用這樣的方式來繪製狀態圖型,可以讓圖型更加清楚,「low hot water」和「low cool water」這兩個狀態節點,會稱為「子狀態、Substate」。

後續 >> UML超新手入門(10)活動圖型

分享:
按讚!加入 CodeData Facebook 粉絲群

留言

留言請先。還沒帳號註冊也可以使用FacebookGoogle+登錄留言

關於作者

張益裕。目前的工作是講師與作者,專長是教育訓練課程規劃、教材編製與課程推廣,技術書籍與專欄寫作。涵蓋的領域有OOAD、Java程式設計、JavaFX、Java Embedded、Android與SQL。已出版電子書Google Play圖書Pubu

熱門論壇文章

熱門技術文章