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