文章編號:1672-5913(2015)07-0040-03
中圖分類號:G642
摘 要:提出在課程中引入JDK源碼的學(xué)習(xí),闡述通過閱讀、分析、重寫及應(yīng)用JDK源碼,學(xué)習(xí)JDK源碼中的語法、基本庫、數(shù)據(jù)結(jié)構(gòu)、設(shè)計(jì)模式等內(nèi)容,能提高源代碼的閱讀能力、編寫規(guī)范代碼的能力,并為應(yīng)用設(shè)計(jì)模式、架構(gòu)復(fù)雜項(xiàng)目打下良好的基礎(chǔ)。
關(guān)鍵詞:Java程序設(shè)計(jì);JDK;源碼;實(shí)踐教學(xué);編程能力;設(shè)計(jì)模式
0 引言
Java語言是當(dāng)前最流行的面向?qū)ο缶幊陶Z言之一,具有平臺無關(guān)性、多線程、分布式及安全性等特點(diǎn)。作為計(jì)算機(jī)專業(yè)及相關(guān)專業(yè)的一門重要課程,Java語言也不只講語言語法,而更加注意其實(shí)踐應(yīng)用,所以加強(qiáng)其編程實(shí)踐和應(yīng)用是該課程的重要目標(biāo)。特別是當(dāng)前用人單位對大學(xué)生的綜合素質(zhì)提出了新的要求,這就迫切需要對現(xiàn)有的教學(xué)模式進(jìn)行改革,才能適應(yīng)計(jì)算機(jī)教學(xué)的需要。根據(jù)實(shí)踐,我們提出在課程中引入JDK源碼的教學(xué)方法。
JDK( Java Development Kit)是Java語言的軟件開發(fā)工具包,包括JavaSE、JavaEE、JavaME等多個(gè)版本,其中最基礎(chǔ)的是JavaSE。在JDK中,有一系列的開發(fā)工具、運(yùn)行環(huán)境,還有最重要的JDK文檔及JDK源碼。JDK源碼用于程序設(shè)計(jì)的實(shí)踐教學(xué)中,能有效提高學(xué)生的程序設(shè)計(jì)能力,切實(shí)提高教學(xué)效果,是教學(xué)改革的一條途徑。筆者將JDK源碼給學(xué)生進(jìn)行閱讀、分析、改造、應(yīng)用,使其掌握編程思想、編碼方式、采用的技術(shù)、應(yīng)用過程等相關(guān)知識。
1 學(xué)習(xí)內(nèi)容
JDK源碼的量很大,要學(xué)習(xí)的內(nèi)容也涉及多個(gè)方面。
1.1 語法方面的學(xué)習(xí)
Java程序設(shè)計(jì)課程首先要讓學(xué)生學(xué)會Java語法,Java語言的語法不僅枯燥,而且不容易掌握。在JDK源碼中有大量語法的體現(xiàn),從變量、常量到運(yùn)算符、語句、類的定義等方面都有很好的體現(xiàn),所以精簡一部分包及類來進(jìn)行學(xué)習(xí),體現(xiàn)其語法的使用,而且體現(xiàn)面向?qū)ο蟮姆庋b、繼承、多態(tài),特別是繼承關(guān)系的分析,以讓學(xué)生更具體地體會面向?qū)ο蟮乃枷肱c方法。
1.2 基本類庫的學(xué)習(xí)
Java語法的學(xué)習(xí)不能只停留在語法層面,而是要培養(yǎng)實(shí)踐應(yīng)用的能力,這就需要掌握大量的API類庫。由于Java類庫中的類很多,每一個(gè)類中的方法也很多,所以我們選擇重要的類庫源碼來學(xué)習(xí),主要包括Java的基本類庫、輸入輸出(Java IO)、文本信息的處理、XML信息的處理、圖形與圖像、圖形用戶界面、網(wǎng)絡(luò)、數(shù)據(jù)庫等。
1.3 數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí)
Java語言中,各類編程都要用到數(shù)據(jù)結(jié)構(gòu)。雖然有的學(xué)生學(xué)過數(shù)據(jù)結(jié)構(gòu),包括線性表、棧、隊(duì)列、串、樹、查找、排序等,但是JDK中,這些數(shù)據(jù)結(jié)構(gòu)是如何實(shí)現(xiàn)的,它們都有哪些相關(guān)的類,分別使用的是順序存儲、鏈?zhǔn)酱鎯€是哈希存儲,學(xué)習(xí)這些不僅有利于復(fù)習(xí)鞏固數(shù)據(jù)結(jié)構(gòu)知識,更重要的是可以學(xué)到更多的實(shí)現(xiàn)方法,而且在應(yīng)用這些結(jié)構(gòu)時(shí)會正確選用合適的類。
1.4 設(shè)計(jì)模式的學(xué)習(xí)
設(shè)計(jì)模式(design pattern)是一套被反復(fù)使用、多數(shù)人知曉、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼,讓代碼更容易被他人理解,保證代碼的可靠性。在實(shí)現(xiàn)的軟件開發(fā)實(shí)踐中,設(shè)計(jì)模式是相當(dāng)重要的,在JDK中,使用了大量的設(shè)計(jì)模式,如抽象工廠、單態(tài)、適配器、責(zé)任鏈、代理、觀察者等,通過源代碼來學(xué)習(xí)設(shè)計(jì)模式,可以讓學(xué)生更具體地體會到設(shè)計(jì)模式的應(yīng)用,從而能讓學(xué)生更好地打下應(yīng)用設(shè)計(jì)模式基礎(chǔ)。
2 學(xué)習(xí)方法
JDK源碼的學(xué)習(xí)方法主要是閱讀、分析以及修改、應(yīng)用等,在這個(gè)過程中教師要通過演示、引導(dǎo)、作業(yè)等手段來促進(jìn)學(xué)生對JDK源碼的學(xué)習(xí)。
2.1 有選擇性地閱讀源代碼,撰寫讀書筆記
由于源代碼的量很大,沒有必要將所有JDK的源碼都讀取一遍,所以針對前面提到的每一方面的學(xué)習(xí)內(nèi)容,教師會指定閱讀相關(guān)的包和類的源代碼。例如,在前半學(xué)期中要求閱讀的類包括Obj ect,Class,String,StringBuilder及AbstractStringBuilder. Integer, Math, Random,Biglnteger等;后半學(xué)期則要求閱讀Arrays,ArrayList, Vector, Stack, Hashtable, TreeMap,TreeSet類等。教師還指定一些擴(kuò)展的包和類,供能力較強(qiáng)的學(xué)生進(jìn)行閱讀。學(xué)生閱讀后要撰寫讀書筆記,對典型的讀書筆記進(jìn)行演示匯報(bào),這樣的匯報(bào)可以在小組內(nèi)或者全班進(jìn)行,以促進(jìn)理解和交流。
2.2 教師布置讀前的問題及讀后作業(yè),促進(jìn)閱讀質(zhì)量提高
閱讀前,教師有針對性地提出一些問題,這樣可以讓學(xué)生知道閱讀的重點(diǎn)和思考的問題,讀后作業(yè)則檢查學(xué)生學(xué)習(xí)的效果。布置的作業(yè)中包括這樣的問題:String類為什么聲明為final的?Random類引用了什么內(nèi)部類或輔助類?Stack類中的變量的初始值為什么這樣設(shè)置?其ArrayList類動(dòng)態(tài)分配空間的增長因子是多少?TreeMap類與另一個(gè)相關(guān)的TreeSet類的區(qū)別是什么?
2.3 與JDK文檔對照學(xué)習(xí)
JDK源碼與JDK文檔進(jìn)行對照學(xué)習(xí)??紤]到部分學(xué)生的英文實(shí)際水平,我們選用中文版的JDK文檔,而英文水平較好的則可以使用英文版的JDK。例如,在String文檔中提到immutable,在源程序中是如何體現(xiàn)的?在Byte中提到的緩存,在源程序是如何實(shí)現(xiàn)的?Random類提到的偽隨機(jī)數(shù)是如何實(shí)現(xiàn)的?TreeMap中找到同一對象的要求是如何實(shí)現(xiàn)的?等,這些問題涉及語法、算法、效率等多方面的問題。另外,對有余力的學(xué)生,還讓他們讀不同版本的JDK的源碼,體會其中源代碼的演變,分析其改進(jìn)之處。
2.4 學(xué)生寫出分析報(bào)告,并進(jìn)行展示與交流
針對閱讀的內(nèi)容,我們要求學(xué)生寫出分析報(bào)告。報(bào)告要求寫出主要的類、主要的方法;類與類之間的關(guān)系(畫出類關(guān)系圖、UML圖);主要函數(shù)的算法是怎樣的(畫出流程圖、事件序列圖、狀態(tài)圖等);算法的時(shí)間復(fù)雜度與空間復(fù)雜度如何;用到了哪種設(shè)計(jì)模式等。另外,要求寫出學(xué)到的關(guān)于語法、算法、編程技巧方法的收獲。這些報(bào)告要形成文檔、展示的PPT、Prezi等,在班上進(jìn)行交流展示,還讓學(xué)生進(jìn)行評選投票。
2.5 進(jìn)行代碼的重寫、改進(jìn)與應(yīng)用
在閱讀的基礎(chǔ)上,我們要求學(xué)生進(jìn)一步進(jìn)行代碼的重寫、改進(jìn)與應(yīng)用。代碼的重寫是指針對其中部分代碼自己重寫一遍,這樣能訓(xùn)練編寫代碼的能力。在這個(gè)過程中,學(xué)生還可以有針對性地進(jìn)行代碼的改進(jìn)。另外,在實(shí)際的項(xiàng)目中,應(yīng)用相關(guān)的包和類,這樣易于進(jìn)一步鞏固所學(xué)的知識。
3 學(xué)習(xí)JDK源碼對學(xué)生編程能力的提高
JDK源碼的學(xué)習(xí)過程,提高了學(xué)生以下幾個(gè)方面的能力。
3.1 閱讀代碼的能力
閱讀代碼的能力訓(xùn)練是編程能力中一個(gè)重要的方面。事實(shí)上,軟件的編寫與維護(hù)通常是一個(gè)長期的過程,閱讀別人寫的代碼是很常見的任務(wù),但有時(shí)也要閱讀自己寫的代碼。閱讀JDK源碼可以大大提高閱讀代碼的能力。
3.2 編寫規(guī)范代碼的能力
JDK源碼書寫規(guī)范,其中能學(xué)到規(guī)范代碼的編寫方法,有利于養(yǎng)成良好的編程習(xí)慣。這包括注釋的使用、空行的使用、變量命名、函數(shù)的命名慣例等。
3.3 使用設(shè)計(jì)模式的能力
JDK源碼中有大量設(shè)計(jì)模式的應(yīng)用,通過對這些設(shè)計(jì)模式的學(xué)習(xí),能很好地體會各種設(shè)計(jì)模式的含義、基本組成要素、種要素之間的關(guān)系、設(shè)計(jì)模式的應(yīng)用場景,這些都為以后在具體項(xiàng)目中使用設(shè)計(jì)模式打下良好的基礎(chǔ)。
3.4 項(xiàng)目架構(gòu)的能力
JDK源碼是一系列的包與類組成的一個(gè)大的系統(tǒng),而類與類之間的關(guān)系有各種形式,通過對它們的學(xué)習(xí),能幫助學(xué)生提高設(shè)計(jì)復(fù)雜程序的能力,為以后進(jìn)行項(xiàng)目架構(gòu)的工作打下良好的基礎(chǔ)。
4 結(jié)語
在Java程序設(shè)計(jì)課程中引入JDK源碼的學(xué)習(xí),通過在語法、基本庫、數(shù)據(jù)結(jié)構(gòu)、設(shè)計(jì)模式等多方面的學(xué)習(xí),有效地提高了學(xué)生源代碼的閱讀能力、編寫規(guī)范代碼的能力,并為應(yīng)用設(shè)計(jì)模式、架構(gòu)復(fù)雜項(xiàng)目打下良好的基礎(chǔ)。在北京大學(xué)的Java程序設(shè)計(jì)課程中使用JDK源碼進(jìn)行教學(xué),起到了較好的教學(xué)效果。