天天看點

用例圖中的關系(一)

  一、用例圖概述

用例圖,是一種客戶與開發者之間可以溝通、了解的表現形式。可以認為用例圖是開發者與客戶之間的可視化契約。我認為最主要的一點就是,在這個用例模型中,一直是以使用者的角度為主的,做為開發人員也要時刻站在使用者的角度來看待整個系統。

從原則上來講,用例之間都是獨立、并列的,它們之間并不存在着包含從屬關系。但是為了展現一些用例之間的業務關系,提高可維護性和一緻性,用例之間可以抽象出包含(include)、擴充(extend)和泛(generalization)幾種關系。

共性:都是從現有的用例中抽取出公共的那部分資訊,作為一個單獨的用例,然後通後過不同的方法來重用這個公共的用例,以減少模型維護的工作量。

 二、用例圖中的四個基本元件

          用例圖包括:參與者或角色(actor)、用例(use case)、關系、系統。

         1、 參與者:是系統外的一個實體,它以某種方式參與用例我執行過程。參與者通過向系統輸入或請求系統輸入某些事件來觸發系統的執行,是以參與者可以是人,可以是事物,可以是時間、氣壓等環境因素或者其他系統等。它在系統之外,與系統直接互動。用一個群體概念給參與者命名,反映該參與者的身份與行為(如客戶、管理者等)。

         2、 用例:用例代表系統的某項完整的功能,是動作步驟的集合。系統的功能是通過參與者使用用例來實作的。在這裡,我們把用例看做是一個“黑盒”,隻反映的是系統的一項功能,不涉及實作細節。

                           用例的命名:用例是從使用者的角度來描述系統的功能,也就是從參與者的角度出發進行命名(如,使用“登入”,而不用“身份驗證“)。還有,用例最好使用行業專業術語。

           3、關系:除了參與者與用例之間的關聯關系外,還可以定義參與者之間的泛化關系,用例之間的包含、泛化與擴充關系。應用這些關系的目的是從系統中抽取出公共行為及其變體。

         4、 系統:系統指一個軟體系統、一項業務、一個商務活動、一台機器等等。系統的功能通過用例來表現,換句話說,就是所有的用例構成了整個系統。從這個角度來說,用例(use case)也可以稱為系統的子功能。系統用矩形表示,也可以省略。

 三、用例圖中的關系

        參與者之間的泛化關系

         例如,一個網上訂購系統,可以有網上客戶、電話客戶、直接客戶等。可以看出,他們有共同的行為特征,這就是可以用到面向對象的抽象,抽象出更為一般的化的參與者——客戶。通過泛化來描述多個參與者之間的共同行為,不同的參與者以獨特的方式來使用系統。

    用例與用例之間的關系

1、泛化關系

用例與用例之間也存在着泛化關系,通常用于表示同一業務目的(父用例)的不同技術實作(各個子用例)。

例如某購物系統為使用者提供不同的支付方式,那麼”支付”這個複雜用例就可以用泛化關系表示。

2、包含關系

在包含關系中,基本用例吸收了被包含用例的行為,如果沒有後者它将是不完整的。

包含關系的劃分有兩個好處:一是被包含用例被抽取出來,基本用例得以簡化;二是可以抽象出公共事件流,實作代碼複用。

有時當某用例的事件流過于複雜時,為了簡化用例的描述,我們也可以把某一段事件流抽象成為一個被包含的用例;相反,用例劃分太細時,也可以抽象出一個基用例,來包含這些細顆粒的用例。如:

3、擴充(轉)

将基用例中一段相對獨立并且可選的動作,用擴充(Extension)用例加以封裝,再讓它從基用例中聲明的擴充點(Extension Point)上進行擴充,進而使基用例行為更簡練和目标更集中。擴充用例為基用例添加新的行為。擴充用例可以通路基用例的屬性,是以它能根據基用例中擴充點的目前狀态來判斷是否執行自己。但是擴充用例對基用例不可見。

對于一個擴充用例,可以在基用例上有幾個擴充點。

例如,系統中允許使用者對查詢的結果進行導出、列印。對于查詢而言,能不能導出、列印查詢都是一樣的,導出、列印是不可見的。導入、列印和查詢相對獨立,而且為查詢添加了新行為。是以可以采用擴充關系來描述:

四、包含關系與擴充關系

共同點:擴充用例與包含用例都是基用例的一部分

              基本用例不執行,擴充用例與包含用例都不會執行

              擴充用例可以擴充多個基本用例,包含用例可以被多個基本用例包含

差別:

            擴充關系中基本用例的基本流執行時,擴充用例不一定執行,即擴充用例隻有在基本用例滿足某種條件的時候才會執行。

            包含關系中基本用例的基本流執行時,包含用例一定會執行。

轉:UML中擴充和泛化的差別

泛化表示類似于OO術語“繼承”或“多态”。UML中的Use Case泛化過程是将不同Use Case之間的可合并部分抽象成獨立的父Use Case,并将不可合并部分單獨成各自的子Use Case;包含以及擴充過程與泛化過程類似,但三者對用例關系的優化側重點是不同的。如下:

●泛化側重表示子用例間的互斥性;

●包含側重表示被包含用例對Actor提供服務的間接性;

●擴充側重表示擴充用例的觸發不定性;詳述如下:

既然用例是系統提供服務的UML表述,那麼服務這個過程在所有用例場景中是必然發生的,但發生按照發生條件可分為如下兩種情況:

⒈無條件發生:肯定發生的;

⒉有條件發生:未必發生,發生與否取決于系統狀态;

是以,針對用例的三種關系結合系統狀态考慮,泛化與包含用例屬于無條件發生的用例,而擴充屬于有條件發生的用例。進一步,用例的存在是為Actor提供服務,但用例提供服務的方式可分為間接和直接兩種,依據于此,泛化中的子用例提供的是直接服務,而包含中的被包含用例提供的是間接服務。同樣,擴充用例提供的也是直接服務,但擴充用例的發生是有條件的。

另外一點需要提及的是:泛化中的子用例和擴充中的擴充用例均可以作為基本用例事件的備選擇流而存在。

用例圖中的關系(一)