1. 程式人生 > >UML建模之用例圖學習筆記

UML建模之用例圖學習筆記

什麼是用例圖

用例圖是指由參與者(Actor)、用例(Use Case)以及它們之間的關係構成的用於描述系統功能的靜態檢視。

用例圖是用例(Use Case)分析手段或工具。用例分析是捕獲應用需求的有效手段,也是 UML 中進行功能需求分析的主要方法。它用參與者和用例定義所建系統的功能需求和範圍。用例是站在系統使用者的角度描述系統可以處理的各種用例(通常,一個系統功能至少要用一個用例描述)。它描述的系統內部物件和執行情況。而參與者是系統使用者,描述了與系統相關的外部物件。

用例圖有哪些構成成分

一、參與者(Actor)

參與者是與所建系統互動的人或物。用例描述的是系統內部的所有功能,參與者描述的是系統範圍外的一切。參與者在 UML 中用下圖表示。

Actor

參與者主要包括三大類:系統使用者、時間、與系統互動的其他系統。

第一類參與者是實際的人或物,是最常用的參與者。比如,在一個銷售系統中,銷售員就是一個參與者,該系統是由銷售員來實現下訂單功能的。

第二類參與者是時間。當經過一定時間會觸發系統中的某個事件時,時間就成了參與者。比如,某商場的銷售系統裡,每到下午四點實行打折,此時時間不在我們的控制之內,但是它又實實在在觸發系統中的事件,因此時間也是一個參與者。

第三類參與者是另一個系統。比如,在某個航空訂票系統中,該系統可能需要與外部應用程式進行互動,如驗證信用卡以便來購買飛機票。此時,外部程式就是一個參與者。

二、用例(Use Case)

用例可以理解為系統提供的功能塊,它形象地表示了人們如何使用系統。如何來確定用例主要就是來確定系統向外部提供哪些功能。用例在 UML 中用下圖表示。

Use Case

用例是通過分析需求規格說明書,來進一步幫助使用者瞭解系統。

三、關係(Relationship)

在用例圖中參與者與參與者、參與者與用例、用例與用例之間均有關係。這些關係有的相同有的不同。下面僅重點介紹用例與用例之間的關係。

(一)關聯關係(Association)

關聯是參與者與其參與執行的用例之間的通訊路徑。如下圖中,參與者與用例之間的帶箭頭的連線實線就是關聯。

Association

(二)包括關係(Include)

包括關係表示一個案例的功能可以被重複地在另一個或多個案例中實現。

  • 目的:提取用例中公共的場景部分
  • 關係約束:基本用例包含部分用例,部分用例無條件執行
  • 執行方式:包含用例的行為插入到基本用例中的一個位置。當遵循基本用例說明的用例例項到達基本用例中定義了包含關係的位置,它就將無條件執行包含用例,執行完包含用例後,用例例項就將在基本用例中它先前停止的地方重新開始。

Include1Include2

上圖是對包括關係進行的抽象圖形表示,其中橢圓表示基本用例,橢圓中的實線表示用例例項。
下面通過武松打虎例項對包括關係進行分析。

Include3

上圖一共包含了兩個用例,一個是武松回家,一個是當差的辦事,仔細發現兩個用例的事件流中有一些地方是相同的,比如“來到三碗不過崗”、“叫酒”、“喝兩口”和“過崗”。但是根據包括關係定義,推敲這四個事件,發現武松回家用例中過崗之前有打虎事件,而當差的辦事用例中沒有,包括關係定義的包括用例是能共用的用例,而如果將過崗納入包括用例則違反了包括關係的規則。所以僅有“來到三碗不過崗”、“叫酒”、“喝兩口”能組成一個公用用例。

所以根據以上分析可以畫出該用例圖

Include4

(三)擴充套件關係(Extend)

擴充套件關係表示一個案例是對另一個案例的擴充或者特例。

  • 目的:
    • 表明用例某一部分是可選(或可能可選)的系統行為。將模型中的可選行為和必選行為分開。
    • 表明只在特定條件(有時是例外條件)下才執行分流,如觸發報警。
  • 關係約束:
    • 擴充套件用例在擴充套件點插入基本用例。
    • 擴充套件用例不會孤立存在
  • 執行方式:當執行基本用例的用例例項達到基本用例中定義擴充套件點的位置時,如果條件發生,則執行擴充套件用例。執行完後返回。

Extend1

上圖是擴充套件關係的抽象圖形表示。可以看出與包含關係不同的是,擴充套件關係是可選的系統行為,而包含是無條件執行的系統行為。下面還是利用武松打虎的例項對擴充套件關係進行分析。

Extend2

上圖是武松回家用例和武松打虎用例,可以看出只有武松回家用例中遇到老虎事件觸發時才有武松打虎用例,所以從這一點反推,如果武松沒有遇到老虎,則武松打虎用例也不會發生。所以武松打虎是武松回家用例的擴充套件用例。下面給出完整的用例圖。

Extend3

(四)泛化關係(Generalization)

泛化關係表示了一般與特殊之間的關係,跟面嚮物件語言 Java 中的繼承關係十分相似。

  • 目的:當幾個用例有共同的場景內容或場景結構的時候,可以使用泛化關係提煉共性避免類似用例的重複描述
  • 關係約束:
    • 子用例依賴於父用例的結構。
    • 子用例和父用例範圍一致
  • 執行方式:執行子用例的用例例項將遵循父用例的事件流的結構和內容,同時插入附加行為或修改在子用例事件流中定義的行為

Generalization1

上圖是泛化關係的抽象圖形表示,下面還是在武松打虎基礎上對泛化關係進行分析。

Generalization2

上圖除了武松打虎用例,又引入了兩個用例,一個是李逵打虎,一個是悟空打虎。對這三個用例進行提煉,最終可以總結出該三個用例的相似之處,“打虎原因”、“打虎工具”和“打虎結果”。

問題:泛化與包括都是提煉共同或相似的地方,這兩種關係有什麼不同呢?

答:包括關係是對連續的事件進行提煉,以達到複用用例的功能,這種包括用例是不會被分割的。而泛化則是在結構上(大部分在結構上,也有在場景中)對事件進行結構上的提煉,提煉的地方可以不用連續,以此來達到對結構進行總結,將內容抽象,最終形成抽象用例。

具體抽象過程見下面兩張圖片的介紹。

Generalization3
上圖是對抽象例項進行復制描述和場景例項化,從這裡可以看出泛化關係與繼承關係十分相似。

Generalization4

上圖是對例項進一步進行抽象,最終可以被其他賦值進行泛化,即特殊化。比如,對打虎原因、打虎工具和打虎結果進行分別賦值為“牟利”、“獵槍”和“空手而歸”。則可以體現出子用例對父用例的泛化或繼承關係。

四、總結

用例圖最終是要給使用者看的,也就是說用例圖的設計不必過度分析系統的細節,主要將系統的主要功能模組進行總結分析即可。

  • 用例的關係來自於對用例場景內容結構的分析
  • 不要過分沉迷用例之間的關係
  • 包含,擴充套件關係是面向執行具體場景的
  • 泛化關係是面向結構定義的,也可以包含執行具體場景