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