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