UML用例圖中包含(include)、擴展(extend)和泛化(generalization)三種關係詳解

UML用例圖中包含(include)、擴展(extend)和泛化(generalization)三種關係詳解

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



1、包含(include)

 

    包含關係:使用包含(Inclusion)用例來封裝一組跨越多個用例的相似動作(行爲片斷),以便多個基(Base)用例複用。基用例控制與包含用例的 關係,以及被包含用例的事件流是否會插入到基用例的事件流中。基用例可以依賴包含用例執行的結果,但是雙方都不能訪問對方的屬性。 

   包含關係對典型的應用就是複用,也就是定義中說的情景。但是有時當某用例的事件流過於複雜時,爲了簡化用例的描述,我們也可以把某一段事件流抽象成爲一個被包含的用例;相反,用例劃分太細時,也可以抽象出一個基用例,來包含這些細顆粒的用例。這種情況類似於在過程設計語言中,將程序的某一段算法封裝成一個子過程,然後再從主程序中調用這一子過程。 

   例如:業務中,總是存在着維護某某信息的功能,如果將它作爲一個用例,那新建、編輯以及修改都要在用例詳述中描述,過於複雜;如果分成新建用例、編輯用例和刪除用例,則劃分太細。這時包含關係可以用來理清關係。

2、擴展(extend)

擴展關係:將基用例中一段相對獨立並且可選的動作,用擴展(Extension)用例加以封裝,再讓它從基用例中聲明的擴展點(Extension Point)上進行擴展,從而使基用例行爲更簡練和目標更集中。擴展用例爲基用例添加新的行爲。擴展用例可以訪問基用例的屬性,因此它能根據基用例中擴展點的當前狀態來判斷是否執行自己。但是擴展用例對基用例不可見。

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

例如,系統中允許用戶對查詢的結果進行導出、打印。對於查詢而言,能不能導出、打印查詢都是一樣的,導出、打印是不可見的。導入、打印和查詢相對獨立,而且爲查詢添加了新行爲。因此可以採用擴展關係來描述:

 

4、泛化(generalization)

 

泛化關係:子用例和父用例相似,但表現出更特別的行爲;子用例將繼承父用例的所有結構、行爲和關係。子用例可以使用父用例的一段行爲,也可以重載它。父用例通常是抽象的。在實際應用中很少使用泛化關係,子用例中的特殊行爲都可以作爲父用例中的備選流存在。

例如,業務中可能存在許多需要部門領導審批的事情,但是領導審批的流程是很相似的,這時可以做成泛化關係表示: 

 

上面是我參考的一篇文章,覺得將三種關係的區別講得很清晰,在此基礎上結合自己的系統,對項目(在線購物系統)的用例做了整體的描繪。

    *****************************************************************

    (1)系統整體用例圖

按照先整體用例,後子系統用例來進行描繪的,歡迎大家提出好的建議!


轉:UML中擴展和泛化的區別 

         泛化表示類似於OO術語“繼承”或“多態”。UML中的Use Case泛化過程是將不同Use Case之間的可合併部分抽象成獨立的父Use Case,並將不可合併部分單獨成各自的子Use Case;包含以及擴展過程與泛化過程類似,但三者對用例關係的優化側重點是不同的。如下:
          ●泛化側重表示子用例間的互斥性;
          ●包含側重表示被包含用例對Actor提供服務的間接性;
          ●擴展側重表示擴展用例的觸發不定性;詳述如下:


        既然用例是系統提供服務的UML表述,那麼服務這個過程在所有用例場景中是必然發生的,但發生按照發生條件可分爲如下兩種情況:
         ⒈無條件發生:肯定發生的;
         ⒉有條件發生:未必發生,發生與否取決於系統狀態;

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章