本身在畫用例視圖的時候,總要在用例間的關係問題上費不少的時間,雖然用例之間的關係無外乎泛化、包含和擴展三種,但仍是常常會在用例間關係屬於哪種的問題上產生迷惑,索性集中分析整理一下,之後再迷惑的時候,找出來看看。
首先從原則上來說,用例相互之間都是獨立、並列的,它們之間並不存在着從屬的關係。然而,之因此要將它們之間定義泛化、包含和擴展等關係,主要是爲了體現用例之間的業務聯繫。這三種關係的一個共性就是:都是從現有的用例中抽取出公共的那部分信息,做爲一個單獨的用例,而後經過不一樣的方法來複用這個公共的用例,以減小模型維護的工做量。
一、這三種關係是如何來區分的呢?通常來說,能夠用is a 和 has a來判斷使用那種關係,泛化和擴展表示的是用例之間的is a 關係,包含關係表示的是用例之間的has a 關係;而擴展關係和泛化關係相比又多了擴展點的概念,就是說,一個擴展用例之可以在基本用例的擴展點上進行擴展。
二、分別就這三種關係進行分析說明:
(1)泛化關係:
一個用例能夠被特別列舉爲一個或多個子用例,這被稱爲用例泛化。用例間的泛化關係和類間的泛化關係相似,即在用例泛化中,子用例表示父用例的特殊形式,子用例從父用例處繼承行爲和屬性,還能夠添加行爲或覆蓋,改變已繼承行爲。
當系統中具備一個或多個用例是較通常用例的特化時,就使用用例泛化。
舉例:
理解:基本用例是通常的抽象的,而泛化用例則是特殊的具體的;同時,泛化用例在抽象的概念上和基本用例相同。如上面例子:基本用例Search Person,泛化用例Search Teacher和Search Student,Search Person (找人)是一個通常的抽象的概念,而Search Teacher (找老師)和 Search Student(找學生)相對而言就是特殊的具體的概念了,將(找人)具體化特殊化了。然而就(找老師)和(找學生)這兩個泛化用例的抽象的概念上來說仍是「找人」,也就是說一我的在找老師或者找學生的時候,也能夠說他在找人,由於老師和學生都是人。
(2)包含關係:
使用包含
用例來封裝一組跨越多個用例的類似動做(行爲片段),以便多個基本
用例複用。基本用例控制與包含用例的關係,以及被包含用例的事件流是否會插入到基本用例的事件流中。基本用例能夠依賴包含用例執行的結果,可是雙方都不能訪問對方的屬性。基本用例執行時,必定要執行包含用例。
舉例:
理解:若是單獨使用一個「註冊用戶管理」用例來描述業務的話,不可以很好的描述註冊用戶管理都有哪些內容,計算機沒法將註冊用戶管理員的業務模擬出來,因此在系統用例階段,用「註冊用戶管理」include「增刪改查用戶信息」來表示這個實現關係,有利於詳細分析模擬「註冊用戶管理」這一行爲的細節,不至於混淆;同時,若是有多個相似於「註冊用戶管理」這樣的用例,可讓「增長用戶信息」和「增長XX信息」等等用例來繼承一個抽象出來的「增長數據」用例。
如圖:
(3)擴展關係:
將基用例中一段相對獨立而且可選的動做,用擴展用例加以封裝,再讓它從基用例中聲明的擴展點上進行擴展,從而使基用例行爲更簡練和目標更集中。基本用例沒必要知道擴展用例的任何細節,僅爲其提供擴展點,事實上基本用例沒有擴展也是完整的,這一點和包含關係不一樣,一個用例能夠有多個擴展點,每一個擴展點也能夠出現屢次,一般狀況下基本用例不會涉及到擴展用例的行爲,只有在特定的條件發生時,擴展用例的行爲才被執行,也就是說基本用例執行時,擴展用例可執行也能夠不執行。
舉例:
理解:借了圖書館的書,到期了還書,這很正常,「還書」用例就能夠描述,可是若是逾期還書呢?在逾期的狀況下就要交納罰金,雖然也是「還書」,但是它多了一個「交納罰金」固然若是你在期限以內還書,交納罰金就不會發生。在這裏擴展點就是:逾期還書。
終於完成了,疏漏之處網友監督指正,你們共同進步。