郭艷燕,楊 軍,畢遠偉,婁蘭芳
(1.煙臺大學(xué) 計算機與控制工程學(xué)院,山東 煙臺264005;2. 煙臺大學(xué)文經(jīng)學(xué)院 教務(wù)部,山東 煙臺 264005 )
為了培養(yǎng)學(xué)生面向?qū)ο蟮能浖こ虒嵺`能力,以面向?qū)ο笏枷霝轵?qū)動,設(shè)置軟件工程專業(yè)的面向?qū)ο笳n程體系,課程包括面向?qū)ο蟪绦蛟O(shè)計、數(shù)據(jù)結(jié)構(gòu)與算法、數(shù)據(jù)庫原理及應(yīng)用、統(tǒng)一建模語言UML、面向?qū)ο蠓椒▽W(xué)、軟件體系結(jié)構(gòu)、軟件工程,并配備相應(yīng)的課程實訓(xùn)或課程設(shè)計來強化實踐環(huán)節(jié),按照知識層次由淺入深、專業(yè)技能由獨立到系統(tǒng)、綜合實踐能力由弱到強,搭建出基礎(chǔ)、深入、綜合三階段的漸進性階梯式面向?qū)ο笳n程體系的理論和實踐教學(xué)框架,如圖1所示。

圖1 面向?qū)ο笳n程體系的理論和實踐教學(xué)框架
基礎(chǔ)階段,通過學(xué)習(xí)面向?qū)ο蟪绦蛟O(shè)計課程,學(xué)生掌握一門面向?qū)ο缶幊陶Z言,培養(yǎng)學(xué)生的程序設(shè)計能力;通過數(shù)據(jù)結(jié)構(gòu)和算法課程,培養(yǎng)學(xué)生的數(shù)據(jù)抽象、分析、組織和處理能力;通過數(shù)據(jù)庫原理及應(yīng)用課程,培養(yǎng)學(xué)生利用數(shù)據(jù)庫進行數(shù)據(jù)存儲和處理數(shù)據(jù)的能力。深入階段,學(xué)生通過統(tǒng)一建模語言UML課程的學(xué)習(xí),掌握軟件可視化建模的方法和技術(shù),直觀感受和理解面向?qū)ο笏枷耄煌ㄟ^面向?qū)ο蠓椒▽W(xué)課程的學(xué)習(xí),深入全面地掌握面向?qū)ο筌浖_發(fā)的方法和技術(shù)。綜合階段,學(xué)生通過軟件體系結(jié)構(gòu)課程的學(xué)習(xí),理解軟件構(gòu)架的設(shè)計理論,掌握設(shè)計模式和架構(gòu)模式,加深對面向?qū)ο蟮恼J識,提升構(gòu)建可復(fù)用性、靈活性、可擴展性的高質(zhì)量軟件的能力;通過軟件工程課程的學(xué)習(xí),能夠系統(tǒng)地掌握軟件開發(fā)各階段的目標和任務(wù)[3],通過真實的軟件工程實踐案例,感受面向?qū)ο筌浖_發(fā)的優(yōu)勢,提高面向?qū)ο蟮母呒墤?yīng)用能力和綜合實踐能力。課程體系的實踐環(huán)節(jié),還包括通過鼓勵學(xué)生參與課外的“互聯(lián)網(wǎng)+”大學(xué)生創(chuàng)新創(chuàng)業(yè)大賽、開放實驗室基金項目、教師科研課題、科技創(chuàng)新及學(xué)科競賽等,有效提升學(xué)生的實踐創(chuàng)新能力[4]。
UML是一種基于面向?qū)ο蟮目梢暬UZ言,是面向?qū)ο笏枷氲挠辛Ρ磉_,是面向?qū)ο蠓椒ㄕ撧D(zhuǎn)化為實踐的重要工具,在整個軟件開發(fā)周期都發(fā)揮著重要作用。用例需求分析、面向?qū)ο蠓治雠c設(shè)計、設(shè)計模式、架構(gòu)模式、面向?qū)ο筌浖崿F(xiàn)與測試都與UML建模緊密相關(guān)。UML軟件建模不僅有利于理解、分析、設(shè)計、實現(xiàn)復(fù)雜的軟件系統(tǒng),而且是制作高質(zhì)量軟件開發(fā)文檔的高效手段。
UML的知識結(jié)構(gòu)如圖2所示,包括5種視圖和13種圖,不同種類的UML圖反映系統(tǒng)的不同方面,具有不同的抽象層次,在軟件開發(fā)不同階段的重要性也各不相同。由于UML圖直觀易于理解的特點,在課程體系的實踐教學(xué)中,將知識點與相關(guān)的UML圖進行配合講解,建立UML模型與軟件分析、設(shè)計、實現(xiàn)之間的映射關(guān)系,有利于幫助學(xué)生理解抽象的課程內(nèi)容,感受面向?qū)ο笏枷?。面向?qū)ο笳n程體系涉及軟件開發(fā)過程的多門課程,將UML作為實踐教學(xué)的輔助工具,作為貫穿融通課程體系知識的主線,是教學(xué)改革中的創(chuàng)新思路,如圖3所示。

圖2 UML知識結(jié)構(gòu)框架

圖3 以UML貫穿主線的面向?qū)ο笳n程體系
1)UML類圖。
類圖給出了系統(tǒng)的靜態(tài)設(shè)計視圖和靜態(tài)進程視圖。類圖不僅內(nèi)涵表達豐富,而且與其他UML圖有著緊密的聯(lián)系,在UML模型圖中占據(jù)重要地位,是進行軟件分析和設(shè)計最主要的圖,是連接設(shè)計人員和軟件實現(xiàn)人員之間的橋梁,在軟件開發(fā)過程中有著特殊的意義,涉及軟件開發(fā)的多個領(lǐng)域和方面。因此在實踐教學(xué)中,類圖成為最常用的圖。
2)UML順序圖。
實際上關(guān)于小組合作教學(xué)形式早就有所研究,但是不同的研究學(xué)者保持著不同的觀點.例如美國的約翰·斯萊文教師就曾經(jīng)研究過合作學(xué)習(xí)這種形式,他認為其本質(zhì)上就是能夠讓學(xué)生在小組中自主的學(xué)習(xí).但是我國的研究學(xué)者卻有著稍微有所差別的看法,小組合作學(xué)習(xí)形式是一種讓學(xué)生共同進步的一種教學(xué)方式.
順序圖專注于系統(tǒng)的動態(tài)視圖,是在靜態(tài)視圖基礎(chǔ)上對系統(tǒng)行為描述的有利補充,關(guān)注在時間軸上多個對象的消息交互。順序圖是UML交互圖中最重要、最常用的圖,尤其是帶有組合交互片段的順序圖,對復(fù)雜交互情景的描述能力比通信圖強很多,并且是交互縱覽圖的基本組成部分。因此在實踐教學(xué)中,涉及描述系統(tǒng)交互的實例可以使用UML順序圖。
3)UML狀態(tài)機圖。
狀態(tài)機圖給出了系統(tǒng)的動態(tài)視圖,描述對象具有的各種狀態(tài)、狀態(tài)之間的轉(zhuǎn)換過程以及觸發(fā)狀態(tài)轉(zhuǎn)換的各種事件和條件。狀態(tài)機圖關(guān)注一個實體基于事件反應(yīng)的動態(tài)行為,對于描述類、接口、子系統(tǒng)的復(fù)雜行為尤為重要,非常有助于對反應(yīng)式系統(tǒng)的建模。因此在實踐教學(xué)中,涉及依賴于對象狀態(tài)的行為描述可以使用UML狀態(tài)機圖。
4)UML活動圖。
活動圖給出了系統(tǒng)的動態(tài)視圖,關(guān)注對象之間控制流的轉(zhuǎn)換和同步機制,通常用于描述一個操作或用例實現(xiàn)過程中各項活動的執(zhí)行流程,是描述算法設(shè)計的有利工具,對系統(tǒng)的功能建模和業(yè)務(wù)流程建模特別重要。因此在實踐教學(xué)中,涉及算法、方法實現(xiàn)、并行處理的描述可以使用UML活動圖。
面向?qū)ο蟪绦蛟O(shè)計是學(xué)生接觸面向?qū)ο笏枷氲牡谝婚T課程,學(xué)習(xí)使用C++編程語言進行程序設(shè)計,通過C++的具體語法體系初步感受面向?qū)ο笏枷搿@?,在講解C++“類的繼承”知識點時,使用C++代碼定義基類和派生類來建立繼承關(guān)系,如圖4的代碼所示,派生類定義時不需要包含基類中已有的成員,只需要添加派生類中自己新增的成員,從代碼上體現(xiàn)派生類對基類的復(fù)用。但僅僅使用代碼的方式體現(xiàn)類的繼承關(guān)系,將會使學(xué)生把關(guān)注點放在繼承的C++語法結(jié)構(gòu)上,而忽略代碼在深層次上所體現(xiàn)的面向?qū)ο笏枷搿?/p>
在實踐教學(xué)中,將C++的類繼承代碼與對應(yīng)UML類圖來聯(lián)合展示,能更好地讓學(xué)生直觀地感受面向?qū)ο笏枷?。UML使用矩形框?qū)?shù)據(jù)和對數(shù)據(jù)進行操作的方法進行封裝,體現(xiàn)面向?qū)ο蟮摹胺庋b性”。通過UML類圖中的泛化關(guān)系來展示類之間的繼承關(guān)系,基類和派生類具有一般類和特殊類之間的關(guān)系,體現(xiàn)面向?qū)ο蟮摹袄^承性”;通過在派生類中添加與基類成員同名的新成員來實現(xiàn)覆蓋機制,為實現(xiàn)面向?qū)ο蟮摹岸鄳B(tài)性”奠定基礎(chǔ)。通過該教學(xué)實例,讓學(xué)生系統(tǒng)地感受到“封裝”是“繼承”的前提和基礎(chǔ),而“繼承”是為了實現(xiàn)復(fù)用,最終達到“多態(tài)”的目的。

圖4 UML類圖與類繼承的C++代碼
數(shù)據(jù)結(jié)構(gòu)與算法是軟件工程專業(yè)一門非常重要的專業(yè)基礎(chǔ)課,介紹常見的數(shù)據(jù)結(jié)構(gòu)及其在計算機中的存儲結(jié)構(gòu)和操作實現(xiàn)。將面向?qū)ο笏枷胍朐撜n程,一方面是將C++作為數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)語言;一方面采用抽象數(shù)據(jù)類型,將數(shù)據(jù)結(jié)構(gòu)中的邏輯結(jié)構(gòu)與數(shù)據(jù)運算進行封裝,隱藏存儲實現(xiàn)細節(jié),達到以一致的方式調(diào)用底層數(shù)據(jù)結(jié)構(gòu)的目的;另一方面C++中的標準模板庫STL是面向?qū)ο髷?shù)據(jù)結(jié)構(gòu)在更高層次上的抽象。
實踐教學(xué)實例1:按照物理存儲結(jié)構(gòu),棧分為順序棧和鏈式棧。以鏈式棧的講解為例,為了使鏈表棧數(shù)據(jù)存儲更具通用性,采用C++的類模板機制來定義節(jié)點與鏈式棧,代碼如圖5所示。在教學(xué)過程中,鏈式棧結(jié)構(gòu)可以借助對應(yīng)的UML帶參數(shù)的類圖進行可視化展示,鏈式棧中節(jié)點與節(jié)點之間的鏈接關(guān)系使用UML中單向自反關(guān)聯(lián)關(guān)系進行展示,體現(xiàn)出面向?qū)ο蠼Y(jié)構(gòu)中的“實例連接關(guān)系”,鏈式棧與節(jié)點之間的關(guān)系使用UML中組合關(guān)系進行展示,體現(xiàn)出面向?qū)ο蠼Y(jié)構(gòu)中的“復(fù)雜事物由簡單事物組成”。
實踐教學(xué)實例2:對算法的描述不僅可以使用偽代碼,而且可以使用能代替流程圖的UML活動圖。學(xué)生通過UML活動圖很容易直觀地理解算法的執(zhí)行流程和步驟,圖6使用UML活動圖對冒泡排序算法進行可視化描述。

圖5 UML帶參數(shù)的類圖與數(shù)據(jù)結(jié)構(gòu)鏈表棧的C++描述

圖6 UML活動圖與冒泡排序算法偽代碼
數(shù)據(jù)庫原理及應(yīng)用是軟件工程專業(yè)的核心課程,是專業(yè)理論及實踐教育的重要基礎(chǔ),主要介紹關(guān)系型數(shù)據(jù)庫的基本理論和實現(xiàn)方法,學(xué)生通過該課程的學(xué)習(xí),能夠熟練掌握數(shù)據(jù)庫設(shè)計方法和應(yīng)用技術(shù)。對數(shù)據(jù)庫建模是數(shù)據(jù)庫設(shè)計的關(guān)鍵,通過數(shù)據(jù)庫輔助設(shè)計工具可以實現(xiàn)數(shù)據(jù)庫建模,構(gòu)建數(shù)據(jù)庫設(shè)計的概念模型和物理模型[5]。使用UML建模工具可以實現(xiàn)數(shù)據(jù)庫建模。
在實踐教學(xué)中,一個關(guān)系型數(shù)據(jù)庫能夠為UML模型提供一套優(yōu)秀的實現(xiàn)。例如,在系統(tǒng)分析階段,將E-R圖所描述的實體關(guān)系使用具有關(guān)聯(lián)關(guān)系的UML實體類圖展示,從而構(gòu)建數(shù)據(jù)庫的概念模型;在系統(tǒng)設(shè)計階段,依據(jù)UML實體類關(guān)系圖實現(xiàn)對數(shù)據(jù)庫表的設(shè)計,從而構(gòu)建數(shù)據(jù)庫的物理模型。UML實體類圖與對應(yīng)的數(shù)據(jù)庫表設(shè)計如圖7所示,將具有“1對多”關(guān)聯(lián)的兩個實體類映射為兩張關(guān)系數(shù)據(jù)庫表,實體類名映射成表名,實體類中的屬性作為表中的字段出現(xiàn),并將多重性為“1”的表主鍵放在多重性為“多”的表中作為外鍵,來完成實體類分析到數(shù)據(jù)庫表的設(shè)計。
面向?qū)ο蠓椒▽W(xué)是提高學(xué)生軟件開發(fā)實踐能力的重要專業(yè)課,深入、系統(tǒng)、完整地講解面向?qū)ο蟮能浖治?、設(shè)計、實現(xiàn)及重構(gòu)方法。該課程雖然強調(diào)以實踐為主,卻以較強的理論知識為基礎(chǔ)[6],因此只有對抽象理論理解透徹,才能加以正確地實踐。
實踐教學(xué)實例1:“單一職責(zé)原則(SRP,Single Responsibility Principle)”是七大面向?qū)ο笤O(shè)計原則之一,是為了確保軟件設(shè)計具有高內(nèi)聚的特性,具體陳述為“就一個類而言,應(yīng)該僅有一個引起它變化的原因”。由于設(shè)計原則本身的文字描述過于抽象不易理解,因此在講解時需要配合對應(yīng)的UML類圖進行思想展示。在教學(xué)實踐中,通過一個違反SRP的UML圖實例,如圖8左圖所示,將矩形的計算功能與矩形的繪制功能封裝在一個Rectangle類中,并與兩個使用該類的應(yīng)用程序建立使用依賴關(guān)系。在此設(shè)計下,如果GUI圖形庫發(fā)生變化,不僅會導(dǎo)致與矩形繪制功能相關(guān)的繪圖程序發(fā)生變化,而且會導(dǎo)致與圖形繪制功能不相關(guān)的數(shù)學(xué)應(yīng)用程序也發(fā)生變化,從而違反了SRP。圖8右圖所示為修改后的符合SRP的設(shè)計,將矩形的兩個不同類型的功能分別封裝在不同的類中,與各自使用對應(yīng)功能的應(yīng)用程序建立依賴關(guān)系。通過UML圖的實例展示,能夠讓學(xué)生清晰地理解單一職責(zé)原則,并感受該原則帶來的設(shè)計優(yōu)勢。

圖7 UML實體類圖與對應(yīng)的數(shù)據(jù)庫表設(shè)計

圖8 違反SRP的設(shè)計實例與遵循SRP的設(shè)計實例
實踐教學(xué)實例2:體現(xiàn)動態(tài)多態(tài)性的UML圖如圖9所示,構(gòu)建具有泛化關(guān)系的UML類圖來展示抽象父類和具體子類之間的繼承關(guān)系,構(gòu)建多個UML順序圖來展示不同子類對父類抽象方法實現(xiàn)時的交互細節(jié),通過將UML的靜態(tài)結(jié)構(gòu)圖與動態(tài)行為圖結(jié)合,能夠直觀地體現(xiàn)面向?qū)ο笾械摹斑\行時多態(tài)”特性,有利于學(xué)生對面向?qū)ο筇匦缘纳钊肜斫夂蛯嵺`應(yīng)用。

