跳到主要內容

[UML]學習筆記-循序圖型(Sequence Diagrams)-8

定義

如果說之前提到的物件圖型是描述一個時間點的系統運作的樣子(memory snapshot),那麼循序圖型就是表示系統要做某件事情的那段時間內,運作的樣子(一個連續的過程)。

循序圖的重點是在描述一件事情,以及系統要完成這件事情的一連串動作,也是一種軟體系統運作的動態圖型。


上圖就是一個循序圖型,而有下圖的解析。循序圖會以做的動作(任務)出發,並列出所以參與到的物件/類別。接下來由上到下就是動作與物件彼此間的順序運作關係。下圖可以清楚展示出物件與類別/任務的互動關係。

循序圖組成的元素

有以下元素組成

-物件節點(Object Node)
-生命線(Lifeline)
-活化區塊(Activation Box)
-訊息(Message)
-內部訊息
-解構物件
-迴圈

要建構循序圖,必須要確定要描述的任務為何。

確定任務後,就要列出任務會用到的物件(即為物件節點)。

物件節點

*****************************************************
public class TestThermos {
    public static void main(String[] args) {
        HotWaterContainer h = new HotWaterContainer(2);
        CoolWaterContainer c = new CoolWaterContainer(50);
        ThermosGui g = new ThermosGui();
        Thermos t = new Thermos(h, c, g);
    }
}
*******************************************************
上面的程式片段就是在描述一件任務,那件任務就是模擬一個冷熱水開飲機。

一開始先畫出類別和物件的節點,可以很清楚地分出類別和物件的區別。
最前面要是為一個主程式或是匿名物件的話可以用Use case diagram的小人圖來代替。



接著,在這個任務立面加入一個冷水加熱的類別
**********************************************************
public class Heater {
    public static int brew(int water) {
        try {
            Thread.sleep(100);
        } catch (Exception ex) {  }
        return water;
    }
}
**********************************************************
由於brew方法是static method,所以不需要建立物件就可以被呼叫

生命線與活化區塊


可以從圖上面看到,生命線是一個縱向的虛線,而中間穿插著活化區塊,而起點則是一個物件或是一個use case的發起點。

活化區塊的長度就是表示起點或是物件的存活時間。

訊息

訊息就是物件之間互動的關係,會從物件的活化區塊出發,然後指到目標物件



 從上圖可以知道,當物件被創造出來後,要呼叫物件中的方法就要從創造物件的主程式/類別/物件去呼叫。




 此外,訊息除了方法的呼叫,也可以包含其他形式的格式(如上圖)。
解說格式中的意義:

  • 條件: 可選擇的宣告,必須滿足條件才會送出訊息,條件使用[ ]來包起來
  • 重複(次數) :可選擇的宣告,表示送出訊息的次數
  • 順序編號:可選擇的宣告,表示整個任務中的順序
  • 傳回值: 呼叫方法所得到的傳回值
  • 操作名稱:通常是物件的方法
  • 參數:物件方法所需要帶入的參數

此外,在傳回值的表示,也可以用下面兩張圖,實線箭頭表示呼叫方法,虛線箭頭表示方法的傳回值。


內部訊息

內部訊息主要用在物件內方法的彼此呼叫。

從上面程式碼的例子來看,在類別的public方法裡面有呼叫同一類別的private方法。
這就是一的物件內方法彼此呼叫的例子,表示如下圖。


 解構物件

Java不會特別去強調物件的解構,但是像是網路連線或是服務的物件,就會需要特別點出物件使用完後,連線的解構。解構通常使用一個X,在解構方法呼叫後,並不會有返回值。

迴圈

其實在任務的執行中,有些任務需要同一事情多次執行,因此,迴圈的表示便可以達成這個描述的目的。
上圖的isFull(應該是HotWaterContainer呼叫)和isReady (應該是CoolWaterContainer呼叫)次序應該擺錯了。

多執行緒

這邊舉的例子就是開水的降溫與加溫
這邊會使用主動物件(Active Object)來加入圖型中。

這兩個執行緒使用加粗邊框的方塊表示,同時也使用匿名物件的方式表示
對照的code如下。
這兩個主動物件都是由HotWaterContainer這個類別的物件來建立它們。

