摘 要:Java是計(jì)算機(jī)專業(yè)教學(xué)中使用的主要編程語言,針對(duì)Java語言教學(xué)的現(xiàn)狀,文中提出了一種將XP極限編程應(yīng)用到Java編程教學(xué)的方式,該教學(xué)方式提高了學(xué)生的程序編寫質(zhì)量,轉(zhuǎn)變了學(xué)生的編程習(xí)慣,取得了良好的教學(xué)效果。
關(guān)鍵詞:極限編程;Java教學(xué);教學(xué)改革
中圖分類號(hào):TP311.11-4
1 當(dāng)前編程教學(xué)現(xiàn)狀
Java是計(jì)算機(jī)軟件工程專業(yè)教學(xué)中使用的主要編程語言之一。在以往的Java編程教學(xué)中發(fā)現(xiàn),學(xué)生在學(xué)習(xí)過程中普遍存在如下問題:
編寫出的程序錯(cuò)誤多,查找錯(cuò)誤、修改錯(cuò)誤占用了大量時(shí)間。程序設(shè)計(jì)和代碼的質(zhì)量比較差。編寫的程序即使能夠運(yùn)行,但也經(jīng)常出錯(cuò)。通過調(diào)查分析,究其原因主要是,每個(gè)學(xué)生都是傳統(tǒng)的“單打獨(dú)斗”編程方式,編程過程缺少與他人的溝通交流;遇到問題后,個(gè)人單獨(dú)解決,考慮不夠周全。二是,學(xué)生對(duì)編程質(zhì)量的認(rèn)識(shí)較弱,沒有養(yǎng)成編寫“良好運(yùn)行”的健壯程序的習(xí)慣。
本文通過將XP極限編程的核心方法引入Java編程教學(xué),有利于幫助學(xué)生養(yǎng)成良好的編程習(xí)慣,增強(qiáng)了學(xué)生對(duì)編程質(zhì)量的認(rèn)識(shí),取得了良好的教學(xué)效果。
2 極限編程(eXtreme Programming,XP)
XP極限編程是近年來使用廣泛的軟件敏捷開發(fā)方法之一。與“一次性針對(duì)所有需求完成設(shè)計(jì)、實(shí)現(xiàn)、測試”的傳統(tǒng)開發(fā)模式不同,XP將開發(fā)過程分解為測試、編碼、設(shè)計(jì)/重構(gòu)三個(gè)短小周期,針對(duì)每一個(gè)需求模塊采用增量、迭代方式完成測試、編碼、重構(gòu),在迭代過程中優(yōu)化設(shè)計(jì)。如圖1所示。
圖1 XP極限編程
XP極限編程通過強(qiáng)調(diào)結(jié)對(duì)編程、測試驅(qū)動(dòng)、重構(gòu)、簡單設(shè)計(jì)核心方法,使整個(gè)開發(fā)流程簡單、高效,且是軟件質(zhì)量得到有效保證。
2.1 結(jié)對(duì)編程
結(jié)對(duì)編程是兩人一組連續(xù)協(xié)作共同完成軟件設(shè)計(jì)、實(shí)現(xiàn)和測試的開發(fā)方式。在文獻(xiàn)[1]指出,結(jié)對(duì)編程與單獨(dú)編程相比,完成的程序具有更好的設(shè)計(jì),更加簡短有效,且具有更少的錯(cuò)誤和缺陷。結(jié)對(duì)兩人工作時(shí),交流中彼此傳遞著知識(shí),分享知識(shí),并且互相學(xué)習(xí)編程技巧。因此,結(jié)對(duì)編程方式有利于結(jié)對(duì)的人充分溝通和交流,既能互相促進(jìn)和補(bǔ)充知識(shí)和技能、彼此受益;又能提高編程質(zhì)量和減少所用時(shí)間。
2.2 測試驅(qū)動(dòng)開發(fā)
與傳統(tǒng)開發(fā)方式不同,測試驅(qū)動(dòng)開發(fā)(Test Drived Development,TDD)提倡以測試為中心。在編寫任何實(shí)際功能的實(shí)現(xiàn)代碼前,先編寫該功能的測試;編寫功能的實(shí)現(xiàn)代碼是以通過該功能的所有測試為目標(biāo)。測試驅(qū)動(dòng)開發(fā)可以盡早地發(fā)現(xiàn)錯(cuò)誤和避免錯(cuò)誤,極大地降低了錯(cuò)誤的出現(xiàn)幾率和修改成本;從而保證最終軟件有可靠的質(zhì)量。
2.3 重構(gòu)
重構(gòu)(Refactor)是指在不改變功能的外部行為的前提下,對(duì)功能的內(nèi)部實(shí)現(xiàn)進(jìn)行優(yōu)化,去除冗余部分,提高代碼可讀性。增加新的測試和功能后,通過重構(gòu)對(duì)代碼進(jìn)行“重新”設(shè)計(jì),增進(jìn)內(nèi)部的清晰性和一致性。
2.4 簡單設(shè)計(jì)
簡單設(shè)計(jì)(Simple Design)以最簡單方式設(shè)計(jì)、實(shí)現(xiàn)每個(gè)功能,去除一切不必要的冗余部分,只要能通過當(dāng)前的預(yù)定的所有測試即可。并在后續(xù)的不斷重構(gòu)中,根據(jù)需求變化進(jìn)行修改和優(yōu)化。
另外,在為每一個(gè)類和方法設(shè)計(jì)其功能職責(zé)時(shí),XP提倡所有的設(shè)計(jì)元素從命名和形式上能夠表述其承但的功能職責(zé),并且其承擔(dān)的功能職責(zé)應(yīng)盡可能簡單、單一,以符合單一職責(zé)原則。
3 XP極限編程在Java教學(xué)中的應(yīng)用
經(jīng)過實(shí)踐,按照以下步驟可以將XP編程方法有效應(yīng)用到Java編程教學(xué)過程中。把每一個(gè)編程實(shí)踐練習(xí)題目看作一個(gè)簡單的軟件項(xiàng)目,由指導(dǎo)老師向所有的學(xué)生講解練習(xí)題目并明確題目要求,完成需求分析。例如,在進(jìn)行“編寫一個(gè)計(jì)算器”的題目時(shí),指導(dǎo)老師講解并明確題目的具體的功能需求:實(shí)現(xiàn)給定兩個(gè)數(shù)值的加、減、乘、除的計(jì)算功能,以及計(jì)算結(jié)果的輸出。
3.1 分組結(jié)對(duì)
指導(dǎo)老師根據(jù)學(xué)生的以往成績以兩人一組進(jìn)行分組結(jié)對(duì)。分組結(jié)對(duì)時(shí),可以先按照以往成績對(duì)所有學(xué)生進(jìn)行排名,假如共有10名學(xué)生,從排序中間位置開始分組,讓1和6、2和7、3和8、4和9、5和10進(jìn)行結(jié)對(duì),如圖2所示。
圖2 結(jié)對(duì)分組
結(jié)對(duì)的兩名學(xué)生需要在整個(gè)過程中進(jìn)行大量的討論,彼此交換掌握的知識(shí)和技巧,如若遇到兩人都不善言語,交流困難等特殊情況,需要在此基礎(chǔ)上做少量調(diào)整,將其中一人調(diào)換為善于溝通交流的學(xué)生。
3.2 為需求編寫測試列表
首先,根據(jù)題目明確的需求功能,結(jié)對(duì)兩人在經(jīng)過討論后,以“望文生義”的方式為需求中的所有元素命名。比如,將計(jì)算器命名為Calculator,將計(jì)算器的加、減、乘、除、乘方運(yùn)算功能命名為add、sub、multi、divide和power;計(jì)算結(jié)果為result,輸出計(jì)算結(jié)果功能命名為printOut。
然后,結(jié)對(duì)兩人根據(jù)題目明確的功能需求,通過討論的方式,共同為每一個(gè)功能需求編寫需通過的測試列表。結(jié)對(duì)兩人討論過程中,考慮越細(xì)致,測試覆蓋越全面,程序質(zhì)量越高。
在編寫測試列表時(shí),指導(dǎo)學(xué)生注意每一個(gè)測試應(yīng)明確輸入以及預(yù)期的輸出。例如,為divide運(yùn)算功能編寫測試列表,可按如圖所示編寫。
表1 divide運(yùn)算功能測試列表
序號(hào)說明輸入輸出
1Result為0.0,傳入?yún)?shù)2.02.0Result為0.0
2Result為0.0,傳入?yún)?shù)0.00.0提示“除數(shù)為0”錯(cuò)誤
3Result(非0)為10.0,傳入?yún)?shù)2.02.0Result為5.0
4Result(非0)為10.0,傳入?yún)?shù)0.00.0提示“除數(shù)為0”錯(cuò)誤
3.3 編寫測試用例
測試用例是對(duì)功能需求的具體體現(xiàn),根據(jù)TDD測試驅(qū)動(dòng)開發(fā)原則,在編寫功能實(shí)現(xiàn)代碼前,需先編寫測試該功能的用例。為了方便編寫測試用例,可提前向?qū)W生介紹xUnit、TestNG類測試工具的使用。
結(jié)對(duì)兩人根據(jù)已明確的需求,編寫測試用例。比如,定義計(jì)算器的測試用例類為CaculatorTest,并根據(jù)需求列表中的第1個(gè)需求,編寫第一個(gè)測試方法。
public void testZeroDivide(){
//getResult()返回0.0
calculator.divide(2.0);
assertEquals(0.0, calculator.getResult());
}
3.4 編寫實(shí)現(xiàn)代碼
結(jié)對(duì)兩人共同編寫能夠通過當(dāng)前所有測試的實(shí)現(xiàn)代碼。在該環(huán)節(jié),學(xué)生最容易犯的錯(cuò)誤是,編寫實(shí)現(xiàn)代碼時(shí),主觀隨意、即興發(fā)揮,實(shí)現(xiàn)代碼并非都是為了通過當(dāng)前所有測試而編寫。與通過測試不相關(guān)的代碼部分,無法進(jìn)行測試驗(yàn)證其正確性,所以,根據(jù)簡單設(shè)計(jì)原則,應(yīng)該避免和去除與當(dāng)前測試無關(guān)的部分。
另外,編寫代碼時(shí),可由一人進(jìn)行代碼編寫,同時(shí)另一人在邊上觀看,并且兩人時(shí)常交換。一方面,兩人可以及時(shí)發(fā)現(xiàn)代碼錯(cuò)誤,并減少錯(cuò)誤出現(xiàn)的幾率,保證代碼的編寫質(zhì)量;二是,代碼編寫過程中,兩人在查找代碼錯(cuò)誤、修改錯(cuò)誤及盡力避免錯(cuò)誤的大量討論,彼此的知識(shí)、技巧和經(jīng)驗(yàn)得到了充分的交換和補(bǔ)充,是對(duì)已學(xué)的書本內(nèi)容進(jìn)行了又一次生動(dòng)而深刻學(xué)習(xí)。
3.5 運(yùn)行測試、重構(gòu)
運(yùn)行當(dāng)前所有測試,驗(yàn)證實(shí)現(xiàn)代碼的正確性。如果實(shí)現(xiàn)代碼存在錯(cuò)誤,未通過所有測試,則返回步驟4檢查實(shí)現(xiàn)代碼,修改錯(cuò)誤。修改后,并再次運(yùn)行測試。在多次的“修改代碼-運(yùn)行測試”的迭代中,如發(fā)現(xiàn)冗余的、無關(guān)的代碼,應(yīng)重構(gòu)當(dāng)前程序,優(yōu)化和修改設(shè)計(jì),及時(shí)去除冗余部分,從而提高代碼質(zhì)量。
實(shí)現(xiàn)代碼能夠通過當(dāng)前所有測試后,跳回步驟3,按照測試列表,在測試用例中編寫增加一個(gè)新的測試,繼續(xù)編寫實(shí)現(xiàn)代碼、運(yùn)行測試,直到通過所有測試。
這種增量的、迭代方式的過程中,程序不斷地被重構(gòu),既可以根據(jù)變化進(jìn)行修改,又可以通過優(yōu)化提高質(zhì)量,使得最終的程序具有良好的質(zhì)量和健壯性。
在基于XP極限編程的這種增量的、迭代方式的過程中,學(xué)生的知識(shí)和技巧不斷地得到了強(qiáng)化學(xué)習(xí)和提高,并且學(xué)生養(yǎng)成了良好的軟件開發(fā)習(xí)慣,提高了對(duì)軟件開發(fā)的質(zhì)量意識(shí),為后續(xù)課程的學(xué)習(xí)奠定了堅(jiān)實(shí)的基礎(chǔ)。
4 結(jié)論
經(jīng)過實(shí)踐發(fā)現(xiàn),按照上述方法將XP極限編程應(yīng)用到Java編程教學(xué)中,教學(xué)效果有了明顯的改善:
(1)提高了學(xué)生編寫程序的質(zhì)量和健壯性。學(xué)生的程序代碼中,隨意命名“a1,b1”的情況和冗余代碼明顯減少,程序編碼的規(guī)范性和質(zhì)量有了較大提高。程序運(yùn)行不再頻繁出錯(cuò),程序具有了一定的健壯性。
(2)增強(qiáng)了對(duì)軟件開發(fā)的質(zhì)量意識(shí)。學(xué)生不再只是以程序能夠運(yùn)行為目標(biāo),在開發(fā)過程中,能夠主動(dòng)通過多次迭代、重構(gòu)來優(yōu)化程序,提高程序質(zhì)量,質(zhì)量意識(shí)有了明顯增強(qiáng)。
(3)軟件開發(fā)習(xí)慣有了明顯改變。學(xué)生逐漸熟悉了“測試驅(qū)動(dòng)、結(jié)對(duì)編程”的增量、迭代開發(fā)方式,以前的“單打獨(dú)斗”編程習(xí)慣有了明顯的轉(zhuǎn)變。
參考文獻(xiàn):
[1]W.Laurie,K.Robert,結(jié)對(duì)編程技術(shù)[M].北京:機(jī)械工業(yè)出版社,2004.
[2]Kent Beck.解析極限編程—擁抱變化[M].北京:機(jī)械工業(yè)出版社,2011.
[3]A.Cockburn,L.Williams,The Costs and Benefits of Pair Programming[J].Proceedings of the First International Conference,2000.
[4]W.Laurie.K. Robert.測試驅(qū)動(dòng)開發(fā)藝術(shù)[M].北京:人民郵電出版社,2010.
作者簡介:葛憲強(qiáng),男,講師,碩士,研究方向:軟件工程、圖形處理;許杰,女,中級(jí),碩士,研究方向:教育管理。
作者單位:聊城大學(xué)計(jì)算機(jī)學(xué)院,山東聊城 252059;聊城高級(jí)財(cái)經(jīng)學(xué)校工程系,山東聊城 252000