摘 ?要: 面向?qū)ο蠓治雠c設(shè)計課程理論性比較強(qiáng),內(nèi)容設(shè)計上也比較繁雜,容易在教學(xué)中失去重點(diǎn),針對教學(xué)中培養(yǎng)面向?qū)ο笏季S難點(diǎn)進(jìn)行分析,闡明引導(dǎo)學(xué)生理解面向?qū)ο笤O(shè)計的目的和用途的重要性,并使用層層遞進(jìn)方法解決為何學(xué)的問題;圍繞面向?qū)ο笤O(shè)計的目的,闡述面向?qū)ο蟮幕咎卣髋c設(shè)計原則和模式的內(nèi)在關(guān)聯(lián),進(jìn)一步明確面向?qū)ο笤O(shè)計的本質(zhì)。
關(guān)鍵詞: 面向?qū)ο蠓治雠c設(shè)計課程;面向?qū)ο笏季S;面向?qū)ο蠓治雠c設(shè)計
中圖分類號: TP311 ? ?文獻(xiàn)標(biāo)識碼: A ? ?DOI:10.3969/j.issn.1003-6970.2019.05.017
本文著錄格式:郭惠芳. 以面向?qū)ο笏季S為主線的教學(xué)設(shè)計研究[J]. 軟件,2019,40(5):9092
【Abstract】: The course of object-oriented analysis and design is relatively theoretical and complex in content design, which is easy to lose its focus in teaching. This paper analyses the difficulties in training object-oriented thinking in teaching, clarifies the importance of guiding students to understand the purpose and purpose of object-oriented design, and uses the progressive method to solve the problem of why to learn; expounds the purpose of object-oriented design around the purpose of object-oriented design. This paper describes the basic characteristics of object-oriented design and the inherent relationship between design principles and patterns, and further clarifies the essence of object-oriented design.
【Key words】: Object-oriented analysis and design curriculum; Object-oriented thinking; Object-oriented analysis and design
0 ?引言
有些概念是屬于人人都知道,甚至人人都在用,卻并不深知,面向?qū)ο缶褪瞧渲兄弧S胁簧賹W(xué)生畢業(yè)幾年后,與我反映,用了多年的面向?qū)ο笳Z言,卻并未真正進(jìn)行過面向?qū)ο蟮脑O(shè)計。自己也是在工作多年后,在不斷的摸索中慢慢對面向?qū)ο笏枷胗兴J(rèn)識。
1 ?面向?qū)ο笳Z言的普及
“面向?qū)ο蟪绦蛟O(shè)計”課程是計科和軟件專業(yè)的專業(yè)基礎(chǔ)課,這類課程著重于講解面向?qū)ο蟪绦蛟O(shè)計語言的語法、數(shù)據(jù)結(jié)構(gòu)及算法,學(xué)生之前也掌握了Java語言/C++語言,但在實(shí)踐項(xiàng)目中卻很難有效使用面向?qū)ο蟮脑O(shè)計方法[1]。
學(xué)習(xí)了“面向?qū)ο蠓治雠c設(shè)計”課程后,這種情況有所改善,大部分學(xué)生明白了使用一門面向?qū)ο笳Z言進(jìn)行程序設(shè)計與面向?qū)ο蟮脑O(shè)計是兩碼事,面向?qū)ο笏且环N思維方式,也是一項(xiàng)程序設(shè)計技術(shù)。它的基本思路是利用對象各司其職、相互協(xié)作完成每項(xiàng)工作,設(shè)計中有一系列原則和方法來保證系統(tǒng)各部分的低耦合、高內(nèi)聚性,以得到一個維護(hù)成本低、靈活性和可擴(kuò)展性好的系統(tǒng)。但就多數(shù)年輕的軟件從業(yè)者的反映看,真正的面向?qū)ο蟮脑O(shè)計還遠(yuǎn)未達(dá)到[2]。
2 ?解決為什么要學(xué)的問題
2.1 ?直觀的引入
在面向?qū)ο蠓治雠c設(shè)計課程中常說的一句話就是,面向?qū)ο蟮脑O(shè)計思想是最接近人的思維,符合人類對現(xiàn)實(shí)世界的認(rèn)知,這個世界是由人組成的,每個人又各司其職,需要別人協(xié)助時,可以借用另一個人或團(tuán)體來完成。那么每個人就是一個對象,每一種角色就是一個類。各自獨(dú)立又相互協(xié)作完成一個系統(tǒng)的運(yùn)轉(zhuǎn)。這個道理是挺好理解的,但這個道理好像還不足以說服學(xué)生從編寫面向過程的思路改變?yōu)槊嫦驅(qū)ο?。[3-4]
那么在軟件設(shè)計時如何才能盡力減少這種軟件維護(hù)的成本呢?抽象是一種行之有效的方法,是人類掌握復(fù)雜事物,設(shè)計復(fù)雜事物的基本方法。如何講讓“抽象”的概念不那么抽象呢?
2.2 ?抽象的層次
1)面向過程中的算法抽象
抽象這個概念離我們并不遙遠(yuǎn),大家熟知的數(shù)據(jù)結(jié)構(gòu)其實(shí)也是一種抽象,它是一種比算法抽象更底層的抽象。比如一個數(shù)組,一個二叉樹,它們都是代表一種數(shù)據(jù)集合的抽象,解決特定問題時它們使用起來更為方便而已。[5-7]
2)面向?qū)ο蟮某橄?/p>
由于學(xué)生此時一般已學(xué)習(xí)過Java或C++語言,可以直接用代碼來實(shí)現(xiàn)上述的對象,并在主程序中使用這些對象,使學(xué)生直觀理解,在更大范圍內(nèi)進(jìn)行抽象的好處。將事物的數(shù)據(jù)及行為進(jìn)行封裝,并對相似的事物的行為進(jìn)行抽象,這樣使用一個復(fù)雜系統(tǒng)會更加簡便。
2.3 ?軟件的靈活性
從許多事例中我們得到一個結(jié)論,一個軟件系統(tǒng)只要它在使用,就會有需求變化,因?yàn)檫@個世界在不斷變化之中,需求變更是不可避免的,識別并定義那些系統(tǒng)中相對穩(wěn)對的部分,并在構(gòu)建軟件系統(tǒng)時將這部分抽象出來。在面向?qū)ο蟮脑O(shè)計中給出了多種分離抽象與具體實(shí)現(xiàn)的手段,讓系統(tǒng)的其它部分建立在相對穩(wěn)定的抽象(接口)之上,而具體實(shí)現(xiàn)可以在以后被新的需求所替代[8-9]。
3 ?面向?qū)ο笏季S的具體體現(xiàn)
3.1 ?理解面向?qū)ο蟮幕咎卣?/p>
面向?qū)ο蟮幕咎卣饕话阏f法是三個:封裝、繼承和多態(tài),還有說法是四個:封裝、繼承、抽象和多態(tài)。
1)封裝,這個特征是所有面向?qū)ο笙到y(tǒng)中都會使用到的,但封裝得合適與否,就大不相同了。封裝的作用我們前面提到一個就是方便共享,將數(shù)據(jù)與其行為進(jìn)行封裝,使用時比使用一堆函數(shù)要方便;但封裝得合適與否的標(biāo)準(zhǔn)卻并不是一句話能講清楚的,我們只能說合適的封裝是需要一個過程的,伴隨著系統(tǒng)分析與設(shè)計過程,需要經(jīng)過反復(fù)的重構(gòu),最終才能得到一個合適封裝的系統(tǒng)。
2)繼承,這個特征是面向?qū)ο笾写a重用的重要手段之一,通過繼承父類的非私有成員,子類獲得了在父類中已定義好的大部分功能,初學(xué)者比較喜歡用這個特征,但這個特征最容易被過度使用,隨著我們后面學(xué)習(xí)面向?qū)ο笤O(shè)計原則中舉的一些例子,會讓學(xué)生理解有些繼承不如組合這種特征靈活。
3)多態(tài),這個特征一直是一些學(xué)生的難點(diǎn),多態(tài)是指父對象中的同一個行為能在其多個子對象中有不同的表現(xiàn)。這是為什么呢?為啥需要有這個多種表現(xiàn)呢?這些問題都是影響學(xué)生理解這一概念的難點(diǎn)所在。
3.2 ?面向?qū)ο笤O(shè)計原則與模式
面向?qū)ο蟮脑O(shè)計原則講五個足夠了,它的核心就是開閉原則,而里氏替換、依賴倒置等原則都是為開閉原則提供具體的手段。使用案例講清楚每個原則的含義,讓學(xué)生理解它的用途,真正運(yùn)用這些原則需要一個循序漸進(jìn)的過程,在后面的設(shè)計模式中可以再舉些例子加強(qiáng)對原則的理解,因?yàn)槊嫦驅(qū)ο蟮脑O(shè)計模式無一不是對原則的不同詮釋。
4 ?實(shí)際系統(tǒng)設(shè)計中貫徹面向?qū)ο笏季S
在面向?qū)ο蠓治雠c設(shè)計課程中,我們是這么安排:
單元一 面向?qū)ο蟮幕靖拍?。在此單元中解決為什么要學(xué)面向?qū)ο?,面向?qū)ο笤O(shè)計的目的是什么。有了目標(biāo),有了基本的面向?qū)ο蟮乃季S,在實(shí)際系統(tǒng)設(shè)計中如何使用就不會沒有方向。
單元二 統(tǒng)一建模語言概述。此單元概要地介紹UML這種建模語言的概貌,以及發(fā)展歷程。為下面系統(tǒng)的分析與設(shè)計做準(zhǔn)備。
單元三 面向?qū)ο蟮姆治?。此單元著重介紹在需求分析階段,如何適當(dāng)使用UML中的用例模型、分析類圖及輔助模型進(jìn)行需求分析及表示。
單元四 面向?qū)ο蟮脑O(shè)計。此單元著重介紹在系統(tǒng)設(shè)計過程中如何由分析類圖細(xì)化至設(shè)計類圖,以及各類職責(zé)及類間的協(xié)作進(jìn)一步劃分和確定。
單元五 面向?qū)ο笤O(shè)計模式簡介。此單元著重介紹幾個常用的設(shè)計模式,用實(shí)例說明其適用場合及作用方式。
在這個部分我們引導(dǎo)學(xué)生理解模型是為系統(tǒng)的分析與設(shè)計服務(wù)的,它是面向?qū)ο笏枷氲囊环N體現(xiàn),一種表達(dá)而已。面向?qū)ο蟮脑O(shè)計圍繞需求,運(yùn)用面向?qū)ο蟮乃枷脒M(jìn)行設(shè)計、用適當(dāng)?shù)哪P捅磉_(dá)出來就可以,并不是模型設(shè)計的越復(fù)雜越好或UML模型越漂亮越好[10]。
5 ?結(jié)語
面向?qū)ο蟾嗟氖且环N思維模式,它是軟件工程專業(yè)人員必備的素養(yǎng),也是計算機(jī)相關(guān)專業(yè)應(yīng)該有的訓(xùn)練內(nèi)容。我認(rèn)為讓學(xué)生學(xué)會使用工具進(jìn)行面向?qū)ο蠓治雠c設(shè)計固然重要,但更重要的
是面向?qū)ο笤O(shè)計本身,面向?qū)ο笤O(shè)計的初心以及如何達(dá)成這樣的目的。在當(dāng)前新工科專業(yè)人才培養(yǎng)思路的引領(lǐng)下,想要培養(yǎng)復(fù)合型人才,推動原始創(chuàng)新發(fā)展,打牢理論基礎(chǔ)是根本,使學(xué)生從只會使用工具,轉(zhuǎn)換到有意識地掌握軟件工程思想方法以及思維模式。
參考文獻(xiàn)
[1] 譚火彬, 林廣艷. 培養(yǎng)軟件工程思想的面向?qū)ο蟪绦蛟O(shè)計課程改革與實(shí)踐[J]. 《計算機(jī)教育》2018(8): 53-58.
[2] 高歌在羊城. 循序漸進(jìn)地培養(yǎng)面向?qū)ο蟮乃季S方式[EB/OL]. https://www.cnblogs.com/georgeguo/p/3904256.html.
[3] 高賢君, 楊元維, 李功權(quán). 面向計算思維的Web程序設(shè)計教學(xué)思考[J]. 電腦知識與技術(shù), 2018, 14(21): 141-143.
[4] 王麗影, 石秋香, 王順才. 應(yīng)用型大學(xué)背景下《面向?qū)ο蟪绦蛟O(shè)計(C#)》課程教學(xué)設(shè)計探究[J]. 辦公自動化, 2019, 24(04): 33-34+47.
[5] 闞運(yùn)奇. “面向?qū)ο蟪绦蛟O(shè)計”教學(xué)方法研究[J]. 無線互聯(lián)科技, 2018, 15(23): 151-152.
[6] 孟瑤. 面向?qū)ο蟪绦蛟O(shè)計課程微課設(shè)計研究[J]. 信息與電腦(理論版), 2018(22): 230-232+235.
[7] 錢誠, 徐煜明. 面向?qū)ο蟪绦蛟O(shè)計課程案例法教學(xué)探討[J]. 電子世界, 2018(22): 100.
[8] 孫勇, 徐建輝. 定位于實(shí)踐的面向?qū)ο蟪绦蛟O(shè)計課程教學(xué)探索[J]. 教育現(xiàn)代化, 2018, 5(40): 271-274.
[9] 譚火彬, 林廣艷. 培養(yǎng)軟件工程思想的面向?qū)ο蟪绦蛟O(shè)計課程改革與實(shí)踐[J]. 計算機(jī)教育, 2018(08): 53-58.
[10] wengxuan_kanon. 真的理解面向?qū)ο笏季S[EB/OL]. https: //blog.csdn.net/kanonlemon/article/details/70052522.