王方麗,鄧一星
(廣州城市理工學(xué)院 計(jì)算機(jī)工程學(xué)院,廣東 廣州 510800)
軟件工程是一門融合多門計(jì)算機(jī)專業(yè)知識(shí)的綜合性課程,從工程學(xué)角度講解軟件工程的基本理論、技術(shù)和方法。該課程的主要目標(biāo)是提高學(xué)生軟件開發(fā)過(guò)程中分析問(wèn)題、解決問(wèn)題的能力,培養(yǎng)學(xué)生的各項(xiàng)專業(yè)技能和素質(zhì)?,F(xiàn)階段,軟件開發(fā)主要采用面向?qū)ο蟮募夹g(shù)進(jìn)行,為了更好的服務(wù)于當(dāng)前的軟件開發(fā),軟件工程教學(xué)一般也針對(duì)面向?qū)ο蟮拈_發(fā)過(guò)程進(jìn)行講解。與面向過(guò)程的軟件開發(fā)類似,面向?qū)ο蟮能浖_發(fā)也具有生命周期,如可行性分析、需求分析、設(shè)計(jì)、實(shí)現(xiàn)和測(cè)試等環(huán)節(jié)。只不過(guò),面向?qū)ο蟮能浖こ讨?,分析、設(shè)計(jì)和實(shí)現(xiàn)階段的界限不明確。而在軟件開發(fā)中,越晚發(fā)現(xiàn)錯(cuò)誤,改正錯(cuò)誤的代價(jià)就越大。如果不事先做好充分的分析設(shè)計(jì),做好計(jì)劃,直接倉(cāng)促的實(shí)現(xiàn)系統(tǒng),會(huì)出現(xiàn)各種問(wèn)題,特別是后期改正和維護(hù)的成本非常龐大。在軟件工程中,建模是目前經(jīng)過(guò)檢驗(yàn)并廣為接受的一項(xiàng)工程技術(shù)。一個(gè)系統(tǒng)可以從不同的角度,運(yùn)用不同的模型進(jìn)行闡述,以全面系統(tǒng)呈現(xiàn)它的組織結(jié)構(gòu),或者動(dòng)態(tài)邏輯。運(yùn)用模型可以更好的對(duì)系統(tǒng)的結(jié)構(gòu)和組織進(jìn)行劃分,幫助更好的設(shè)計(jì)開發(fā)系統(tǒng)。
統(tǒng)一建模語(yǔ)言(Unified Modeling Language,UML)是在吸收、提煉至今存在的所有其他軟件建模語(yǔ)言的基礎(chǔ)上提出的,其表達(dá)能力超過(guò)了以往任何一種面向?qū)ο蟮姆治鲈O(shè)計(jì)方法,對(duì)于系統(tǒng)模型的表達(dá)能力非常強(qiáng)大,是面向?qū)ο蠓治鲈O(shè)計(jì)的工具,具有如下特點(diǎn):
(1)UML綜合了Booch、OMT和OOSE等方法的圖形表示和基本概念,刪除多余的、容易引起混亂的符號(hào),同時(shí)添加了新的符號(hào),表達(dá)能力非常強(qiáng)大,可以根據(jù)各種項(xiàng)目的具體需求,選擇適合的圖形符號(hào)來(lái)表示[1]。
(2)UML獨(dú)立于任何編程語(yǔ)言,運(yùn)用UML建模在設(shè)計(jì)開發(fā)中可以起到溝通橋梁的作用。
(3)在運(yùn)用UML建模過(guò)程中,只有簡(jiǎn)單有效的UML圖形才能達(dá)到最佳的應(yīng)用效果,根據(jù)實(shí)際情況選擇適合的圖形進(jìn)行描述。
(4)UML根據(jù)實(shí)際應(yīng)用需要演變,提出了模板、擴(kuò)展機(jī)制、線程、分布式、過(guò)程、模式等新的概念和類型[2]。
UML提供了多種不同類型的模型,可以幫助開發(fā)人員更好地理解問(wèn)題,分析問(wèn)題,建立完善、可靠的系統(tǒng)模型,使開發(fā)人員和用戶對(duì)于問(wèn)題的描述可以有相同地理解,保障問(wèn)題分析的正確性,有利于后期的編碼,測(cè)試、維護(hù)。在面向?qū)ο蟮能浖こ探虒W(xué)中,為了更好地幫助學(xué)生分析問(wèn)題、理解問(wèn)題,更好地掌握抽象的概念,將UML結(jié)合具體的實(shí)例融入到面向?qū)ο筌浖こ探虒W(xué)的各個(gè)階段,讓學(xué)生對(duì)于UML和軟件工程有更為清楚的認(rèn)識(shí),有利于對(duì)已學(xué)知識(shí)進(jìn)行鞏固,為實(shí)現(xiàn)測(cè)試等打下良好的基礎(chǔ)。
在軟件開發(fā)中,首先需要開發(fā)人員進(jìn)行專業(yè)、準(zhǔn)確地需求分析;再通過(guò)進(jìn)一步分析設(shè)計(jì)將需求分析階段的成果轉(zhuǎn)化為設(shè)計(jì)產(chǎn)品,然后選擇適當(dāng)?shù)恼Z(yǔ)言,進(jìn)行編碼實(shí)現(xiàn),最后經(jīng)過(guò)單元測(cè)試、集成測(cè)試、系統(tǒng)測(cè)試等測(cè)試環(huán)節(jié),形成最終的目標(biāo)系統(tǒng)。在軟件開發(fā)的不同階段使用不同的開發(fā)方法。軟件工程課程強(qiáng)調(diào)理論與實(shí)踐并重,在理論環(huán)節(jié)中,突出以案例教學(xué)為導(dǎo)向;在實(shí)踐教學(xué)環(huán)節(jié)中,突出軟件項(xiàng)目驅(qū)動(dòng)模式[3]。因此,在針對(duì)面向?qū)ο箝_發(fā)的軟件工程教學(xué)過(guò)程中,以軟件開發(fā)過(guò)程為線索,結(jié)合較為常見的工程案例,運(yùn)用UML技術(shù),對(duì)軟件需求、分析、設(shè)計(jì)等建立模型(如建立用例模型、對(duì)象模型、動(dòng)態(tài)行為模型和部署模型等),用以指導(dǎo)軟件實(shí)現(xiàn),為軟件測(cè)試提供依據(jù)。通過(guò)以 UML模型貫穿軟件開發(fā)全過(guò)程的項(xiàng)目講解,讓學(xué)生充分體會(huì)到面向?qū)ο笏枷朐趯?shí)際軟件開發(fā)中的指導(dǎo)作用[4]。同時(shí)將理論教學(xué)環(huán)節(jié)和實(shí)踐環(huán)節(jié)結(jié)合起來(lái),有利于學(xué)生對(duì)于類、接口等抽象概念知識(shí)地理解,有助于學(xué)生更好的理解軟件工程的思想和面向?qū)ο蟮拈_發(fā)過(guò)程。
在面向?qū)ο蟮能浖_發(fā)過(guò)程中,使用UML建模技術(shù),可以達(dá)到以下目的:有助于按照所需要的樣式或?qū)嶋H情況對(duì)系統(tǒng)進(jìn)行可視化;可以描述系統(tǒng)的行為或結(jié)構(gòu);提供了指導(dǎo)系統(tǒng)構(gòu)造的模板;有助于對(duì)做出的決策進(jìn)行文檔化。本文以圖書館管理系統(tǒng)中的讀者功能為例,分析說(shuō)明如何在面向?qū)ο蟮能浖こ讨羞\(yùn)用UML技術(shù)進(jìn)行來(lái)理論知識(shí)和實(shí)踐知識(shí)的分析講解。
軟件開發(fā)過(guò)程中首先要確定用戶需求,了解做什么。在面向?qū)ο蟮能浖_發(fā)中,需求分析階段主要形成用例模型。用例模型主要由參與者、用例、以及它們的關(guān)系構(gòu)成,參與者和用例之間主要是關(guān)聯(lián)關(guān)系,參與者和參與者之間可能存在泛化關(guān)系,用例和用例之間的關(guān)系主要有包含、擴(kuò)展和泛化關(guān)系。
目前,圖書館管理系統(tǒng)中,讀者主要采取自助借、還書的形式,通過(guò)分析發(fā)現(xiàn),讀者還需要有登錄、注冊(cè)、找回密碼、查詢書籍、借書、還書、交罰款等功能。建立用例模型的第一步是識(shí)別參與者,很顯然這里的參與者是讀者。接著,確定用例,即參與者希望系統(tǒng)提供的功能,這里主要有借書、還書、登錄等用例。最后確定用例和用例之間的關(guān)系,如讀者登錄時(shí)可能會(huì)忘記密碼,需要提供找回密碼功能,找回密碼必須滿足一定的條件才能發(fā)生,因此與登錄之間是擴(kuò)展關(guān)系;借書時(shí)需要驗(yàn)證讀者身份信息,只有身份驗(yàn)證通過(guò)才能借書,因此身份驗(yàn)證和借書之間是包含關(guān)系;查詢書籍提供了兩種方式模糊查詢和精確查詢,任何一種方式都能查詢,因此,這兩種查詢方式和查詢書籍是泛化關(guān)系,最后,還書時(shí),可能會(huì)碰到超期等情況,就需要交罰款,因此,交罰款與還書構(gòu)成擴(kuò)展關(guān)系,并且交罰款為擴(kuò)展用例。通過(guò)分析,建立讀者用例圖,如圖1所示。通過(guò)建立具體的用例模型來(lái)分析實(shí)際問(wèn)題,學(xué)生可以更好的理解和體會(huì)參與者、用例以及它們之間的關(guān)系等概念,加深對(duì)于理論知識(shí)的理解和掌握。
圖1 讀者用例模型
在系統(tǒng)分析階段,主要考慮“怎么做”,主要運(yùn)用概念層的類圖描述系統(tǒng)靜態(tài)結(jié)構(gòu),運(yùn)用交互圖、狀態(tài)圖等描述系統(tǒng)的動(dòng)態(tài)行為。通過(guò)分析系統(tǒng)的動(dòng)態(tài)行為,可以顯示對(duì)象之間的關(guān)系,表示對(duì)象之間的消息通信,找出引起對(duì)象狀態(tài)改變的事件或動(dòng)作,從而進(jìn)一步找出類的屬性和操作,實(shí)現(xiàn)完全意義上的類。
UML中交互圖主要由順序圖、通信圖、交互概覽圖和時(shí)序圖組成。這些圖各有不同的運(yùn)用場(chǎng)景,不過(guò)以順序圖和通信圖為主。順序圖強(qiáng)調(diào)消息發(fā)送的時(shí)間順序,表示用例的行為順序,通信圖強(qiáng)調(diào)發(fā)送和接收消息的對(duì)象之間的組織結(jié)構(gòu),這兩類圖形可以互相轉(zhuǎn)換。
在讀者自助借書過(guò)程中,首先會(huì)要求讀者出示讀者證,驗(yàn)證成功后,讀者將書放在指定位置,系統(tǒng)就可以識(shí)別和檢測(cè)圖書,驗(yàn)證借書數(shù)量是否超過(guò)限制,如果不超過(guò)則可以借書,創(chuàng)建借書記錄和修改書籍信息。該過(guò)程可以用順序圖來(lái)進(jìn)行描述,如圖2所示,強(qiáng)調(diào)為完成借書這一功能,讀者和其他對(duì)象消息發(fā)送的時(shí)間性。對(duì)于圖2進(jìn)行進(jìn)一步分析,可以發(fā)現(xiàn)讀者類需要有身份驗(yàn)證的功能,借書記錄類需要與借書操作借書數(shù)量驗(yàn)證功能,書籍需要有更新狀態(tài)功能,也就是需要有對(duì)應(yīng)的方法。如果需要強(qiáng)調(diào)交互的空間性,就需要用通信圖進(jìn)行描述。
圖2 借書順序圖
在對(duì)象的生命周期中,如果涉及到狀態(tài)的變化,可以通過(guò)狀態(tài)圖來(lái)描述對(duì)象隨時(shí)間變化的動(dòng)態(tài)行為,通過(guò)分析引起狀態(tài)改變的動(dòng)作來(lái)進(jìn)一步分析類需要實(shí)現(xiàn)的方法。圖書管理系統(tǒng)中,新的書籍錄入系統(tǒng)后才能進(jìn)行借閱,書籍狀態(tài)可以在可借、借出和超期三種狀態(tài)間進(jìn)行轉(zhuǎn)換,書籍如果不能再流通,可以從系統(tǒng)中刪除。通過(guò)分析書籍狀態(tài)的轉(zhuǎn)變,可以得到如圖3所示的狀態(tài)圖;進(jìn)一步對(duì)于引起狀態(tài)改變的事件、觸發(fā)條件等進(jìn)行分析,得到書籍類有新增、刪除、借出、還書等方法。
圖3 圖書狀態(tài)圖
如果一項(xiàng)工作的完成涉及到多個(gè)對(duì)象直接的交互,或者需要對(duì)于某項(xiàng)工作的流程進(jìn)行描述,可以運(yùn)用活動(dòng)圖來(lái)進(jìn)行描述。
類圖建模貫穿于系統(tǒng)的分析設(shè)計(jì)階段,從最初概念層類圖,到系統(tǒng)開發(fā)小組能夠完全理解的類。設(shè)計(jì)階段一般采用類圖、包,對(duì)類的接口進(jìn)行設(shè)計(jì),可以使用活動(dòng)圖來(lái)描述類中某些復(fù)雜方法的實(shí)現(xiàn)和主要算法的流程。如在圖書館管理系統(tǒng)中,通過(guò)分析用例圖、順序圖、圖書狀態(tài)圖等可以得出系統(tǒng)中有讀者、讀者類別、圖書、借書記錄、還書記錄、圖書館等類。在建立類圖過(guò)程中,對(duì)于類的屬性和操作確定,類與類之間的多重性等進(jìn)行講解。得到系統(tǒng)模型后,通常還需要根據(jù)需求和設(shè)計(jì)要求進(jìn)行優(yōu)化,如優(yōu)化時(shí)要考慮全局,因此需要各種指標(biāo)的優(yōu)先級(jí),以便在優(yōu)化是進(jìn)行折中;講解一些常見的提高效率的技術(shù),如增加冗余關(guān)聯(lián)可以提交訪問(wèn)效率,增加限定關(guān)聯(lián)縮小查詢范圍,為避免重復(fù)計(jì)算保留一些派生屬性等。
在面向?qū)ο蟮拈_發(fā)中,實(shí)現(xiàn)階段包括兩部分的工作:把前面分析設(shè)計(jì)的結(jié)果翻譯成某種面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言書寫的程序,測(cè)試并調(diào)試程序。
在實(shí)現(xiàn)階段,主要從實(shí)現(xiàn)層類圖得到程序的內(nèi)部結(jié)構(gòu),增加控制類;通過(guò)順序圖、活動(dòng)圖等得到程序的實(shí)現(xiàn)過(guò)程;通過(guò)通信圖中的消息發(fā)送得到對(duì)應(yīng)的操作函數(shù),返回值得到對(duì)應(yīng)的屬性變量;通過(guò)狀態(tài)圖中引起狀態(tài)發(fā)生改變的事件,找到對(duì)應(yīng)類的操作實(shí)現(xiàn)[5]。
在實(shí)現(xiàn)的不同階段都需要進(jìn)行測(cè)試,主要有單元測(cè)試、集成測(cè)試和系統(tǒng)測(cè)試,這些測(cè)試與分析設(shè)計(jì)階段關(guān)系如下:?jiǎn)卧獪y(cè)試主要依據(jù)實(shí)現(xiàn)層類圖和類的說(shuō)明書來(lái)測(cè)試已經(jīng)實(shí)現(xiàn)的程序單元,集成測(cè)試主要依據(jù)設(shè)計(jì)層類圖、包圖、構(gòu)件圖、通信圖等測(cè)試類和包的接口,把每個(gè)程序模塊正確的集成到系統(tǒng)中;系統(tǒng)測(cè)試主要根據(jù)用例圖來(lái)測(cè)試系統(tǒng)功能是否正確,是否符合用戶需求。在講解測(cè)試?yán)碚摵蛯?shí)施的過(guò)程中,將UML對(duì)于系統(tǒng)的分析和設(shè)計(jì)結(jié)合起來(lái),加深對(duì)于相關(guān)理論的理解、加強(qiáng)對(duì)于UML在面向?qū)ο筌浖_發(fā)整個(gè)生命周期中作用的認(rèn)識(shí)。
系統(tǒng)測(cè)試完成后,進(jìn)入運(yùn)行和維護(hù)階段,這一階段先使用UML的配置圖,把系統(tǒng)的軟件和硬件部署到用戶的實(shí)際運(yùn)行環(huán)境中;運(yùn)行階段出現(xiàn)狀況需要維護(hù),則可以利用前面分析設(shè)計(jì)的結(jié)果幫助快速分析和找出問(wèn)題,進(jìn)行修改。
在面向?qū)ο蟮能浖こ探虒W(xué)中,會(huì)涉及到很多抽象的概念和方法;UML提供了從各種不同的視圖觀察和描述軟件系統(tǒng)特征的標(biāo)準(zhǔn)方法,可以應(yīng)用于軟件開發(fā)過(guò)程的各階段;將UML模型與軟件工程項(xiàng)目實(shí)踐結(jié)合起來(lái)進(jìn)行教學(xué),可以增強(qiáng)學(xué)生對(duì)于教學(xué)內(nèi)容的理解,還有利于體現(xiàn)知識(shí)的實(shí)踐性和系統(tǒng)性,更好的完成課程的教學(xué)目標(biāo)和培養(yǎng)目標(biāo)。