林郁峰,陳中育,駱正平,吳星同
(浙江師范大學(xué)數(shù)理與信息工程學(xué)院,浙江 金華 321004)
對(duì)于軟件需求,研究人員提出了許多捕獲手段和建模方法,其中用例(Use Case)[1-2]作為重要需求建模工具被廣泛使用。用例驅(qū)動(dòng)的需求建模方法優(yōu)點(diǎn)在于:開(kāi)發(fā)者站在用戶視角觀察將要開(kāi)發(fā)的系統(tǒng)[3],抽象出系統(tǒng)中的參與者(Actor),將一系列場(chǎng)景抽象成用例。在實(shí)際應(yīng)用中,用例建模也暴露出一些缺點(diǎn),如:用例建模對(duì)參與者及其場(chǎng)景挖掘沒(méi)有一套系統(tǒng)方法;用例之間存在相互交錯(cuò)情況,其粒度難以把握。文獻(xiàn)[4]提出將“纏繞”需求模塊化,有效改善了用例之間的交錯(cuò)行為。文獻(xiàn)[5]提出了面向目標(biāo)的需求分析法,將目標(biāo)看作是需求來(lái)源,以目標(biāo)作為需求獲取的基本線索,采用文本、采訪等手段誘導(dǎo)需求提供者按照目標(biāo)的分解、精化和抽象關(guān)系逐步構(gòu)建系統(tǒng),從而保證需求的完整性。文獻(xiàn)[6]將目標(biāo)和場(chǎng)景與用例結(jié)合,以目標(biāo)作為起點(diǎn),場(chǎng)景加以誘導(dǎo),配合需求分析員進(jìn)行用例建模。
然而,文獻(xiàn)[4-5]只是針對(duì)用例的單個(gè)方面問(wèn)題給出解決方案,文獻(xiàn)[6]雖然對(duì)用例的2個(gè)缺陷都有所改進(jìn),但其需求從獲取到建模的整個(gè)過(guò)程過(guò)度依賴自然語(yǔ)言,通過(guò)討論分析的方法最終由需求分析員進(jìn)行需求建模,識(shí)別與分析的過(guò)程耗費(fèi)時(shí)間,且不同人討論得出的結(jié)論不盡相同。為此,本文基于目標(biāo)轉(zhuǎn)換的用例建模方法,在目標(biāo)基礎(chǔ)上,將面向方面[7]的思想融入到用例驅(qū)動(dòng)的需求建模中,采用可擴(kuò)展標(biāo)記語(yǔ)言XML存儲(chǔ)目標(biāo)模型、識(shí)別關(guān)注點(diǎn)來(lái)構(gòu)建用例模型,該方法不僅解決了用例來(lái)源不明、用例間相互交錯(cuò)等問(wèn)題,且在用例需求建模過(guò)程中,將分析方法總結(jié)成轉(zhuǎn)換算法,避免過(guò)度依賴自然語(yǔ)言的情形。
目標(biāo)模型是1個(gè)樹(shù)形圖[8-10],高層目標(biāo)是指系統(tǒng)目標(biāo),表示最粗粒度目標(biāo)。例如,1個(gè)圖書(shū)管理系統(tǒng),它的高層目標(biāo)可以是提供便捷的圖書(shū)服務(wù)。目標(biāo)是可以逐層分解的,圖書(shū)管理系統(tǒng)可以分解出借書(shū)、還書(shū)、付費(fèi)等子目標(biāo),且各個(gè)子目標(biāo)能夠繼續(xù)被分解。參照文獻(xiàn)[6],本文采用的4層目標(biāo)模型如下:
1)業(yè)務(wù)目標(biāo)層(Business Goal)。識(shí)別待開(kāi)發(fā)系統(tǒng)的整體目標(biāo),描述為什么開(kāi)發(fā)系統(tǒng)。
2)服務(wù)目標(biāo)層(Service Goal)。描述系統(tǒng)提供的不同服務(wù),它們共同實(shí)現(xiàn)業(yè)務(wù)目標(biāo)。
3)交互目標(biāo)層(Interaction Goal)。服務(wù)目標(biāo)的進(jìn)一步細(xì)分,描述服務(wù)中特定的情節(jié)。
4)內(nèi)部目標(biāo)層(Inner Goal)。完成交互所需的動(dòng)作或動(dòng)作序列。
XML是1種元標(biāo)記語(yǔ)言[11],通過(guò)標(biāo)記語(yǔ)言將文檔切分,并對(duì)每個(gè)部分加以標(biāo)識(shí)。本文選用XML語(yǔ)言存儲(chǔ)目標(biāo)模型的原因是:1)XML標(biāo)簽按照順序進(jìn)行嵌套,從標(biāo)記的最外層到最內(nèi)層能夠很好地對(duì)應(yīng)目標(biāo)模型的高層到低層,且XML標(biāo)簽?zāi)軌驅(qū)?yīng)目標(biāo)名稱;2)XML作為1種存儲(chǔ)數(shù)據(jù)的工具,能夠通過(guò)查詢語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的數(shù)據(jù)索引、查找、排序等功能,為目標(biāo)模型的轉(zhuǎn)化提供支持;3)XML可擴(kuò)展性好,其簡(jiǎn)單性使其極易在任何程序中讀寫數(shù)據(jù),為需求建模工具的開(kāi)發(fā)提供了便利。
文獻(xiàn)[6]提出的基于目標(biāo)-場(chǎng)景的需求分析方法中,采用表格模板作為驅(qū)動(dòng),通過(guò)分析人員的引導(dǎo)將用戶需求轉(zhuǎn)化為目標(biāo)和場(chǎng)景樹(shù)。目標(biāo)和場(chǎng)景被用戶認(rèn)可后,分析人員根據(jù)現(xiàn)有目標(biāo)場(chǎng)景總結(jié)出1套用例描述規(guī)則。根據(jù)描述規(guī)則,用戶協(xié)助需求分析員將每個(gè)用例的相關(guān)信息(名字、參與者、前置條件、后置條件、相關(guān)用例)及事件流填入用例表格。通過(guò)“目標(biāo)與場(chǎng)景關(guān)系圖”導(dǎo)出“目標(biāo)-場(chǎng)景到用例的轉(zhuǎn)化規(guī)則”,其工作流程如圖1所示。
圖1 目標(biāo)-場(chǎng)景需求分析法的工作流程
雖然這種方法指出了用例建模的不足并分別對(duì)它們進(jìn)行了改進(jìn),但是其用例模型轉(zhuǎn)化過(guò)程過(guò)分依賴于自然語(yǔ)言,自然語(yǔ)言存在二義性。本文提出基于目標(biāo)轉(zhuǎn)換的用例建模方法,希望改進(jìn)上述方法中過(guò)分依賴自然語(yǔ)言的情形,提高模型轉(zhuǎn)化效率和準(zhǔn)確度。將目標(biāo)作為用例建模的先決條件,主要研究從目標(biāo)模型到用例模型之間的轉(zhuǎn)換,在目標(biāo)和用例之間構(gòu)造1個(gè)轉(zhuǎn)換器,其輸入是目標(biāo)模型,輸出為用例模型。該方法的工作流程和轉(zhuǎn)換器結(jié)構(gòu)(虛線框)如圖2所示。
圖2 基于目標(biāo)的用例建模方法
本文方法的工作原理如下:
1)根據(jù)目標(biāo)模型和XML的相似性,制定映射表。
2)給出關(guān)注點(diǎn)識(shí)別規(guī)則,根據(jù)規(guī)則總結(jié)出XML轉(zhuǎn)換算法。
3)根據(jù)映射表,將目標(biāo)映射為XML文檔。
4)根據(jù)XML轉(zhuǎn)換算法,用XQuery編寫程序,在XML文檔中識(shí)別出關(guān)注點(diǎn)。
5)將核心關(guān)注點(diǎn)和橫切關(guān)注點(diǎn)轉(zhuǎn)化為用例和包含用例,并明確其關(guān)聯(lián)性,得到用例模型。
本文的4層目標(biāo)模型如圖3所示。
圖3 4層目標(biāo)模型
按照業(yè)務(wù)目標(biāo)層到內(nèi)部目標(biāo)層的順序,其對(duì)應(yīng)的映射表(表1)中給出了4個(gè)XML元標(biāo)簽的定義,即:<BusinessGoal>作為根元素,其對(duì)應(yīng)的業(yè)務(wù)目標(biāo)層在4層目標(biāo)模型中是最高層;<InnerGoal>對(duì)應(yīng)于內(nèi)部目標(biāo)層,是最底層的元素。每個(gè)元素標(biāo)簽及其關(guān)閉標(biāo)簽之間包含了諸如<ServiceGoalName>、<InnerG-oalName>的名稱標(biāo)簽,這類標(biāo)簽包含的文本內(nèi)容就是當(dāng)前目標(biāo)名稱。例如<ServiceGoal>標(biāo)簽及其關(guān)閉標(biāo)簽 <ServiceGoal/>之間包含了4對(duì) <Service-GoalName>標(biāo)簽,表示服務(wù)目標(biāo)層中有4個(gè)目標(biāo)存在。根據(jù)映射表,目標(biāo)模型樹(shù)形圖能夠映射成XML,以文檔的形式存儲(chǔ)下來(lái)。
表1 XML映射表
在4層目標(biāo)模型中,業(yè)務(wù)目標(biāo)是系統(tǒng)的最高目標(biāo),服務(wù)目標(biāo)層表示系統(tǒng)所提供的不同服務(wù),交互目標(biāo)層描述的是提供服務(wù)的場(chǎng)景序列,而內(nèi)部目標(biāo)則是場(chǎng)景的一些事件流。由于需求分析階段相同的事件流可能分布在不同的需求模塊中,本文借鑒面向方面編碼(AOP)[12-14]的思想,把這類需求模塊叫做橫切關(guān)注點(diǎn),而那些相對(duì)獨(dú)立的、能表示業(yè)務(wù)流程的需求模塊,稱之為核心關(guān)注點(diǎn)[15]。在1個(gè)用例中,橫切關(guān)注點(diǎn)和核心關(guān)注點(diǎn)分別對(duì)應(yīng)包含(或擴(kuò)展)用例和對(duì)等用例。包含用例往往分布在各個(gè)對(duì)等用例中,在用例建模過(guò)程中反復(fù)出現(xiàn)使得用例變得復(fù)雜而冗長(zhǎng)。如果能夠識(shí)別XML文檔中的橫切關(guān)注點(diǎn)和核心關(guān)注點(diǎn)并對(duì)橫切關(guān)注點(diǎn)進(jìn)行建模,就能識(shí)別包含用例,使對(duì)等用例保持分離,控制用例粒度,改善用例交錯(cuò)的問(wèn)題。根據(jù)文獻(xiàn)[6]中的用例轉(zhuǎn)化規(guī)則,將識(shí)別層次鎖定在目標(biāo)模型的第3、4層,根據(jù)XML映射表,給出相應(yīng)的XML轉(zhuǎn)換規(guī)則和算法。
2.2.1 XML 轉(zhuǎn)換規(guī)則
1)識(shí)別核心關(guān)注點(diǎn):識(shí)別交互目標(biāo),它們是核心關(guān)注點(diǎn)。
2)識(shí)別橫切關(guān)注點(diǎn):根據(jù)父節(jié)點(diǎn)個(gè)數(shù),篩選內(nèi)部目標(biāo)。
由于目標(biāo)模型中父目標(biāo)下不會(huì)包含相同的子目標(biāo),其對(duì)應(yīng)的XML文檔中,同一父元素下也不會(huì)出現(xiàn)重復(fù)子元素。所以只需判斷內(nèi)部目標(biāo)出現(xiàn)次數(shù)即可篩選出橫切關(guān)注點(diǎn),這里把內(nèi)部目標(biāo)中橫切關(guān)注點(diǎn)以外的識(shí)別為原子關(guān)注點(diǎn),它們是核心關(guān)注點(diǎn)中無(wú)交錯(cuò)的部分。
2.2.2 XML 轉(zhuǎn)換算法
1)遍歷 XML文檔,找到 <InteractionGoalName>,將其標(biāo)注為<CoreConcerns>并返回。
2)判斷所有<InnerGoalName>標(biāo)簽下的文本內(nèi)容。
a)將擴(kuò)散度(出現(xiàn)次數(shù))大于1的標(biāo)簽標(biāo)記為<CrossCuttingConcerns>并返回。
b)將擴(kuò)散度等于1的標(biāo)簽標(biāo)記為 <AtomConcerns>并返回。
通過(guò)XML轉(zhuǎn)換算法,識(shí)別出了XML文檔中的核心關(guān)注點(diǎn)、橫切關(guān)注點(diǎn)以及原子關(guān)注點(diǎn),并分別以<CoreConcerns>、<CrossCuttingConcerns>和<Atom-Concerns>標(biāo)簽標(biāo)記。
核心關(guān)注點(diǎn)在用例模型中表示對(duì)等用例,橫切關(guān)注點(diǎn)在被識(shí)別前分布在多個(gè)對(duì)等用例中,破壞了對(duì)等用例的獨(dú)立性。這里將橫切關(guān)注點(diǎn)從核心關(guān)注點(diǎn)中抽離,組成包含用例,降低了對(duì)等用例的耦合度,使對(duì)等用例保持分離。而原子關(guān)注點(diǎn)則是組成每個(gè)對(duì)等用例的事件流,不出現(xiàn)在用例模型中。表2反映了元標(biāo)記、關(guān)注點(diǎn)、用例之間的映射關(guān)系。
表2 元標(biāo)記-關(guān)注點(diǎn)-用例的映射關(guān)系
雖然包含用例和對(duì)等用例已經(jīng)被識(shí)別,但它們之間的關(guān)系并未明確,所以還不能得到完整的用例模型。為了得到它們之間的關(guān)系,可以根據(jù)橫切點(diǎn)識(shí)別結(jié)果,對(duì)原XML文檔再做1次識(shí)別,識(shí)別方法為:為每個(gè)包含用例,也就是帶<CrossCuttingConcerns>標(biāo)簽的內(nèi)容,假設(shè)內(nèi)容是“Cname”,在Goal.xml中尋找其父節(jié)點(diǎn),在<InteractionGoal>下遍歷<InnerGoalName>內(nèi)容,若與“Cname”相同,返回<InteractionGoalName>。
運(yùn)算結(jié)果確定了包含用例及與其相連的對(duì)等用例。根據(jù)UML標(biāo)準(zhǔn),對(duì)等用例和包含用例用橢圓表示,它們之間的聯(lián)系用帶箭頭的虛線表示,虛線上用“include”表示包含關(guān)系。
本節(jié)以客運(yùn)服務(wù)系統(tǒng)為例,采用XML轉(zhuǎn)換算法對(duì)目標(biāo)模型進(jìn)行用例建模。該系統(tǒng)是針對(duì)客運(yùn)乘客和管理人員開(kāi)發(fā)的,目的是提供信息查詢、票務(wù)管理、信息管理等功能,而票務(wù)管理功能為乘客提供訂票、取票、退票等服務(wù)。其4層目標(biāo)模型如圖4所示。
圖4 客運(yùn)服務(wù)系統(tǒng)目標(biāo)模型
根據(jù)系統(tǒng)的目標(biāo)模型,通過(guò)XML映射表,將4層目標(biāo)模型轉(zhuǎn)化成帶有<BusinessGoal>、<ServiceGoal>、<InteractionGoal>和 <InnerGoal>4層標(biāo)簽的kyfw.xmlXML文檔,如圖5所示。
圖5 客運(yùn)服務(wù)系統(tǒng)的XML模型
圖5中第7、14、20行的<InteractionGoal>中分別存儲(chǔ)了訂票服務(wù)、取票服務(wù)、退票服務(wù)3個(gè)交互目標(biāo)。
本文以O(shè)xygen XML Editor為實(shí)驗(yàn)平臺(tái),將XML轉(zhuǎn)換算法編寫成kyfw.xquery文件,對(duì)kyfw.xml文檔進(jìn)行篩選,結(jié)合實(shí)例給出分析如下:
該文件以XQuery 1.0為語(yǔ)言,以文獻(xiàn)[16-17]為技術(shù)參考,以oxy為命名空間編寫。在第3行中,申明了kyfw.xml,也就是存放著客運(yùn)服務(wù)目標(biāo)模型的XML文件的路徑。第5到8行是識(shí)別核心關(guān)注點(diǎn)的函數(shù)。而區(qū)分橫切關(guān)注點(diǎn)和原子關(guān)注點(diǎn)的函數(shù)則出現(xiàn)在第9到16行。最后帶有<Concerns>標(biāo)簽的是主函數(shù),調(diào)用之前申明的2個(gè)函數(shù)。識(shí)別結(jié)果如圖6所示。
圖6中帶有 <CoreConcerns>標(biāo)簽的“訂票服務(wù)”、“取票服務(wù)”以及“退票服務(wù)”被識(shí)別為核心關(guān)注點(diǎn)。而“計(jì)算賬單”和“核對(duì)訂單”因?yàn)閹в校糃ross-CuttingConcerns>標(biāo)簽,為橫切關(guān)注點(diǎn),而剩下的“檢查車次信息”等則是原子關(guān)注點(diǎn)。所以“訂票服務(wù)”、“取票服務(wù)”及“退票服務(wù)”在用例模型中作為對(duì)等用例出現(xiàn),用橢圓表示。而“計(jì)算賬單”和“核對(duì)訂單”因?yàn)闄M切了多個(gè)核心關(guān)注點(diǎn)而作為橫切關(guān)注點(diǎn),在用例模型中以包含用例的形式出現(xiàn),用帶箭頭的虛線連接對(duì)等用例。
圖6 XML識(shí)別結(jié)果
確定了對(duì)等用例和包含用例之后,需要明確其關(guān)系。根據(jù)3.2節(jié)中提出的識(shí)別方法編寫 relation.xquery,對(duì)關(guān)注點(diǎn)識(shí)別結(jié)果進(jìn)一步處理。以下是核心的relation函數(shù):
relation函數(shù)的第2、3行分別遍歷了kyfw.xml文件中的所有InteractionGoal元素以及橫切關(guān)注點(diǎn)名稱集合,第4行限制了返回的條件,也就是當(dāng)InteractionGoalName的文本字段與橫切關(guān)注點(diǎn)名中字段相等時(shí)才返回。最終結(jié)果以橫切關(guān)注點(diǎn)字段順序排列,格式為“對(duì)等用例”includes“包含用例”。識(shí)別結(jié)果如圖7所示。
圖7 對(duì)等用例和包含用例關(guān)系識(shí)別結(jié)果
在圖7中“核對(duì)訂單”和“計(jì)算賬單”分別與2個(gè)對(duì)等用例形成聯(lián)系,這樣,“訂票服務(wù)”、“取票服務(wù)”、“退票服務(wù)”作為3個(gè)對(duì)等用例出現(xiàn)在用例模型中,同時(shí)“取票服務(wù)”、“退票服務(wù)”有共同的包含用例“核對(duì)訂單”,“訂票服務(wù)”、“退票服務(wù)”則都包含了“計(jì)算賬單”。根據(jù)UML規(guī)范,可以得到用例模型如圖8所示。
圖8 最終的用例模型
對(duì)傳統(tǒng)的面向?qū)ο蠓椒╗2]、基于目標(biāo)的方法[4]、AOSD 方法[5]、目標(biāo)-場(chǎng)景方法[6]以及本文方法,在需求的獲取手段、識(shí)別手段、識(shí)別效率、需求模型精度和向設(shè)計(jì)階段過(guò)渡的能力5個(gè)方面進(jìn)行比較發(fā)現(xiàn),基于目標(biāo)的方法提供了1種很好的需求捕獲手段,面向?qū)ο笮枨蠓治鲋械挠美P湍軌蜃屝枨罅己玫剡^(guò)渡到設(shè)計(jì)階段,本文方法較好地結(jié)合了兩者的長(zhǎng)處。同時(shí),相比自然語(yǔ)言,更為形式化的算法提高了需求傳達(dá)和需求建模過(guò)程的穩(wěn)定性和魯棒性。如遇到新的需求或原先的需求產(chǎn)生了變更,只需更新目標(biāo)模型并重新映射,算法的實(shí)現(xiàn)無(wú)需變更,使建模過(guò)程效率更高。表3給出了上述幾種建模方法在5個(gè)方面的比較結(jié)果。
表3 方法比較結(jié)果
針對(duì)用例建模過(guò)程中存在的問(wèn)題,本文提出采用XML轉(zhuǎn)換算法進(jìn)行用例建模,并以客運(yùn)服務(wù)系統(tǒng)為例,驗(yàn)證了該方法的可行性。結(jié)果表明,當(dāng)需求存在交織的問(wèn)題時(shí),算法能夠清晰地識(shí)別和篩選關(guān)注點(diǎn),避免了人工分析可能產(chǎn)生的偏差,為用例建模提供了重要判斷依據(jù)。尤其遇到龐大、復(fù)雜的系統(tǒng)時(shí),這種方法能夠?yàn)橛美R(shí)別節(jié)省大量時(shí)間,將共用的事件流從對(duì)等用例中抽離形成包含用例則能減少用例模型的冗余,使其保持低耦合的狀態(tài)。當(dāng)然,該方法也存在一定的不足,比如從需求到用例的過(guò)程中,需要對(duì)XML文檔進(jìn)行2次操作。下一步的研究工作將是,借助XML適用于多平臺(tái)的特性,為用例模型設(shè)計(jì)形式化的開(kāi)發(fā)工具。
[1] 盧梅,李明樹(shù).軟件需求工程——方法及工具評(píng)述[J].計(jì)算機(jī)研究與發(fā)展,1999,36(11):1289-1300.
[2] Jacobson I.Object Oriented Software Engineering:A Use Case Driven Approach[M].New York:Addison Wesley,1992.
[3] Larman C.Applying UML and Patterns:An Introduction to Object-oriented Analysis and Design and Iterative Development[M].Prentice Hall,2006.
[4] Jacobson I,Ng P W.Aspect-oriented Software Development with Use Cases[M].New York:Addison Wesley,2005.
[5] Dardenne A,Van Lamsweerde A,F(xiàn)ickas S.Goal-directed requirements acquisition[J].Science of Computer Programming,1993,20(1-2):3-50.
[6] 戴娟.基于目標(biāo)與場(chǎng)景的用例驅(qū)動(dòng)需求分析技術(shù)研究[D].西安:西安電子科技大學(xué),2012.
[7] 莫倩,劉曉.面向方面的軟件工程指南[J].計(jì)算機(jī)工程,2007,33(14):62-65.
[8] Van Lamsweerde A.Goal-oriented requirements engineering:A guided tour[C]//Proceedings of the 5th IEEE InternationalSymposium on Requirements Engineering.2001:249-262.
[9] Yue K.What does it mean to say that a specification is complete?[C]//Proceedings of the 4th International Workshop on Software Specification and Design.1987.
[10] Anton A I.Goal-based requirements analysis[C]//Proceedings of the 2nd International Conference on Requirements Engineering.1996:136-144.
[11] 李辛.基于語(yǔ)義相關(guān)性的XML關(guān)鍵字查詢的研究與實(shí)現(xiàn)[D].北京:北京交通大學(xué),2009.
[12] Kiczales G,Lamping J,Mendhekar A,et al.Aspect-oriented programming[C]//Proceedings of the 11th European Conference on Object-oriented Programming.1997:220-242.
[13] 金英,劉華虓,張鵬.一種面向方面需求模型的分析與驗(yàn)證方法[J].計(jì)算機(jī)學(xué)報(bào),2013,36(1):63-73.
[14] 韓曉英,虞慧群.一種基于UML的面向方面模塊動(dòng)態(tài)特性編織方法[J].華東理工大學(xué)學(xué)報(bào)(自然科學(xué)版),2007,33(3):394-399.
[15] 何明昕.關(guān)注點(diǎn)分離在計(jì)算思維和軟件工程中的方法論意義[J].計(jì)算機(jī)科學(xué),2009,36(4):60-63.
[16] Holzner S.XML:A Beginner’s Guide:Go Beyond the Basics with Ajax,XHTML,XPath 2.0,XSLT 2.0 and XQuery[M].Osborne/McGraw-Hill,2009.
[17] Walmsley P.XQuery權(quán)威指南[M].王銀輝,譯.北京:電子工業(yè)出版社,2009.