徐 翔
[摘要]C++程序設(shè)計(jì)是計(jì)算機(jī)專業(yè)的核心課程,目前在教學(xué)過(guò)程中普遍存在重“語(yǔ)法”,輕“設(shè)計(jì)”的現(xiàn)象。給出一種新的教學(xué)方法,通過(guò)采用故事演繹,結(jié)合UML進(jìn)行面向?qū)ο蠓治?,以及案例教學(xué)的方式引導(dǎo)學(xué)生提高實(shí)際的編程能力,達(dá)到較好的效果。
[關(guān)鍵詞]C++ 面向?qū)ο?UML
中圖分類號(hào):G42文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1671-7597(2009)0120155-02
一、引言
C++是一門(mén)面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,在講授C++程序設(shè)計(jì)的過(guò)程中,應(yīng)該注重面向?qū)ο笏枷氲墓噍?。但是,在?shí)際的教學(xué)過(guò)程中教師往往將重心放在講授一些語(yǔ)法和語(yǔ)句結(jié)構(gòu)上,對(duì)學(xué)生面向?qū)ο蟮南到y(tǒng)分析和設(shè)計(jì)能力的培養(yǎng)沒(méi)有落到實(shí)處,最終導(dǎo)致學(xué)生學(xué)習(xí)完C++后,仍然只知道C++語(yǔ)言本身的一些語(yǔ)法,對(duì)于老師提出的諸如“如何找類?”、“每個(gè)類的屬性和行為應(yīng)該有哪些?”等問(wèn)題仍然無(wú)從回答。沒(méi)有真正掌握面向?qū)ο蟮乃枷敕椒?,更談不上解決實(shí)際問(wèn)題,同時(shí)也嚴(yán)重影響了后續(xù)課程的學(xué)習(xí)。因此,有必要對(duì)該課程的教學(xué)內(nèi)容和教學(xué)方法進(jìn)行改革。
二、教學(xué)改革探討
(一)以故事演繹的方式建立面向?qū)ο蟮氖澜缬^
傳統(tǒng)的教學(xué)方法都是直接介紹C++語(yǔ)言對(duì)類、繼承和多態(tài)的語(yǔ)法實(shí)現(xiàn)和編寫(xiě)規(guī)則,但是卻忽略了對(duì)學(xué)生進(jìn)行面向?qū)ο笫澜缬^的建立,導(dǎo)致很多學(xué)生學(xué)完了課程后,雖然掌握了類的編寫(xiě)語(yǔ)法,但仍然不明白應(yīng)該何時(shí)去使用類去構(gòu)建系統(tǒng),到底應(yīng)該構(gòu)建哪些類,最終導(dǎo)致去解決實(shí)際問(wèn)題時(shí),雖然表面上使用了面向?qū)ο蟮恼Z(yǔ)言和面向?qū)ο蟮墓ぞ?,但其?shí)還是假對(duì)象。這種現(xiàn)象非常普遍,他們中的對(duì)象絕大多數(shù)不過(guò)是對(duì)傳統(tǒng)程序的一個(gè)簡(jiǎn)單包裝,卻根本沒(méi)有考慮到面向?qū)ο蟮哪康模撼橄?、繼承、高效率、可靠性、靈活性、更好的體系結(jié)構(gòu)、更快的客戶響應(yīng)等問(wèn)題。因此,在學(xué)習(xí)具體面向?qū)ο缶幊讨?,讓學(xué)生建立起面向?qū)ο蟮氖澜缬^尤為重要。
因此在教學(xué)內(nèi)容的安排上,我們不急于向?qū)W生講授C++的相關(guān)語(yǔ)法,而是首先通過(guò)采用一些通俗簡(jiǎn)單的生活事例來(lái)演繹對(duì)各種面向?qū)ο蟮幕靖拍畹恼J(rèn)識(shí)。比如我們會(huì)舉例“某位同學(xué)考上了研究生”,然后引導(dǎo)大家對(duì)他考上研究生的過(guò)程進(jìn)行故事演繹,通過(guò)從以下幾個(gè)不同的角度培養(yǎng)學(xué)生去看待故事中的事物:
角度一:故事里有什么事物?
角度二:每個(gè)事物看上去是什么樣的?
角度三:每個(gè)事物能做什么?
角度四:這些事物之間有什么關(guān)系?
角度五:這些事物最終是如何完成目標(biāo)的?
學(xué)生完成了對(duì)問(wèn)題的討論后,也就自然了解了找對(duì)象的過(guò)程,以及對(duì)象的屬性和方法。同時(shí)也了解了對(duì)象之間是如何通過(guò)分工合作,相互發(fā)消息完成最終目標(biāo)的。在輕松愉快的環(huán)境中讓學(xué)生樹(shù)立起面向?qū)ο蟮氖澜缬^。提高了學(xué)習(xí)面向?qū)ο缶幊痰臒岢馈?/p>
(二)結(jié)合UML進(jìn)行面向?qū)ο蠓治鲈O(shè)計(jì)能力的培養(yǎng)
為了培養(yǎng)學(xué)生面向?qū)ο蟮姆治鰡?wèn)題和解決問(wèn)題的基本能力,我們?cè)诮虒W(xué)內(nèi)容上還設(shè)置了“面向?qū)ο蟮南到y(tǒng)分析和設(shè)計(jì)基礎(chǔ)”部分,該部分主要從系統(tǒng)分析和設(shè)計(jì)的角度出發(fā)解釋面向?qū)ο蟮南到y(tǒng)設(shè)計(jì)的基本過(guò)程,使學(xué)生了解面向?qū)ο蟮幕靖拍?,培養(yǎng)學(xué)生采用面向?qū)ο蟮乃季S去思考問(wèn)題、分析問(wèn)題的能力。
在這個(gè)階段我們?cè)O(shè)計(jì)了一個(gè)“超市銷售系統(tǒng)”的教學(xué)案例,通過(guò)對(duì)案例的分析,培養(yǎng)學(xué)生如何從需求說(shuō)明書(shū)中通過(guò)詞匯分析獲取類的參考列表,如何獲取在類的參考列表的基礎(chǔ)上,根據(jù)實(shí)際的系統(tǒng)需求完善類的層次結(jié)構(gòu)等等。
在這個(gè)階段借助UML建模工具Rational Rose,以圖形化的方式描述整個(gè)系統(tǒng)的類之間的關(guān)系。UML是標(biāo)準(zhǔn)的建模語(yǔ)言,它內(nèi)容豐富,功能強(qiáng)大,在通過(guò)大約為期兩個(gè)星期的面向?qū)ο蟮南到y(tǒng)分析訓(xùn)練之后,學(xué)生基本上能完成對(duì)該系統(tǒng)的類模型和時(shí)序模型的建立,達(dá)到了預(yù)期的效果。
以“超市銷售系統(tǒng)”的教學(xué)案例為例,具體實(shí)施過(guò)程如下:
1.提出需求
為某超市開(kāi)發(fā)一款銷售系統(tǒng),完成日常銷售業(yè)務(wù)?;疽笕缦拢?/p>
編寫(xiě)一個(gè)函數(shù)實(shí)現(xiàn)客戶購(gòu)買商品找零的過(guò)程模擬。其中每種商品有一個(gè)標(biāo)價(jià),但是客戶在購(gòu)買時(shí)除了按標(biāo)價(jià)付費(fèi)外,還必須支付額外的稅費(fèi),而且不同類型的商品計(jì)算稅費(fèi)的方式不同,具體描述如下:
衣服:稅費(fèi)=0.01*標(biāo)價(jià)。
食品:稅費(fèi)=0.03*標(biāo)價(jià)。
電器:如果標(biāo)價(jià)>1000,稅費(fèi)=50元。否則,稅費(fèi)=0.05*標(biāo)價(jià)。
其次,客戶分不同的等級(jí),每種等級(jí)的打折策略不同,具體描述如下:
鉆石會(huì)員:購(gòu)買總費(fèi)用>1000,返現(xiàn)300;否則打75折。
金卡會(huì)員:購(gòu)買總費(fèi)用>1000,返現(xiàn)200;否則打85折。
銀卡會(huì)員:打95折。
2.引導(dǎo)學(xué)生完成類的設(shè)計(jì)
在完成了面向?qū)ο蟮姆治龊驮O(shè)計(jì)后,給出系統(tǒng)中現(xiàn)有類的實(shí)現(xiàn),學(xué)生在老師的引導(dǎo)下,都能寫(xiě)出諸如“衣服”、“食品”、“電器”、“鉆石會(huì)員”、“金卡會(huì)員”和“銀卡會(huì)員”等類。并給出每個(gè)類的相關(guān)屬性和方法的定義。(見(jiàn)圖1)
3.構(gòu)建類的繼承體系
在完成了類的定義后,引導(dǎo)學(xué)生發(fā)現(xiàn)類之間的共性,從而將這種共性抽象到一個(gè)共同的基類中,并完成整個(gè)系統(tǒng)的繼承體系的構(gòu)建。完成這一部后,學(xué)生已經(jīng)能感覺(jué)到這種抽象繼承所帶來(lái)的好處了。(見(jiàn)圖2、圖3)
4.編寫(xiě)通用的交易函數(shù)
系統(tǒng)最終的目的是要寫(xiě)一個(gè)函數(shù)實(shí)現(xiàn)客戶購(gòu)買商品并完成找零的過(guò)程模擬,同時(shí)老師在這一階段提出更高的要求,希望這個(gè)函數(shù)足夠通用,不會(huì)因?yàn)樾略龅纳唐泛托碌臅?huì)員類型而發(fā)生修改。此時(shí),將多態(tài)所帶來(lái)的隱藏具體實(shí)現(xiàn),解決相似性問(wèn)題的好處講解給學(xué)生聽(tīng),并通過(guò)繼承和虛函數(shù)給出實(shí)現(xiàn)形式,讓學(xué)生在實(shí)踐中明白什么叫做“同一接口,多種方法”。以及多態(tài)性所帶來(lái)的簡(jiǎn)化程序設(shè)計(jì)邏輯,增強(qiáng)程序的可讀性與可維護(hù)性。(見(jiàn)圖4)
5.最終實(shí)現(xiàn)代碼
通過(guò)對(duì)上述教學(xué)案例的演繹,真正讓學(xué)生明白了面向?qū)ο蟮膹?qiáng)大所在,也激發(fā)了學(xué)生對(duì)編程的熱愛(ài),為今后用面向?qū)ο蟮姆椒ń鉀Q實(shí)際問(wèn)題打下了堅(jiān)實(shí)的基礎(chǔ)。實(shí)踐證明,通過(guò)這樣的改革實(shí)踐,效果是很明顯的。
三、總結(jié)
面向?qū)ο蠹夹g(shù)的基礎(chǔ)是封裝,面向?qū)ο蟮暮诵氖嵌鄳B(tài),而多態(tài)是接口和實(shí)現(xiàn)分離的更高級(jí)升華,使得在運(yùn)行時(shí)可以動(dòng)態(tài)根據(jù)條件來(lái)選擇隱藏在接口后面的實(shí)現(xiàn),面向?qū)ο蟮谋憩F(xiàn)形式是類和繼承。面向?qū)ο蟮闹饕繕?biāo)是使系統(tǒng)對(duì)象化,良好的對(duì)象化的結(jié)果,就是系統(tǒng)的各部分更加清晰化,耦合度大大降低。通過(guò)讓學(xué)生徹底了解C++語(yǔ)言和面向?qū)ο蟮年P(guān)系及其特點(diǎn),才能理順面向?qū)ο蟪绦蛟O(shè)計(jì)的思路。
本文探討了在教學(xué)中通過(guò)如何樹(shù)立學(xué)生面向?qū)ο蟮氖澜缬^,培養(yǎng)學(xué)生面向?qū)ο蟮姆治鲈O(shè)計(jì)能力,讓學(xué)生掌握如何運(yùn)用C++語(yǔ)言完成面向?qū)ο蟮某绦蛟O(shè)計(jì)等方面的教學(xué)改革實(shí)踐。除上述討論的問(wèn)題以外,在《C++面向?qū)ο蟪绦蛟O(shè)計(jì)》課程教學(xué)過(guò)程中還會(huì)遇到很多的問(wèn)題。這只有通過(guò)不斷的分析、探索和研究才能找出更好的解決方案。
參考文獻(xiàn):
[1]劉宗田主編,C++編程思想[M].北京:機(jī)械工業(yè)出版社,2005.
[2]錢能,c++程序設(shè)計(jì)教程[M].北京:清華大學(xué)出版社,2004.
[3]張迎新,面向?qū)ο蟪绦蛟O(shè)計(jì)課程的研究[J].北京工商大學(xué)學(xué)報(bào)(自然科學(xué)版),2003,(4).
作者簡(jiǎn)介:
徐翔,男,湖北仙桃人,碩士,講師,主要研究方向:軟件工程。