一、用例圖概述
用例圖,是一種客戶與開發者之間可以溝通、理解的表現形式。可以認為用例圖是開發者與客戶之間的可視化契約。我認為最主要的一點就是,在這個用例模型中,一直是以用戶的角度為主的,做為開發人員也要時刻站在用戶的角度來看待整個系統。
從原則上來講,用例之間都是獨立、並列的,它們之間並不存在着包含從屬關系。但是為了體現一些用例之間的業務關系,提高可維護性和一致性,用例之間可以抽象出包含(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提供服務,但用例提供服務的方式可分為間接和直接兩種,依據於此,泛化中的子用例提供的是直接服務,而包含中的被包含用例提供的是間接服務。同樣,擴展用例提供的也是直接服務,但擴展用例的發生是有條件的。
另外一點需要提及的是:泛化中的子用例和擴展中的擴展用例均可以作為基本用例事件的備選擇流而存在。