蘇晶
山東理工大學(xué) 山東 淄博 255049
UML用例模型是系統(tǒng)需求獲取及分析的重要手段,是最終用戶與開發(fā)人員溝通和交流的有效途徑。一旦用例模型被確定,所有分析、設(shè)計和開發(fā),包括之后的部署及測試等工作都需要以此為依據(jù)開展。
對于一個系統(tǒng)而言,不同參與者的需求千差萬別;另外,為了確保系統(tǒng)安全性,也需要為不同的參與者設(shè)置不同的訪問功能和權(quán)限。在系統(tǒng)分析和設(shè)計過程中,關(guān)系直觀體現(xiàn)了參與者訪問系統(tǒng)功能的具體方式,并直接影響和決定了系統(tǒng)的具體實(shí)現(xiàn)方式。由此可以看出,關(guān)系的識別在構(gòu)建用例模型的過程中發(fā)揮著至關(guān)重要的作用。
其中包含關(guān)系和泛化關(guān)系在表現(xiàn)形式和使用方法上較為相似,容易產(chǎn)生混淆,本文以自主點(diǎn)餐系統(tǒng)為例,對兩種關(guān)系的建模要點(diǎn)進(jìn)行分析和比較。
包含關(guān)系是指一個用例可以簡單地包含其他用例具有的行為,并將其所包含的用例行為作為自身行為的一部分,這兩個用例分別被稱為基礎(chǔ)用例和被包含用例。包含關(guān)系的具體表現(xiàn)形式為被包含用例的事件流可插入至基礎(chǔ)用例的事件流中。
在用例圖的建模過程中,一般有兩種情況需要使用到包含關(guān)系。第一種最為常用,在對用例的事件流進(jìn)行描述的過程中,若發(fā)現(xiàn)多個用例同時使用到同一段行為,則可將這段共同的行為單獨(dú)抽象成為一個用例,然后建立兩者之間的包含關(guān)系,從而實(shí)現(xiàn)重用并簡化事件流描述的目的。
以自主點(diǎn)餐系統(tǒng)為例,客戶可以進(jìn)行“預(yù)約餐臺”、“下單點(diǎn)餐”、“支付結(jié)算”和“發(fā)表評價”四個操作,所有操作均需在“登錄系統(tǒng)”后方可完成。根據(jù)描述,“登錄系統(tǒng)”為多個用例的共同行為,可將其抽象出來,成為一個新的用例,并建立其與4個基礎(chǔ)用例之間的包含關(guān)系。關(guān)系一旦創(chuàng)建,這4個基礎(chǔ)用例在用例規(guī)約的事件流描述中可直接對“登錄系統(tǒng)”用例的事件流進(jìn)行引用,避免了對公共行為的重復(fù)描述,提高了模型的可維護(hù)性。
包含關(guān)系使用的第二種情況為某一個用例提供的功能過多,事件流過于復(fù)雜,此時可將該用例分解為粒度較小的幾個用例,然后建立分解后小用例與原來基礎(chǔ)用例之間的包含關(guān)系。
如自主點(diǎn)餐系統(tǒng)中管理員的“維護(hù)菜品”操作,由于功能過多,可將其分解為“添加菜品”、“修改菜品”和“刪除菜品”三個用例,則三個粒度較小用例與基礎(chǔ)用例間可建立包含關(guān)系。需要注意的是,這種方式的包含關(guān)系不允許參與者直接訪問包含用例,這也是兩種包含關(guān)系之間最大的區(qū)別。
用例間的泛化關(guān)系將特化的用例與一般化的用例聯(lián)系起來,這兩個用例分別被稱為子用例和父用例。子用例繼承了父用例所有的結(jié)構(gòu)、行為和關(guān)系,并且可以添加、覆蓋或者改變繼承的行為。
在對用例的事件流進(jìn)行描述的過程中,發(fā)現(xiàn)兩個或者多個用例在行為、結(jié)構(gòu)和目的方面存在共性時,可以新建一個一般化的用例用于描述這些共有部分和一般過程,然后建立特化用例和一般化用例之間的泛化關(guān)系,從而實(shí)現(xiàn)重用并簡化事件流描述的目的。
在自主點(diǎn)餐系統(tǒng)的功能性需求中,有這樣一段描述,“支付結(jié)算”主要包括“支付寶結(jié)算”和“會員卡結(jié)算”兩種方式。經(jīng)過分析發(fā)現(xiàn),“支付寶結(jié)算”和“會員卡結(jié)算”兩個用例在行為、結(jié)構(gòu)和目的方面都存在共性,都屬于“支付結(jié)算”的特殊方式,因此可將其抽象為父用例,兩種代表具體支付方式的用例抽象為子用例,建立泛化關(guān)系,并且箭頭方向從子用例指向父用例。
需要注意的是,為了降低系統(tǒng)耦合度,一般將父用例設(shè)計為抽象用例,即在父用例中并不提供具體的行為和功能,而將行為描述的職責(zé)交給子用例來完成[1]。
包含關(guān)系和泛化關(guān)系均屬于用例之間的關(guān)系,并且基本表現(xiàn)形式都是從現(xiàn)有用例的事件流中抽取出共有部分,將其作為一個單獨(dú)的用例,從而達(dá)到復(fù)用現(xiàn)有用例的行為,并提高模型可維護(hù)性的目的。但兩者在實(shí)際使用過程中又存在著顯著的區(qū)別。
以自主點(diǎn)餐系統(tǒng)為例,分析兩者的區(qū)別主要包括以下兩個方面:
在泛化關(guān)系中,子用例“支付寶結(jié)算”和“會員卡結(jié)算”不管在名稱、行為、結(jié)構(gòu)還是目等方面都存在著共性,并且都屬于“支付結(jié)算”的特殊形式,因此原有用例是整體上的相似。
而在包含關(guān)系中,基礎(chǔ)用例“預(yù)約餐臺”、“下單點(diǎn)餐”、“支付結(jié)算”和“發(fā)表評價”在名稱、結(jié)構(gòu)和目的方面可以完全不同,只不過它們都有一段相似的行為,也就是“登錄系統(tǒng)”而已,因此原有用例只是部分上的相似。
在泛化關(guān)系中,需要將多個子用例中的共性抽象成為一個父用例,子用例在繼承父用例的基礎(chǔ)上可以進(jìn)行修改,子用例間相互獨(dú)立,任何一個子用例的執(zhí)行不受其他子用例的影響。如果父用例“支付結(jié)算”為抽象用例,不提供具體的查看方法,則子用例“會員卡結(jié)算”被參與者啟動后,父用例“支付結(jié)算”不會被執(zhí)行。
而對于包含關(guān)系,是將多個基礎(chǔ)用例中的公共行為抽象為一個被包含用例,可以說被包含用例是基礎(chǔ)用例的重要組成部分,因此,基礎(chǔ)用例“支付結(jié)算”被參與者啟動后,被包含用例“登錄系統(tǒng)”必然會被執(zhí)行[2]。
用例圖中的模型元素之間并非相互獨(dú)立,參與者之間、用例之間、參與者與用例之間均存在著不同類型的關(guān)系。從用戶層面來看,關(guān)系描述了模型元素間具體化的語義連接,反映了參與者使用系統(tǒng)的具體方式;從開發(fā)者層面來看,關(guān)系體現(xiàn)了事件處理的流程與協(xié)作,決定了系統(tǒng)功能的實(shí)現(xiàn)方式。因此,在用例建模過程中,需準(zhǔn)確把握各種關(guān)系的使用方法和建模要點(diǎn),避免因識別有誤而對后續(xù)的設(shè)計和開發(fā)過程產(chǎn)生不利影響。