天天看點

識别用例之間的關系

用例間的三種關系:

(1)擴充(extends):用例B extends 用例A,表示用例B是用例A在某種特定情況下可能會出現的擴充用例。例如:老王進城辦事,2小時就可以回去,在這2小時内内急時就會去上廁所。上廁所用例是進城用例的擴充,因為不上廁所老王進城辦事也可完成。

(2)包含(includes):用例A includes 用例B,表示沒有了用例B,用例A本身也就不完整了。例如:還是老王進城,他從海南來北京辦事,3天才能回去,那麼這種情況下進城用例與上廁所用例的關系就應該是包含關系了。

(3)泛化:泛化關系指的是同一業務目的的不同技術實作。例如:老王進城,他可以坐飛機,可以坐火車,還可以走路,那麼進城用例就泛化為坐飛機、坐火車和走路三個用例了,它們之間存在層級關系。

總的來看,擴充可以“當機”基本用例以保持穩定(因為擴充用例通常是不确定的);包含可以提供公共互動,提高“複用”;泛化是同一業務目的的不同技術實作。用例之間除了上述三種關系不再有其他關系,用例之間不能通訊。

======================================================

下面是另外一種解釋,用例子來描述。

4.2 用例之間的關系

用例描述的是系統外部可見的行為,是系統為某一個或幾個參與者提供的一段完整的服務。從原則上來講,用例之間都是并列的,它們之間并不存在着包含從屬關系。但是從保證用例模型的可維護性和一緻性角度來看,我們可以在用例之間抽象出包含(include)、擴充(extend)和泛化 (generalization)這幾種關系。這幾種關系都是從現有的用例中抽取出公共的那部分資訊,然後通後過不同的方法來重用這部公共資訊,以減少模型維護的工作量。

4.2.1 包含(include)

包含關系是通過在關聯關系上應用<<include>>構造型來表示的,如下圖所示。它所表示的語義是指基礎用例(Base)會用到被包含用例(Inclusion),具體地講,就是将被包含用例的事件流插入到基礎用例的事件流中。

包含關系是UML1.3中的表述,在UML1.1中,同等語義的關系被表述為使用(uses),如下圖。

在ATM機中,如果查詢、取現、轉帳這三個用例都需要列印一個回執給客戶,我們就可以把列印回執這一部分内容提取出來,抽象成為一個單獨的用例"列印回執",而原有的查詢、取現、轉帳三個例都會包含這個用例。每當以後要對列印回執部分的需求進行修改時,就隻需要改動一個用例,而不用在每一個用例都作相應修改,這樣就提高了用例模型的可維護性。

在基礎用例的事件流中,我們隻需要引用被包含用例即可。

查詢-基本事件流

1. 使用者插入信用卡

2. 輸入密碼

3. 選擇查詢

4. 檢視帳号餘額

5. 包含用例"列印回執"

6. 退出系統,取回信用卡

在這個例子中,多個用例需要用到同一段行為,我們可以把這段共同的行為單獨抽象成為一個用例,然後讓其他的用例來包含這一用例。進而避免在多個用例中重複性地描述同一段行為,也可以防止該段行為在多個用例中的描述出現不一緻性。當需要修改這段公共的需求時,我們也隻需要修改一個用例,避免同時修改多個用例而産生的不一緻性和重複性工作。

有時當某一個用例的事件流過于複雜時,為了簡化用例的描述,我們也可以把某一段事件流抽象成為一個被包含的用例。這種情況類似于在過程設計語言中,将程式的某一段算法封裝成一個子過程,然後再從主程式中調用這一子過程。

4.2.2 擴充(extend)

擴充(extend)關系如下圖所示,基礎用例(Base)中定義有一至多個已命名的擴充點,擴充關系是指将擴充用例(Extension)的事件流在一定的條件下按照相應的擴充點插入到基礎用例(Base)中。對于包含關系而言,子用例中的事件流是一定插入到基礎用例中去的,并且插入點隻有一個。而擴充關系可以根據一定的條件來決定是否将擴充用例的事件流插入基礎用例事件流,并且插入點可以有多個。

例如對于電話業務,可以在基本通話(Call)業務上擴充出一些增值業務如:呼叫等待(Call Waiting)和呼叫轉移(Call Transfer)。我們可以用擴充關系将這些業務的用例模型描述如下。

在這個例子中,呼叫等待和呼叫轉移都是對基本通話用例的擴充,但是這兩個用例隻有在一定的條件下(如應答方正忙或應答方無應答)才會将被擴充用例的事件流嵌入基本通話用例的擴充點,并重用基本通話用例中的事件流。

值得注意的是擴充用例的事件流往往可以也可抽象為基礎用例的備選流,如上例中的呼叫等待和呼叫轉移都可以作為基本通話用例的備選流而存在。但是基本通話用例已經是一個很複雜的用例了,選用擴充關系将增值業務抽象成為單獨的用例可以避免基礎用例過于複雜,并且把一些可選的操作獨立封裝在另外的用例中。

4.2.3 泛化(generalization)

當多個用例共同擁有一種類似的結構和行為的時候,我們可以将它們的共性抽象成為父用例,其他的用例作為泛化關系中的子用例。在用例的泛化關系中,子用例是父用例的一種特殊形式,子用例繼承了父用例所有的結構、行為和關系。在實際應用中很少使用泛化關系,子用例中的特殊行為都可以作為父用例中的備選流存在。

以下是一個用例泛化關系的例子,執行交易是一種交易抽象,執行房産交易和執行證券交易都是一種特殊的交易形式。

用例泛化關系中的事件流示例如下: