每日一得

          不求多得,只求一得 about java,hibernate,spring,design,database,Ror,ruby,快速開發(fā)
          最近關(guān)心的內(nèi)容:SSH,seam,flex,敏捷,TDD
          本站的官方站點(diǎn)是:顛覆軟件

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            220 隨筆 :: 9 文章 :: 421 評(píng)論 :: 0 Trackbacks

          這一段時(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ì)比一下上面兩者的描述:)。


          posted on 2006-08-29 22:23 Alex 閱讀(535) 評(píng)論(1)  編輯  收藏 所屬分類: 建模

          評(píng)論

          # re: [zt]RUP之用例間的關(guān)系 2008-01-25 10:51 Uranus
          你那個(gè)Include畫的有問(wèn)題  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 拉孜县| 新晃| 广灵县| 南溪县| 金寨县| 承德市| 恭城| 潜山县| 连城县| 平泉县| 防城港市| 维西| 祁连县| 任丘市| 施甸县| 出国| 神木县| 永胜县| 宜丰县| 高青县| 杭锦后旗| 行唐县| 会东县| 衡阳市| 镶黄旗| 鲜城| 茶陵县| 抚远县| 郴州市| 新巴尔虎右旗| 辽阳市| 三原县| 营口市| 和平县| 临洮县| 泗洪县| 弋阳县| 新兴县| 万宁市| 绿春县| 石阡县|