尹梓名 周雷 鄭建立


摘 ?要: “面向對象程序設計”是高校計算機類專業的核心課程,其中有關面向對象的繼承、多態、反射等概念一直是授課講解時的難題,缺乏能將這些概念應用并向學生解釋清楚的案例。本文基于“知識降維”思想,將軟件設計模式這門課中的部分通俗易懂的內容經過簡化后引入“面向對象程序設計”的課程中,解決了講解面向對象概念缺乏案例,學生不易理解部分抽象概念等問題,同時加深了學生對于這些概念的理解,取得了較好的課堂效果。
關鍵詞: 面向對象程序設計;軟件設計模式;教學方法
中圖分類號: TP311 ? ?文獻標識碼: A ? ?DOI:10.3969/j.issn.1003-6970.2019.08.049
本文著錄格式:尹梓名,周雷,鄭建立. 以“軟件設計模式”促進“面向對象程序設計”課程教學方法研究[J]. 軟件,2019,40(8):216219+228
【Abstract】: “Object-oriented programming” is the core course of computer specialty in colleges and universities. Concepts such as inheritance, polymorphism and reflection of object-oriented are always difficult problems in teaching. There are few cases that can apply these concepts and explain them clearly to students. Based on the idea of “knowledge dimensionality reduction”, this paper simplifies some easy-to-understand contents in the course of software design pattern and introduces them into the course of “object-oriented programming”. It solves the problems of lack of cases in explaining object-oriented concepts and difficulty for students to understand some abstract concepts. At the same time, it deepens students' understanding of these concepts and achieves better effects.
【Key words】: Object-oriented programming; Software design patterns; Teaching method
0 ?引言
“面向對象的程序設計”一直是高校計算機相關專業的專業基礎課[1],是學生學習其他多門計算機課程的基礎,所以是計算機教學課程的重中之重[2]。但是在面向對象的教學過程中,如何讓學生從“面向過程”的編程思維轉變為“面向對象”的編程思維,并快速地樹立“面向對象”的編程思想一直是這門課程的教學難點。筆者在高校中同時兼任“面向對象程序設計”和“軟件設計模式”這兩門課的教學工作,在教學過程中發現,如果把二者的授課內容穿插結合起來,既有助于學生對于“面向對象”編程思想的理解,也有助于學生對于面向對象程序設計這門課中部分核心概念的理解[3]。但是,一般認為“軟件設計模式”是“面向對象程序設計”的后續課程,是面向對象思想的高級應用[4]。如果不經修改直接把“軟件設計模式”課程中的部分例子挪到“面向對象程序設計”的課堂,反而不利于學生理解,加深學生的困惑,不會起到非常好的教學效果。所以本文基于一種“知識降維”思想,即將“軟件設計模式”中的知識充分簡化后,結合實際例子[5],再放到“面向對象程序設計”的課堂進行講解,會使學生從中受益。
1 ?課程定位及教學目標
1.1 ?面向對象程序設計
“面向對象程序設計”是計算機相關專業本科生的一門專業基礎課。該課程主要講授面向對象程序設計的思想和方法,使學生深刻理解和領會面向對象程序設計語言的基本概念、基本語法以及面向對象程序設計的精髓:抽象、封裝、繼承、多態及模板等,使學生養成面向對象的編程思維習慣。在此基礎上,通過大量的程序實例,使學生熟練運用面向對象程序設計的方法分析和求解實際設計問題,使學生充分掌握面向對象程序設計的精髓。該課的前修課程是C語言或者有其他程序設計語言 基礎[6]。
1.2 ?軟件設計模式
“軟件設計模式”是計算機相關專業本科生的一門專業選修課。該課程是一門具有較強理論性和實踐性的軟件設計和開發類課程。主要學習軟件設計模式基礎知識、UML類圖、面向對象設計原則、常用的創建型設計模式、結構型設計模式和行為型設計模式。本課程要求學生掌握常用軟件設計模式的動機、定義、結構、實現、使用效果以及應用實例,能夠將所學知識應用到實際軟件項目設計與開發中,進一步培養學生的工程實踐能力和專業技術水平,為今后從事相關工作奠定基礎[7]。
本課程面向的學生是前期已經學習過“面向對象程序設計”,并具有一定的項目開發經驗,但對面向對象的編程思想認識較膚淺,對設計模式還沒有概念。通過本門課的學習,使學生對軟件架構方法和面向對象有一個深入的了解,通過程序的不斷重構和演變,把設計模式的學習門檻降低,使學生初步掌握程序的設計模式[8]。
2 ?面向對象和設計模式課程之間的關系
經過多年的教學實踐,筆者深刻地體會到“面向對象程序設計”和“軟件設計模式”是兩門關系極為密切的課程,就好比是武俠小說中“九陰真經”的上卷和下卷,必須同時修煉才能達到良好的效果。“面向對象程序設計”這門課是“軟件設計模式”的基礎,而“軟件設計模式”是“面向對象程序設計”的升華。一般學校的計算機專業在設置課程的時候都會把這兩門課設為不同的課程,建議學生選課時兩門課都選,如果只選擇其中一門課則不會達到良好的學習效果。如果只學習面向對象而沒有學習設計模式,則無法深刻理解面向對象這種編程方法的好處,最突出的問題就是不理解抽象類和接口這些多態技術的意義,學生在學習中最突出的疑問就是“既然已經有了普通類,為什么一定要使用抽象類?”一旦解決這個疑惑,將極大有助于他們對于面向對象思想的理解。而這個問題的最好的答案就在設計模式中。非常多的設計模式都能體現出使用抽象類編程的好處。反過來,如果只學習設計模式而沒有學習面向對象,由于缺乏面向對象的編程基礎和思維訓練,很難去深刻理解利用設計模式編程的妙處,需要付出極大的努力才能完全掌握。兩門課的關系可以歸納為“面向對象,入門根基;設計模式,登峰造極”。
3 ?以“軟件設計模式”促進“面向對象程序設計”課程教學案例
本文為了說明如何以“軟件設計模式”促進面向對象的課程教學,選取了三個案例。這三個案例分別對應“面向對象程序設計”教學中比較難以講解的三個問題:一是繼承,二是反射,三是多態。
3.1 ?案例1——設計模式促進學生對于繼承的理解
繼承是面向對象程序設計中的基本概念,與封裝和多態合稱面向對象的三大基本特征。一個類從另一個類派生出來時,稱之為派生類或子類,被派生的類稱為基類或父類。派生類從基類那里繼承特性,從一個基類派生出來的多層類形成了類的層次結構。繼承的優點:1、提高代碼的復用性;2、提高代碼的可擴展性。
如何向學生講解“繼承”這個概念,是“面向對象程序設計”這門課要解決的重要問題之一。對于初次接觸面向對象的學生來說,這是比較難以理解的概念。根據面向對象這門課的課程安排,“繼承”一般是在“類和對象”這兩個概念之后講解,而學生在初步接受了“類”這個概念后,會本能地認為“需要用到哪個功能就將這個功能設計成一個或幾個類”,不理解繼承的功用。究其原因,這是因為學生接觸到的軟件設計題目都比較初級,還未接觸到復雜的需要用到繼承的題目。因此,從“知識降維”的角度,需要在課堂上講解一個實例,對比使用繼承和不使用繼承二者的區別,就可以說明使用繼承的妙處。
在設計模式中,幾乎每一種模式都會用到類和類之間的繼承,考慮到學生剛接觸類和對象這些概念,對于面向對象的設計方式還處于較為粗淺的階段,所以選擇較為簡單的一種模式——簡單工廠模式來進行講解比較合適。經簡化后的講解案例如下:
“某公司要編寫圖像編輯器軟件,可以解析并顯示各種格式類型的圖像,包括BMP,JPEG,PNG等,該公司設計人員希望設計一個靈活易用的圖像編輯器,通過設置不同的參數即可顯示不同格式的圖像,而且可以較為方便地對圖像編輯器進行擴展,以便能夠在將來增加一些新類型的圖像。”
本題目對于初學的學生來說,如果不使用繼承,而是用到什么功能就設計什么類,會設計成如圖1所示。
從圖中可以看出,客戶端(Client)要與三種圖像格式類打交道,每個類中都維護了描述圖像基本
信息的字段,如圖像的高(Height),圖像的寬(Width),圖像的分辨率(Resolution)等。本文只是舉例,如果在實際工程項目中,需要處理的圖像基本信息會更多。這部分字段在各個類中無疑是冗余的。如果某部分代碼有問題,就需要在所有的圖像類中都進行修改,這會增加代碼修改不徹底的風險。利用簡單工廠模式,可以將該案例題目設計成如下形式:
如圖2所示,Image是簡單工廠模式的抽象產品類,ImageFactory是簡單工廠模式的工廠類,BMP,JPEG,PNG是簡單工廠模式的具體產品類,是Image這個抽象類的子類,分別對應三種圖像格式。如果要求圖像編輯器再增加解析GIF格式的圖像,只需要將GIF類繼承抽象的Image類,由于在Image類中已經有圖像的基本信息字段,這些字段同樣可以用在GIF圖像的解析過程中,所以不必再在GIF類中定義,簡化了代碼。
從這個例子中可以看出,將跟圖像相關的各種圖像格式共有的類成員放到抽象類中,在子類中不需要將同樣的代碼書寫多次;同時將對于不同格式圖像的解碼方法Decode設置成抽象方法,在不同的子類中予以不同的實現,這體現了類之間繼承的好處——代碼復用與便于擴展。
3.2 ?案例2——設計模式促進學生對于反射的理解
反射是面向對象程序設計這門課比較難以理解的概念,通過反射可以在運行時獲得每一個類型(包括類、結構、委托、接口和枚舉等)的成員,包括方法、屬性、時間和構造函數等,還可與獲得每個成員的名稱、限定符和參數等。有個反射,編程人員即可對每一個類型了如指掌。如果獲得了構造函數的信息,可以直接創建對象,即使這個對象的類型在編譯時還不知道。
學生在學習反射時總是摸不清這個技術的優勢,因為這部分知識相對獨立,與前面的類和對象的知識是一種逆向關系。如果單從面向對象這門課很難舉出一個例子來說明。如果結合設計模式這門課中的內容,就非常容易說明這個知識點的優勢了。
在多種設計模式中,如果不用反射技術,就難以完全符合開閉原則,比如工廠方法模式,抽象工廠模式,適配器模式等。本文以工廠方法模式為例,說明在程序中使用反射的必要性。
圖3為工廠方法模式的UML圖。按照設計,客戶端只需要和同為接口的抽象工廠類和抽象產品類打交道就可以。但是在實際運用中,如果不使用反射機制,客戶端無法避免和具體工廠類打交道,這就造成當需要再增加一種產品時,就需要修改客戶端的代碼,這并不符合面向對象設計原則中的開閉原則(對擴展開放,對修改關閉)。運用設計模式的初衷就是讓上層客戶端只跟抽象層打交道而不和具體實現類打交道,這樣才能使程序具備良好的擴展性。所以為了使工廠方法模式完全符合開閉原則,需要使用反射技術。客戶端通過配置文件讀取需要實例化的具體產品類名,然后通過反射技術生成這個類的對象,并將這個對象賦值給抽象工廠類的對象引用變量。以上即可實現工廠方法模式,又完全符合開閉原則。這個例子就可以說明反射機制的優勢以及必要性。
3.3 ?案例3——設計模式促進學生對于多態的理解
筆者曾經在面向對象程序設計這門課中做過不記名投票,寫出這門課比較難以理解的知識點,共有50人參與,每人最多寫2個,共計90個,歸納起來投票結果如下:
從圖4的統計數據可以看出,投票數量最多的三個分別是抽象類和抽象方法、虛函數、接口。這三個概念都是在程序多態設計中要用到的,所以可以看出,學生對于多態的概念的理解還是不到位,多態是面向對象程序設計教學中的重點,同時也是面向對象程序設計這門課最難理解的難點之一,需要教師在授課中花大力氣去進行概念講解、總結歸納與課堂練習。
多態是實現各種設計模式的核心手段之一。為了符合面向對象設計的開閉原則,很多種設計模式都分成相對穩定的抽象層和具備不同實現的實現層,這就實現了多態。抽象類和接口是設計模式實現多態的兩種最常用的手段。設計模式中的關于抽象類和接口的用法和例題非常適合在面向對象程序設計的課堂上給學生講解,用以加深其對這兩個概念的理解。為了簡化理解,降低同學們的學習負擔,基于“知識降維”的思想,還是以設計模式中的簡單工廠模式為例。如果不用抽象類,如圖1所示,如果客戶要求增加圖像編輯器可以打開的圖像類型,那么必須修改上層客戶端的代碼。而在實際中上層和下層往往是不同團隊在負責,下層稍有修改,上層就要跟著修改,然后經過測試,發布等流程。這樣設計程序,程序維護起來非常麻煩。
而采取圖2的簡單工廠模式,在客戶端和具體的三個圖像類BMP,JPEG,PNG之間加入一個抽象類Image,就可以使得程序的擴展相對容易。本文仍然以再增加解析GIF格式的圖像為例,由于圖像解析所需的字段已經定義在了抽象基類Image中,在GIF類中只需要重寫GIF格式圖像解析的Decode方法即可。增加GIF類后,雖然增加了解析GIF圖像的功能,但是對于上層客戶端來說,代碼無需任何改動。因為客戶端是針對抽象層來編程的,而抽象層是穩定的。本例可以說明使用抽象類的必要性。
4 ?總結
面向對象的程序設計對于接觸計算機編程事件不太長的學生來說,很多概念有些難以理解。對于授課教師來說,缺乏能說明面向對象程序設計這門課中一些概念的例子。本文認為這些例子恰恰存在于軟件設計模式這門課中。可以借助設計模式的部分例子,經簡化后,去講解面向對象課程中的一些概念,將起到事半功倍的效果,加深學生的理解。未來本研究還會運用一些教學質量評價模型去評價本教學方法帶來的效果[9-10]。
參考文獻
[1] 陳晶. 計算機科學與技術專業核心課程考核方式改革的研究[J]. 軟件, 2018, 39(11): 33-35.
[2] 江紅, 余青松. C#程序設計教程(第2版)[M]. 北京: 清華大學出版社, 2014.
[3] 錢誠, 徐煜明. 面向對象程序設計課程案例法教學探討[J]. 電子世界, 2018(22): 100.
[4] 戴華, 楊志和. 軟件設計模式課程的教學模式改革探討[J]. 課程教育研究, 2017(31): 247-248.
[5] 李曉東, 魏惠茹, 董振華. 項目驅動教學法在計算機程序設計語言課中的探索[J]. 軟件, 2015, 36(4): 107-109.
[6] 李建伏, 沈中林, 衡紅軍. 案例教學法在面向對象程序設計課程中的應用[J]. 軟件, 2015, 36(3): 48-51.
[7] 劉偉. C#設計模式[M]. 北京: 清華大學出版社, 2013.
[8] 王曉麗, 徐敏, 李芳巍, 等. 比較教學法在醫學院校計算機基礎課程中的應用[J]. 軟件, 2018, 39(7): 48-51.
[9] 康蘇明, 張杰, 張景安. 基于云模型的高校課堂教學質量評價模型及方法研究[J]. 軟件, 2015, 36(4): 50-54.
[10] 石黎, 孫志梅. 教學質量評價的BP神經網絡模型[J]. 軟件, 2015, 36(3): 19-21.