留言

這個網誌中的熱門文章

[UML]學習筆記-狀態圖型(Statechart Diagrams)-10

定義 狀態圖型主要會應用到軟體系統中,某項任務的生命週期。任務的生命週期中,會有不同的狀態,藉由不同狀態的檢視,可以去檢查任務是否有未考慮的情況或是邏輯的謬誤。 上圖就是表示一個執行緒的生命週期,還有它本身的狀態變化。 另外,狀態的數量必須是有限的。 組成元素 狀態節點(State node) 狀態圖型主要使用兩個特定的符號來表示生命週期的開始與結束。 初始狀態(Initial State),使用實心黑色的圓形。 結束狀態(Final State),使用實心黑色的圓形,外層再包一圈空心的圓形。 除了開始和結束外,狀態節點就是表示生命週期的某一種狀態,它的節點內容包含兩個部分。 名稱區格(Name Compartment) 內部轉換區格(Internal Transition Compartment) 通常內部轉換區格會因簡化而省略。 下圖就是含有內部轉換區格的狀態圖型 接下來仔細解釋名稱區格以及內部轉換區格的定義 名稱區格 名稱區格的文字表示生命週期中的一個狀態,UML的規定並非必填,如果沒有填寫就稱為匿名狀態。 內部轉換區格 內部轉換區格主要用來表示狀態節點內部的轉換狀況,這個地方使用四個標籤來說明進入狀態節點後到離開狀態節點時,狀態節點內會做哪些動作。 entry: 進入狀態節點的動作 exit: 離開狀態節點時的動作 do: 停留在此狀態節點時執行的動作 自訂標籤: 使用下列格式來自訂標籤與動作 其實跟其他標籤格式差不多,除了標籤名稱外,就是有參數可以去填寫。 轉換(Transition) 在狀態圖型中,兩個狀態節點間的標示就稱為「轉換」,用來表示狀態節點間如何轉換過去的。 轉換標示的格式如下。 事件名稱: 通常會是物件/類別的方法名稱 參數: 可選擇性的宣告,就是傳遞給事件的參數 條件: 可選擇性地宣告,用來表示狀態轉換的條件 這邊用個修改紀錄的的狀態圖來做例子。 從這個例子可以看到[update record]的狀態可以經過update的事件後,來到達下一個狀態[record updated] 子狀態(Sub-State) 從之前開飲機的例子來說,狀態圖可以如下圖。 ...

[UML]學習筆記-元件圖型(Component Diagrams)-6

定義 在描述一個軟體系統的時候,將軟體系統裡的元素給予模組化(Modularity),即成為一個元件。將元件與元件間的關係做描述時,軟體系統的運作可以比描述類別關係更加得清楚。 這個的由來是描述Java serverlet技術時所採用Container base的描述方式。如下圖。 右邊的藍色區塊就是整個serverlet container以及其中所包含的元件,它和瀏覽器的元件會有互動的關係。 元件(Component) 元件在軟體系統中是依照規則定義功能的一個元素,藉由描述元件與元件間的關係,有下列優點。 1. 使用者可以較為清楚了解軟體架構 2. 提供軟體系統功能更為良好的邏輯文件 3. 提供更好的封裝 4. 方便取代與重複使用 有三個種類 1. 佈署元件 2. 工作產物元件 3. 可執行元件 UML各版本(V1.X & V2.0)的表示方式如下圖。 元件與介面(Component & Interface) 將所有實作一個介面的類別包裝為元件是很常見的做法。 下圖的Pet Interface即是一例。 上圖藍色區塊部分的類別就會集合成一個Pet Component 同樣,描述Component與Interface間的關係,也是使用虛線箭頭,箭頭形狀為空心三角形的表示方式(因為Pet Component就是把類別給集合起來而已) 使用元件圖型 這邊以計算機的程式來說明。 1. 使用到的Package列出來(使用套件圖型) ,請見下圖 2. 將套件中的類別圖型轉成元件圖型 3. 將所有元件圖型集合成軟體系統的運作架構,請見最後一張圖。 由上圖的元件關係可以很清楚地對應到計算機UI所呈現的內容。