袁國武 張學(xué)杰 孔兵 丁海燕 楊軍
摘要:針對面向?qū)ο蟪绦蛟O(shè)計課程教學(xué)中存在的問題,從課程設(shè)置、理論課教學(xué)、實踐課改革等方面提出改革基本思路、原因和改革方法。
關(guān)鍵詞:面向?qū)ο蟪绦蛟O(shè)計;教學(xué)改革;Java
1 教學(xué)中存在的問題
筆者根據(jù)多年的教學(xué)經(jīng)驗,總結(jié)出面向?qū)ο蟪绦蛟O(shè)計課程教學(xué)中主要存在以下問題。
(1)學(xué)生熟悉了c語言為代表的過程化程序設(shè)計思想,難以轉(zhuǎn)變?yōu)槊嫦驅(qū)ο蟪绦蛟O(shè)計的思想。在第1學(xué)期,學(xué)生學(xué)習(xí)了c語言,第2學(xué)期學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)時,也大量采用c語言進(jìn)行編程,學(xué)生已經(jīng)熟悉了過程化程序設(shè)計的思想,因此,當(dāng)接觸到面向?qū)ο缶幊陶Z言時,難以接受面向?qū)ο蟮乃枷牒头椒?。部分學(xué)生在學(xué)習(xí)了一學(xué)期后,仍然會寫出“方法名(對象名)”這樣的語句,并且不習(xí)慣于“對象名.方法名”這樣的調(diào)用方式。
(2)理論課所講實例間關(guān)聯(lián)性小,實驗課中驗證型實驗過多,且驗證內(nèi)容單一,前后實驗沒有關(guān)聯(lián)和連續(xù)性,嚴(yán)重地影響了學(xué)生自主學(xué)習(xí)的興趣和對知識點的統(tǒng)一性認(rèn)識?,F(xiàn)有的實驗依賴課后的上機(jī)習(xí)題。這些習(xí)題通常只針對本章的某個語法或知識點進(jìn)行設(shè)計,前后章節(jié)的上機(jī)習(xí)題沒有關(guān)聯(lián),學(xué)生不能通過這些上機(jī)習(xí)題對面向?qū)ο蟪绦蛟O(shè)計思想從整體上進(jìn)行認(rèn)識。即便全部上機(jī)習(xí)題做完,也都是一些非常小的“玩具”程序,不能對學(xué)生進(jìn)行綜合型實驗訓(xùn)練。
(3)計算機(jī)軟件水平考試中面向?qū)ο蟪绦蛟O(shè)計題目做的不好,嚴(yán)重影響該專業(yè)認(rèn)證考試的通過率。軟件水平考試是計算機(jī)的專業(yè)認(rèn)證考試,能在很大程度上體現(xiàn)所培養(yǎng)學(xué)生綜合掌握計算機(jī)各方面知識的水平。該考試的證書是用人單位挑選計算機(jī)專業(yè)學(xué)生的重要指標(biāo)。經(jīng)過多年參加計算機(jī)軟件水平考試云南省考區(qū)軟件設(shè)計師試題的閱卷,我們發(fā)現(xiàn)軟件設(shè)計師試題中面向?qū)ο蟪绦蛟O(shè)計題目的得分情況不好,多數(shù)學(xué)生的得分低于總分的1/3。所以,教學(xué)中加強(qiáng)對軟件水平考試中面向?qū)ο蟪绦蛟O(shè)計的訓(xùn)練是非常必要的。
因此,對面向?qū)ο蟪绦蛟O(shè)計課程進(jìn)行教學(xué)改革,提高學(xué)生面向?qū)ο蟪绦蛟O(shè)計的能力勢在必行。
2 教學(xué)改革的措施和方法
2.1 課程設(shè)置的調(diào)整
在2009年教學(xué)計劃修訂中,面向?qū)ο蟪绦蛟O(shè)計被提前安排在第3學(xué)期開設(shè),以Java語言為例進(jìn)行講解和實驗,有3個學(xué)分,理論講授36課時,實驗36課時,與之前的18課時實驗課相比,加大了實驗的比例。課程調(diào)整的主要原因如下。
(1)以Java為代表的面向?qū)ο蟪绦蛟O(shè)計語言應(yīng)用非常廣泛,是計算機(jī)專業(yè)學(xué)生必須掌握的技能,提早講授會讓學(xué)生有更多的時間去熟悉。
(2)Java語言可以作為其他專業(yè)課的實驗工具,表1為Java在各門課程實驗中的應(yīng)用,其中的某些知識點可以采用Java方便地進(jìn)行實驗。
(3)在專業(yè)課的安排上,保證每學(xué)期至少有一門課程與程序設(shè)計緊密相關(guān),使程序設(shè)計貫穿本專業(yè)4年的學(xué)習(xí)過程。教學(xué)計劃修改后,實驗中需要進(jìn)行編程的課程見表2。可以看出,面向?qū)ο蟪绦蛟O(shè)計提前到第3學(xué)期,用Java語言為例講解,對后續(xù)課程的學(xué)習(xí)非常有利。
2.2 理論課教學(xué)改革
在用Java講授面向?qū)ο蟪绦蛟O(shè)計的知識時,傳統(tǒng)的講解方法是先講Java語言的歷史、基本語法,然后再講解面向?qū)ο蟮睦碚撝R、類、對象、封裝、繼承、多態(tài)等概念,這也是課本常規(guī)的編寫順序,但是對于很多學(xué)校來說,學(xué)生學(xué)習(xí)的第一門編程語言是C語言,已經(jīng)習(xí)慣了把程序分成多個函數(shù)的思想。在講解了Java語言的歷史、基本語法之后,學(xué)生在接觸到類時,仍然習(xí)慣于過程化的程序設(shè)計思維。由于課堂講解的例子都很簡單,這些例子采用c語言也可以很方便地實現(xiàn),而采用Java語言實現(xiàn)時,反而顯得代碼更多、語法更復(fù)雜,這就令學(xué)生懷疑采用面向?qū)ο蟮姆椒〞詈唵蔚膯栴}復(fù)雜化。
事實上,面向?qū)ο蟪绦蛟O(shè)計課程的目的是在學(xué)生已有過程化程序設(shè)計思想的基礎(chǔ)上,讓學(xué)生的思維向面向?qū)ο蟪绦蛟O(shè)計思想上轉(zhuǎn)變。我們可以調(diào)整部分教學(xué)內(nèi)容的順序,以達(dá)到更好的效果。
1)Java和C語言基本語法的不同之處。
由于Java和c的基本語法大部分相似,學(xué)生有c語言的基礎(chǔ),因此教學(xué)過程中只需要說明兩者的不同之處?;菊Z法中,Java和c的不同之處主要有兩點。
(1)基本數(shù)據(jù)類型:char類型,c語言中是1個字節(jié),采用ASCII編碼,而Java語言采用Unicode編碼,長度是2個字節(jié);布爾類型,C語言中用0表示false,非0表示true,而Java語言提供的boolean是一種基本數(shù)據(jù)類型,只有false和true兩種取值。
(2)數(shù)組類型:在c語言中,數(shù)據(jù)類型直接聲明后就可以使用,如“int a[10]”,而在Java中語言,聲明后還要創(chuàng)建才能使用,如“int a;a=new int”,或者聲明和創(chuàng)建連在一起寫為“int a[]=qtew int[10]”。
2)講解幾個Java系統(tǒng)類,讓學(xué)生體會面向?qū)ο缶幊痰暮锰帯?/p>
Java的系統(tǒng)類庫很多,可以挑選幾個讓學(xué)生熟悉,編程實現(xiàn)一些小程序,體會面向?qū)ο蟮镊攘?,讓學(xué)生習(xí)慣“對象名.方法名”這樣的調(diào)用方式。
(1)String類:編程中用的比較多的運算是字符串的操作,在c語言中很多操作要自己編寫代碼實現(xiàn)。而在Java中,字符串的定位、比較、連接、查找、求長度、替換、拆分、去空格等多種操作只要簡單地用“字符串名稱,方法名(參數(shù))”的調(diào)用方式就可以完成,完全不用了解這些功能到底是怎樣實現(xiàn)的,只需知道怎樣調(diào)用、參數(shù)需要什么,就可以輕松使用。
(2)Frame類或JFrame類:現(xiàn)在的程序基本上都是窗口形式的可視化用戶界面,學(xué)生在學(xué)習(xí)c語言以后,一直很好奇可視化用戶界面是怎樣實現(xiàn)的,可是在C語言中學(xué)生沒有辦法實現(xiàn)。在Java中,給學(xué)生簡單講解Frame類或JFrame類的基本方法,學(xué)生就能用“JFrame myWindow=new JFrame();”這樣一條簡單的語句創(chuàng)建一個窗口進(jìn)行顯示,然后可以用“myWindow.setTitle(“我的窗體”);設(shè)置窗口標(biāo)題,用“myWindow.setSize(800,600);”設(shè)置窗體大小為800×600點,還可以改變窗口背景顏色、添加標(biāo)簽等。這些操作都只需要簡單的幾行語句,不需要了解Frame類或JFrame類是怎么實現(xiàn)的,就能實現(xiàn)一個可視化窗口,學(xué)生就會覺得以Java為代表的面向?qū)ο缶幊陶Z言很簡潔、方便。講解時,可以順便講解如何使用“import”導(dǎo)入包。endprint
3)面向?qū)ο蟮闹R。
學(xué)生了解到所講的幾個Java系統(tǒng)類使用的便捷性、簡易性后,就會有興趣學(xué)習(xí)自己怎樣定義需要的類。講解時,可以用前后有關(guān)聯(lián)的例子進(jìn)行舉例,最常見的例子就是圖形計算面積的例子。例如,可以定義圓類Circle,它有1個公有成員變量radius,表示圓的半徑,1個方法getArea(),求圓的面積。這時,定義一個圓的對象c后,可通過“c.radius=10;”直接賦值,但是這樣的方式可以給radius一個負(fù)數(shù),這顯然不符合圓的定義。這時,我們可以引導(dǎo)學(xué)生把radius設(shè)置為私有類型,不允許直接修改,并增加方法setRadius()設(shè)置半徑。該方法可以先判斷半徑值,如果給定半徑是負(fù)數(shù),則把radius設(shè)為0。如果學(xué)習(xí)了異常處理后,這里可以修改為半徑小于0就拋出一個異常,這樣就可以保證radius得到一個合理的值,保證程序的正確性和合法性,通過這個例子可以引出封裝性的概念。
由于每個圓在定義后,都需要用setRadiusf()設(shè)置半徑,很不方便,因此可以引出構(gòu)造方法的概念。有了構(gòu)造方法,可以方便地在定義對象時進(jìn)行初始化。隨后,為了記錄生成了幾個圓對象,可以引出靜態(tài)變量。在講解繼承性時,可以引入圓柱體類Cylinder,因為圓柱體的底面是一個圓,可以在圓的基礎(chǔ)上,增加圓柱體高度height,計算圓柱體體積時可以使用圓的getArea()方法得到底面積,然后再乘以height,這樣可以引導(dǎo)出繼承性的概念。當(dāng)然這個例子最好用類的組合來實現(xiàn),在講解類的組合時可以用繼承實現(xiàn)的方式進(jìn)行比較。在講解多態(tài)性時,可以引入其他圖形,如三角形、矩形,將它們求面積的方法名稱統(tǒng)一為getArea(),引出抽象類的概念。定義抽象類Graphics,在Graphics中定義抽象方法getArea(),可以講解方法覆蓋的概念。
在子類中,同樣也需要初始化對象的構(gòu)造方法,這時可以引出子類的構(gòu)造方法的寫法,講解this和super關(guān)鍵字。這樣,就可以通過圖形計算面積的例子引出很多重要概念,并且通過這個例子,可以看出這些主要概念運用的意義和之間的聯(lián)系。如果后面講解圖形用戶界面,可以要求學(xué)生在這些基礎(chǔ)上,設(shè)計一個求各種圖形面積的圖形界面程序。
2.3 實踐教學(xué)改革
在理論課進(jìn)行改革的同時,對實踐教學(xué)的改革更為重要。面向?qū)ο蟪绦蛟O(shè)計課程知識點多、應(yīng)用廣泛,因此我們可以建立多層次實踐教學(xué)體系。
(1)課堂內(nèi)實驗。該類實驗主要驗證各個知識點。設(shè)計實驗內(nèi)容時,我們盡量做到前后實驗有關(guān)聯(lián),后面的實驗是對前面實驗的完善,讓學(xué)生最終能得到一個實用的小系統(tǒng)。在實驗中,可以精選一些往年計算機(jī)軟件水平考試中的軟件設(shè)計師的程序設(shè)計試題讓學(xué)生實現(xiàn),要求所有學(xué)生都必須完成,讓學(xué)生提前進(jìn)入軟件水平考試的實戰(zhàn)。
(2)課程設(shè)計。設(shè)計一些規(guī)模稍大、有難度、有工作量的題目,這些題目是知識的綜合運用,讓3-5個學(xué)生組隊完成,并在最后花部分時間給每個小組進(jìn)行講解,綜合評分。
(3)各類程序設(shè)計競賽、本科科研和全國計算機(jī)軟件水平考試。要求學(xué)生在學(xué)習(xí)該課程中和學(xué)完該類課程后,參加每年兩次的全國計算機(jī)軟件水平考試中的程序員和軟件設(shè)計師的考試??蓪Σ糠謱W(xué)習(xí)能力強(qiáng)的學(xué)生進(jìn)行相關(guān)培訓(xùn),鼓勵他們參加ACM國際大學(xué)生程序設(shè)計競賽、百度之星程序設(shè)計競賽、TopCoder程序設(shè)計競賽、甲骨文ThinkQuest程序設(shè)計競賽等;鼓勵部分有創(chuàng)新思維的學(xué)生,讓他們選定指導(dǎo)教師,參加校級、省級、國家級本科科研項目。
經(jīng)過以上多個層次的實踐教學(xué),學(xué)生的面向?qū)ο蟪绦蛟O(shè)計能力會有較大提高。參加程序設(shè)計競賽、本科科研和計算機(jī)軟件水平考試,對學(xué)生能力的鍛煉、更好的就業(yè)都有很大的好處。
3 結(jié)語
面向?qū)ο蟪绦蛟O(shè)計是計算機(jī)專業(yè)的基礎(chǔ)課,對其他課程的學(xué)習(xí)和實驗教學(xué)有較大的幫助。由于面向?qū)ο蟪绦蛟O(shè)計是當(dāng)今程序設(shè)計的主流,而程序設(shè)計能力是計算機(jī)專業(yè)學(xué)生能力的最大體現(xiàn),所以該門課程至關(guān)重要。對該門課程進(jìn)行教學(xué)改革,從而提高學(xué)生的面向?qū)ο蟪绦蛟O(shè)計能力也非常重要。
(見習(xí)編輯:劉麗麗;編輯:宋文婷)endprint