圖9 體現(xiàn)動態(tài)多態(tài)性的UML圖
軟件體系結(jié)構(gòu)是一門軟件工程專業(yè)實踐性很強的高年級專業(yè)課,主要介紹軟件體系結(jié)構(gòu)的基本原理、方法和實踐[7]。學(xué)生通過該課程的學(xué)習(xí),能夠從系統(tǒng)結(jié)構(gòu)角度分析現(xiàn)有的軟件系統(tǒng),針對特定問題選擇準確的設(shè)計模式,并能運用所學(xué)知識高效地設(shè)計軟件系統(tǒng)。設(shè)計模式是該課程教學(xué)的重點,設(shè)計模式離不開面向?qū)ο?,通過UML類圖可以對各種設(shè)計模式思想進行表達,使用面向?qū)ο缶幊陶Z言可以對設(shè)計模式進行軟件實現(xiàn)。同時,通過設(shè)計模式,可以深化對面向?qū)ο笤O(shè)計原則的理解,實現(xiàn)設(shè)計原則的具體應(yīng)用。
實踐教學(xué)實例:狀態(tài)模式主要解決“對象如何在每一種狀態(tài)下表現(xiàn)出不同的行為”,適用于控制一個對象狀態(tài)轉(zhuǎn)換的條件表達式過于復(fù)雜時的情況,把狀態(tài)的判斷邏輯轉(zhuǎn)移到表示不同狀態(tài)的一系列類當中,將不同狀態(tài)的行為分割開來[8]。實踐教學(xué)中,將UML狀態(tài)機圖與狀態(tài)模式結(jié)構(gòu)類圖來聯(lián)合講解,如圖10所示,狀態(tài)模式類圖中3個狀態(tài)子類與房間對象的UML狀態(tài)機圖中的3個狀態(tài)對應(yīng),狀態(tài)模式類圖中3個子類中的方法與UML狀態(tài)機圖中觸發(fā)相應(yīng)狀態(tài)改變的事件對應(yīng),將類對象狀態(tài)分析和對應(yīng)設(shè)計模式的選取充分聯(lián)系在一起,實現(xiàn)軟件分析到軟件設(shè)計的過渡。

