這一段時間,參加了部門組織的 RUP 教學(xué)項目,由一位“外援”架構(gòu)師為我們指導(dǎo)教練。最近一直在忙于業(yè)務(wù)建模,今天剛剛將自己負(fù)責(zé)部分的系統(tǒng)用例識別了一遍。其間一直有一個問題,纏繞著包括我在內(nèi)的很多同事,那就是用例之間的關(guān)系——包含、擴展、泛化——到底該如何使用。
??? 翻閱了同事去年參加 RUP 培訓(xùn)時帶來的材料,終于能基本分清三者之間的關(guān)系。
?
用例是從系統(tǒng)外部可見的行為,是系統(tǒng)為某一個或幾個參與者( Actor )提供的一段完整的服務(wù)。從原則上來講,用例之間都是獨立、并列的,它們之間并不存在著包含從屬關(guān)系。但是為了體現(xiàn)一些用例之間的業(yè)務(wù)關(guān)系,提高可維護性和一致性,用例之間可以抽象出包含 (include) 、擴展 (extend) 和泛化 (generalization) 這幾種關(guān)系。
在分開介紹它們之前,先說下它們的共性:都是從現(xiàn)有的用例中抽取出公共的那部分信息,作為一個單獨的用例,然后通后過不同的方法來重用這個公共的用例,以減少模型維護的工作量。
?
1 、包含 (include)
包含關(guān)系:使用包含 ( Inclusion ) 用例來封裝一組跨越多個用例的相似動作(行為片斷),以便多個基( Base )用例復(fù)用。基用例控制與包含用例的關(guān)系,以及被包含用例的事件流是否會插入到基用例的事件流中。基用例可以依賴包含用例執(zhí)行的結(jié)果,但是雙方都不能訪問對方的屬性。
?
包 含關(guān)系對典型的應(yīng)用就是復(fù)用,也就是定義中說的情景。但是有時當(dāng)某用例的事件流過于復(fù)雜時,為了簡化用例的描述,我們也可以把某一段事件流抽象成為一個被 包含的用例;相反,用例劃分太細(xì)時,也可以抽象出一個基用例,來包含這些細(xì)顆粒的用例。這種情況類似于在過程設(shè)計語言中,將程序的某一段算法封裝成一個子 過程,然后再從主程序中調(diào)用這一子過程。
??? 例如:業(yè)務(wù)中,總是存在著維護某某信息的功能,如果將它作為一個用例,那新建、編輯以及修改都要在用例詳述中描述,過于復(fù)雜;如果分成新建用例、編輯用例和刪除用例,則劃分太細(xì)。這時包含關(guān)系可以用來理清關(guān)系。
?
?
2 、 擴展 (extend)
擴展關(guān)系:將基用例中一段相對獨立并且可選的動作,用擴展( Extension )用例加以封裝,再讓它從基用例中聲明的擴展點( Extension Point )上進(jìn)行擴展,從而使基用例行為更簡練和目標(biāo)更集中。
擴展用例為基用例添加新的行為。擴展用例可以訪問基用例的屬性,因此它能根據(jù)基用例中擴展點的當(dāng)前狀態(tài)來判斷是否執(zhí)行自己。但是擴展用例對基用例不可見。
對于一個擴展用例,可以在基用例上有幾個擴展點。
?
例如,系統(tǒng)中允許用戶對查詢的結(jié)果進(jìn)行導(dǎo)出、打印。對于查詢而言,能不能導(dǎo)出、打印查詢都是一樣的,導(dǎo)出、打印是不可見的。導(dǎo)入、打印和查詢相對獨立,而且為查詢添加了新行為。因此可以采用擴展關(guān)系來描述:
?
?
用例詳述里面大致可以這樣來寫:
執(zhí)行查詢 ? 基本流: 1. 員工選擇查詢功能 ??? ??? 員工期望查詢業(yè)務(wù)數(shù)據(jù)時,選擇查詢鏈接,從而啟動本用例的執(zhí)行。 2. 系統(tǒng)轉(zhuǎn)入查詢頁面,并顯示備選的查詢選項 ??? ??? 3. 員工填寫查詢條件并提交 ??? ??? ??? ??? 4. 系統(tǒng)驗證查詢條件的合法性 ??? ??? ??? ??? 驗證條件的格式以及簡單邏輯,如大小、前后、范圍 5. 系統(tǒng)將符合條件的信息返回 ??? ??? 系統(tǒng)將查詢結(jié)果以分頁列表的形式顯示在頁面上 6. 員工退出查詢功能 ??? ??? 員工點擊退出鏈接,返回到上一級頁面 ??? 擴展點:導(dǎo)出、打印擴展點定義在步驟 5 |
?
導(dǎo)出 ??? 該用例是在“導(dǎo)出、打印”擴展點上擴展了執(zhí)行查詢用例 ??? 基本流: ??? ??? 1 .如果員工要求導(dǎo)出,選擇導(dǎo)出按鈕 ??? ??? 。。。。。。 |
?
由上例可以看出 : 擴展用例的事件流往往可以也可抽象為基用例的備選流。但是在基用例本身已經(jīng)是一個很復(fù)雜的情況下,選用擴展關(guān)系將備選流抽象成為單獨的用例可以使基用例行為更簡練和目標(biāo)更集中(當(dāng)然上面的例子中基用例可能簡單了些)。
?
?
4 、 泛化 (generalization)
泛化關(guān)系:子用例和父用例相似,但表現(xiàn)出更特別的行為;子用例將繼承父用例的所有結(jié)構(gòu)、行為和關(guān)系。子用例可以使用父用例的一段行為,也可以重載它。父用例通常是抽象的。在實際應(yīng)用中很少使用泛化關(guān)系,子用例中的特殊行為都可以作為父用例中的備選流存在。
?
例如,業(yè)務(wù)中可能存在許多需要部門領(lǐng)導(dǎo)審批的事情,但是領(lǐng)導(dǎo)審批的流程是很相似的,這時可以做成泛化關(guān)系表示:
?
用例詳述里面大致可以這樣來寫:
審批 ? 基本流: 7. 領(lǐng)導(dǎo)選擇要審批的記錄 ??? ??? 領(lǐng)導(dǎo)期望審批記錄時,選擇待審批記錄鏈接,從而啟動本用例的執(zhí)行。 8. 系統(tǒng)轉(zhuǎn)入審批頁面,并顯示記錄的詳細(xì)信息 ??? ??? 9. 領(lǐng)導(dǎo)填寫審批意見 ??? ??? ??? ??? 領(lǐng)導(dǎo)根據(jù)記錄的合理性來填寫個人審批意見 10. ???????????? 提交審批結(jié)果 ??? ??? |
?
工資調(diào)整審批 ??? 該用例是審批用例的子用例 ??? 基本流: ??? ??? 1 .領(lǐng)導(dǎo)選擇要審批的記錄
?
2. 系統(tǒng)轉(zhuǎn)入審批頁面,并顯示記錄的詳細(xì)信息
?
3. 領(lǐng)導(dǎo)填寫審批意見
?
4. 提交審批結(jié)果 ??? ??? ??? ??? 如果調(diào)整幅度較大,則要提交上級審批 |
?
?
上面分析了用例之間的三種關(guān)系。其中最容易讓人迷惑的就是包含關(guān)系和擴展關(guān)系得區(qū)別。如果你現(xiàn)在對兩者還有迷惑,請再仔細(xì)的對比一下上面兩者的描述:)。