[摘要] 統(tǒng)一建模語言UML是一種面向?qū)ο蟮臉?biāo)準(zhǔn)建模語言,它融入了軟件工程領(lǐng)域的新思想、新方法和新技術(shù),使用范圍不僅限于支持面向?qū)ο蟮姆治雠c設(shè)計,還支持從需求分析開始的軟件開發(fā)的全過程。通過對集裝箱管理系統(tǒng)開發(fā)過程分析,詳細闡述了UML語言工具在管理系統(tǒng)建模過程中的應(yīng)用及其對于加速系統(tǒng)開發(fā)進程和提高代碼質(zhì)量的重要性。
[關(guān)鍵詞] 統(tǒng)一建模語言 管理系統(tǒng) 建模 應(yīng)用
一、引言
統(tǒng)一建模語言UML(Unified Modeling Language)是一種用于描述、視化和構(gòu)架軟件系統(tǒng)以及商業(yè)建模的語言。它提供了多種基本的模型圖,并通過對這些圖的綜合運用來全面刻畫整個系統(tǒng)的全貌。UML符號表示法為開發(fā)者使用這些圖形符號和文本語法進行系統(tǒng)建模提供了標(biāo)準(zhǔn),具體可分為5大類,9種圖形。5大類分別是用例圖、靜態(tài)圖、行為圖、交互圖和實現(xiàn)圖。靜態(tài)圖包括類圖和對象圖,用來描述靜態(tài)關(guān)系;行為圖包括狀態(tài)圖和活動圖,用來描述系統(tǒng)的動態(tài)模型和組成對象之間的交互關(guān)系;交互圖包括協(xié)作圖和順序圖,用來描述對象間的交互關(guān)系;實現(xiàn)圖包括組件圖和配置圖,分別用來描述代碼組件的物理結(jié)構(gòu)以及系統(tǒng)中軟硬件的物理體系結(jié)構(gòu)。
二、基于UML 的系統(tǒng)開發(fā)過程
UML是一種建模語言而不是方法,UML本身獨立于過程,使用UML進行開發(fā)時,仍有統(tǒng)一的過程框架。UML的開發(fā)過程是一種柔性開發(fā)過程,即在需求牽引下,自頂向下分層細化地建模,然后通過對模型的虛擬執(zhí)行,由底向上地逐層上移修改,直至各層的模型結(jié)果都滿足需求為止。
系統(tǒng)的開發(fā)過程包括需求定義、分析、設(shè)計、實現(xiàn)幾個階段。需求定義階段建立系統(tǒng)的需求模型,分析階段建立系統(tǒng)的分析模型,這兩個模型是系統(tǒng)設(shè)計和實現(xiàn)的基礎(chǔ)。
建立系統(tǒng)需求模型包括:
1.問題陳述。根據(jù)用戶初始需求,在用戶幫助下,寫出問題陳述;
2.定義參與者(Actor)。在用戶參與下定義系統(tǒng)的參與者;
3.建立GUI界面原型。在用戶參與下,用可視化編程工具為每個參與者建立GUI界面原型;
4.定義用例。觀察參與者與界面原型的交互過程,導(dǎo)出用例。建立系統(tǒng)分析模型主要包括:
(1)靜態(tài)建模。根據(jù)問題陳述和用例,對系統(tǒng)的靜態(tài)結(jié)構(gòu)建模,靜態(tài)模型可以用類圖表示,它概要地描繪了問題域?qū)ο箢?,同時也表示出這些類的基本屬性和類間的關(guān)系。
(2)動態(tài)建模。根據(jù)用例及靜態(tài)模型進行動態(tài)建模,動態(tài)模型可用順序圖、合作圖、狀態(tài)圖等表示。動態(tài)模型表達了系統(tǒng)的動態(tài)特征。
下面以集裝箱管理系統(tǒng)的開發(fā)實例闡述如何利用UML 建立系統(tǒng)的需求模型和分析模型。
三、建立CFS 業(yè)務(wù)信息系統(tǒng)的需求模型
1.問題描述
CFS是集裝箱貨運站(CONTAINER FREIGHT STATION)的縮寫,是處理拼箱貨的場所,它的主要業(yè)務(wù)分成兩大塊,即進口貨拆箱業(yè)務(wù)和出口貨裝箱業(yè)務(wù)。在進口貨拆箱業(yè)務(wù)中,貨主或其代理先將記錄著集裝箱裝貨信息的箱單送到貨運站,申明有重箱(即裝有進口貨的集裝箱)要送來拆箱。在其后的某一時間,重箱由某車隊送到貨運站,貨運站馬上根據(jù)箱單進行拆箱操作,通常,拆出的貨物還要放入倉庫的跺位中,空箱子由車隊及時拉走送到另外的堆箱場地(即集裝箱堆場)。以后,收貨人來提貨時貨運站再從跺位中取出貨物交給收貨人。在出口貨裝箱業(yè)務(wù)中,貨主或其代理先發(fā)出裝箱委托(假定都是整箱貨委托)。其后,貨到時,就將貨放入分配給該委托單位的垛位。此后的某一時間,進行配積載并實施裝箱。最后,重箱交給車隊送往港區(qū)。由于拆裝箱是貨運站的主要業(yè)務(wù),倉庫存放貨物是輔助性動作,為了加快周轉(zhuǎn),在貨運站倉庫堆放貨物,有個免費倉期問題。
2.參與者與用例分析
首先,確定了系統(tǒng)的兩個參與者(Actor),即倉庫管理員和倉庫主管。通過為他們建立系統(tǒng)界面原型,觀察他們與界面交互的過程,可以分析出每個參與者使用的用例。所謂用例就是參與者與系統(tǒng)的一次對話中所執(zhí)行的一系列相關(guān)事務(wù)序列。系統(tǒng)中各用例間及用例和參與者間的關(guān)系可由例圖表示,本系統(tǒng)的用例圖(部分)如圖1所示。
用例圖只是表達了用例間及用例和參與者間的關(guān)系,我們還必須文檔化每個用例的具體內(nèi)容。集裝箱貨運站系統(tǒng)各用例描述如下:
(1)拆箱受理。倉庫管理員收到客戶拆箱委托時執(zhí)行本用例。①倉庫管理員創(chuàng)建新的拆箱委托單;②倉庫管理員填寫委托信息。如發(fā)貨人和收貨人名稱、提單號、箱號、受理日期、計劃拆箱日期、貨物信息(包括貨類、貨物描述、數(shù)量、單位等)。系統(tǒng)自動生成委托號。③系統(tǒng)標(biāo)記委托單狀態(tài)為“受理”。
(2)重箱進場。本用例從客戶將重箱送進場時開始。①倉庫管理員調(diào)出拆箱委托單,輸入重箱進場日期;②系統(tǒng)標(biāo)記委托單狀態(tài)為“已進場”。
(3)預(yù)分配垛位。倉庫管理員受理拆箱委托后,可以根據(jù)情況在重箱進場前或重箱進場后但尚未拆箱時為該筆委托單預(yù)分配一個垛位。①倉庫管理員查詢垛位狀態(tài)圖;②倉庫管理員為拆箱委托單預(yù)分配一個空垛位;③系統(tǒng)標(biāo)記該垛位為“鎖定”狀態(tài);④系統(tǒng)標(biāo)記委托單狀態(tài)為“預(yù)分配”。若分配的垛位不處于“空閑”狀態(tài),則系統(tǒng)拒絕接受預(yù)分配垛位操作。
(4)拆箱入垛。在已為拆箱委托單預(yù)分配垛位并且重箱進場后,可以執(zhí)行拆箱入垛用例。①倉庫管理員調(diào)出拆箱委托單;②倉庫管理員執(zhí)行拆箱入垛操作;③系統(tǒng)標(biāo)記該垛位為“占用”狀態(tài);④系統(tǒng)標(biāo)記委托單狀態(tài)為“已入垛”。
(5)貨物交出。當(dāng)將垛位的貨物提出交給客戶時,執(zhí)行本用例。①倉庫管理員調(diào)出拆箱委托單,執(zhí)行貨物交出操作,輸入交貨日期;②系統(tǒng)標(biāo)記該垛位為“空閑”狀態(tài);③系統(tǒng)標(biāo)記委托單狀態(tài)為“已交貨”。以上為進口拆箱業(yè)務(wù)用到的用例。出口裝箱業(yè)務(wù)用到的用例包括如下幾個用例(為簡明起見,不再詳細描述各用例的具體內(nèi)容)。
(6)裝箱受理。倉庫管理員收到客戶裝箱委托時執(zhí)行本用例。
(7)預(yù)分配垛位。倉庫管理員根據(jù)情況在適當(dāng)時間為該筆裝箱委托單預(yù)分配一個垛位。若分配的垛位不處于“空閑”狀態(tài),則系統(tǒng)拒絕接受預(yù)分配垛位操作。
(8)收貨入垛。倉庫管理員收到客戶的貨物并且已為裝箱委托單預(yù)分配一個垛位后執(zhí)行收貨入垛用例。
(9)裝箱。貨物從垛位提出裝箱時執(zhí)行裝箱用例。
(10)重箱交接。將裝好的重箱交給客戶時執(zhí)行本用例。以上為出口裝箱業(yè)務(wù)用到的用例。下面是幾個查詢用例。
(11)垛位查詢。①倉庫管理員向系統(tǒng)查詢垛位狀態(tài);②系統(tǒng)顯示垛位狀態(tài)。
(12)庫存貨狀態(tài)查詢。①倉庫主管要求查詢倉期超過一個月的委托單;②系統(tǒng)顯示滿足條件的委托單。
(13)客戶裝、拆箱數(shù)查詢。①倉庫主管要求查詢某客戶某段時期內(nèi)的裝、拆箱數(shù);②系統(tǒng)顯示查詢結(jié)果。
這里要著重說明的是,描述用例時,最好不要包含界面實現(xiàn)細節(jié)方面的詞匯。如“用戶在列表框中選擇收貨人”,這句話中的“列表框”就表達了界面實現(xiàn)細節(jié),因而不是好的描述方法。之所以要強調(diào)描述用例時不要包含界面實現(xiàn)細節(jié),是因為在初始的需求分析階段,構(gòu)造的界面原型只是一個草稿,我們僅僅用它來方便用例的導(dǎo)出。而最終用于實現(xiàn)用例的界面要做進一步的優(yōu)化和調(diào)整,它們可能和初始界面原型很不相同。如果在用例中過多描述跟初始界面原型相關(guān)的實現(xiàn)細節(jié),就會大大限制設(shè)計人員設(shè)計最終用戶界面的創(chuàng)造性,從而無法設(shè)計出最優(yōu)的最終用戶界面。以上問題陳述、參與者、GUI界面原型和用例一起構(gòu)成了系統(tǒng)的需求模型。
四、建立CFS 業(yè)務(wù)信息系統(tǒng)的分析模型
完成需求定義,得到需求模型后,下一步進入系統(tǒng)分析階段。分析階段的主要任務(wù)是構(gòu)造系統(tǒng)的分析模型,該模型主要包括靜態(tài)模型(用類圖表示) 和動態(tài)模型(用順序圖、合作圖、狀態(tài)圖等表示) 。
首先,可以根據(jù)問題描述及用例,通過詞法分析,提煉出系統(tǒng)的對象,進而畫出類圖,用以表示系統(tǒng)靜態(tài)模型。尋找對象的基本規(guī)則是名詞和名詞詞組成為候選對象,動詞是對象的服務(wù),形容詞可能暗示存在子類。當(dāng)然,由于自然語義并不十分精確,所以不能機械地套用基本規(guī)則,還須做進一步的分析與調(diào)整。本系統(tǒng)的類圖模型如圖2所示。
該圖中,三角形符號表示父類與子類聯(lián)系,棱形表示聚集聯(lián)系,連線代表一般聯(lián)系。連線邊的標(biāo)注表明該端對象在該聯(lián)系中扮演的角色,如客戶在與委托單的聯(lián)系中扮演發(fā)貨人角色(適用于任一子類) ,在與拆箱委托單的聯(lián)系中扮演收貨人角色(僅適用于拆箱委托單) 。各對象類的主要屬性已標(biāo)注在類中,但對象的服務(wù)沒有全部標(biāo)出。建立對象模型后,為了表達系統(tǒng)的動態(tài)特征,可以建立系統(tǒng)的動態(tài)模型。動態(tài)模型可用順序圖、合作圖、狀態(tài)圖表示。本系統(tǒng)選擇順序圖和狀態(tài)圖。
理論上說,我們可以為每個用例開發(fā)一個順序圖,但實際上,通??梢允÷阅切┻^于簡單的用例的順序圖。順序圖表達了參與一個用例的幾個對象協(xié)同工作的行為。這里,給出本集裝箱貨運站系統(tǒng)中為拆箱委托單預(yù)分配垛位用例的順序圖(如圖3) 。
順序圖適于表達一個用例中幾個對象的交互行為,若想表達跨越多個用例的單個對象的行為,可以使用狀態(tài)圖。同樣,我們也不必為每個對象開發(fā)狀態(tài)圖,而只須為關(guān)鍵的對象和具有復(fù)雜狀態(tài)的對象開發(fā)狀態(tài)圖。這里,給出“拆箱委托單”和“垛位”的狀態(tài)圖見圖4。
完成了順序圖和狀態(tài)圖后,可據(jù)此研究對象間的消息傳遞,從而進一步修訂、精化類圖,為類添加服務(wù)。例如在“拆箱委托單預(yù)分配垛位順序圖”中,事件“預(yù)分配垛位”成為委托單類的“預(yù)分配垛位”服務(wù);事件“驗證可用性”成為垛位類的“檢查垛位狀態(tài)”服務(wù),事件“鎖定垛位”成為垛位類的“設(shè)置垛位狀態(tài)”服務(wù)。這樣,最終的類圖、順序圖、狀態(tài)圖和模型詞典共同構(gòu)成了分析模型。此后,在系統(tǒng)設(shè)計階段,可以根據(jù)類圖設(shè)計數(shù)據(jù)庫,根據(jù)界面原型設(shè)計界面對象,根據(jù)數(shù)據(jù)訪問要求設(shè)計數(shù)據(jù)服務(wù)層對象。進而,擴展原來的類圖,讓它包含界面對象和數(shù)據(jù)服務(wù)層對象。最終,在系統(tǒng)實現(xiàn)階段,把各層對象組裝起來,形成完整的應(yīng)用程序。
五、結(jié)語
通過集裝箱管理系統(tǒng)的開發(fā)過程看到,UML是一種面向?qū)ο?、可視化的系統(tǒng)分析建模語言,它支持從需求描述開始的軟件開發(fā)全過程。采用UML語言進行系統(tǒng)建模分析和設(shè)計,解決了領(lǐng)域?qū)<摇④浖O(shè)計人員和客戶之間交流的難題,使用它的圖形元素便于開發(fā)人員更好地理解業(yè)務(wù)流程,建立更為完善的系統(tǒng)模型,使用戶和開發(fā)者對問題的描述理解達成一致,排除語義差異,提高分析的正確性,從而加速了開發(fā)的進程,保障了系統(tǒng)的開發(fā)質(zhì)量。
參考文獻:
[1]劉光明陳煉馬永生:基于UML需求分析技術(shù)的應(yīng)用研究[J].科技廣場, 2005,(03)
[2]馮玲玲沈軼:基于UML的需求分析與建模[J].科學(xué)技術(shù)與工程, 2005,(09)
[3]徐憲武劉永泰:UML與RUP在科技項目評審系統(tǒng)中的應(yīng)用[J].電腦開發(fā)與應(yīng)用, 2005,(07)
[4]王森:基于UML的人力資源管理系統(tǒng)建模研究[J].電腦知識與技術(shù), 2005,(17)
[5]吳保艷賴永凱:UML在倉庫管理系統(tǒng)中的應(yīng)用[J].電腦知識與技術(shù), 2005,(17)