圖10 UML狀態(tài)機圖與狀態(tài)模式結(jié)構(gòu)類圖[9]
軟件工程是一門融合多門計算機專業(yè)知識的綜合性課程,從工程學(xué)角度講解軟件工程的基本理論、技術(shù)和方法[10]。通過該課程的學(xué)習(xí),旨在培養(yǎng)學(xué)生具備軟件工程師所需的各項專業(yè)技能和素質(zhì),提高學(xué)生解決軟件開發(fā)全局問題的能力[11]。
軟件工程課程強調(diào)理論與實踐并重,在理論教學(xué)環(huán)節(jié)中,突出以案例教學(xué)為導(dǎo)向;在實踐教學(xué)環(huán)節(jié)中,突出軟件項目驅(qū)動模式[12]。UML不僅可以應(yīng)用到理論教學(xué)環(huán)節(jié),而且可以應(yīng)用到實踐環(huán)節(jié)。為了利于學(xué)生對抽象知識的理解,在教學(xué)實踐中以企業(yè)化軟件開發(fā)過程為線索,結(jié)合實際工程案例,使用UML來對軟件的需求、分析、設(shè)計進行建模,構(gòu)建軟件系統(tǒng)的靜態(tài)視圖和動態(tài)視圖,對軟件實現(xiàn)進行指導(dǎo),并作為軟件測試的依據(jù)和開發(fā)文檔,最終實現(xiàn)模型驅(qū)動的軟件開發(fā)。通過以UML模型貫穿軟件開發(fā)全過程的項目講解,讓學(xué)生充分體會到面向?qū)ο笏枷朐趯嶋H軟件開發(fā)中的指導(dǎo)作用。
面向?qū)ο笳n程體系強調(diào)將面向?qū)ο笏枷氤浞謶?yīng)用到軟件開發(fā)全過程,將面向?qū)ο蟮脑?、工具、方法、實踐融入一體。課程體系的教學(xué)目標是使學(xué)生在具有面向?qū)ο缶幊棠芰Φ幕A(chǔ)上,結(jié)合UML軟件建模,加深理解面向?qū)ο蠹夹g(shù)原理的精髓和實質(zhì),掌握面向?qū)ο筌浖治鲈O(shè)計的原則和方法,具有軟件開發(fā)實踐和綜合應(yīng)用能力[13],通過結(jié)合軟件工程應(yīng)用實踐,加強學(xué)生計算思維能力的培養(yǎng),注重軟件設(shè)計方法的培養(yǎng)和引導(dǎo),提高學(xué)生的創(chuàng)新實踐能力。由于UML提供了從不同角度觀察和展示軟件系統(tǒng)各種特征的標準方法,可以應(yīng)用到軟件開發(fā)的各個階段,因此結(jié)合課程體系中各門課程的教學(xué)內(nèi)容,將適當?shù)腢ML圖應(yīng)用到實踐教學(xué)實例中,不僅有助于教學(xué)內(nèi)容的理解,而且有利于體現(xiàn)課程體系知識的連貫性、系統(tǒng)性和實踐性,更好地達到課程體系的教學(xué)目標。