论文部分内容阅读
摘 要:Java是计算机专业教学中使用的主要编程语言,针对Java语言教学的现状,文中提出了一种将XP极限编程应用到Java编程教学的方式,该教学方式提高了学生的程序编写质量,转变了学生的编程习惯,取得了良好的教学效果。
关键词:极限编程;Java教学;教学改革
中图分类号:TP311.11-4
1 当前编程教学现状
Java是计算机软件工程专业教学中使用的主要编程语言之一。在以往的Java编程教学中发现,学生在学习过程中普遍存在如下问题:
编写出的程序错误多,查找错误、修改错误占用了大量时间。程序设计和代码的质量比较差。编写的程序即使能够运行,但也经常出错。通过调查分析,究其原因主要是,每个学生都是传统的“单打独斗”编程方式,编程过程缺少与他人的沟通交流;遇到问题后,个人单独解决,考虑不够周全。二是,学生对编程质量的认识较弱,没有养成编写“良好运行”的健壮程序的习惯。
本文通过将XP极限编程的核心方法引入Java编程教学,有利于帮助学生养成良好的编程习惯,增强了学生对编程质量的认识,取得了良好的教学效果。
2 极限编程(eXtreme Programming,XP)
XP极限编程是近年来使用广泛的软件敏捷开发方法之一。与“一次性针对所有需求完成设计、实现、测试”的传统开发模式不同,XP将开发过程分解為测试、编码、设计/重构三个短小周期,针对每一个需求模块采用增量、迭代方式完成测试、编码、重构,在迭代过程中优化设计。如图1所示。
图1 XP极限编程
XP极限编程通过强调结对编程、测试驱动、重构、简单设计核心方法,使整个开发流程简单、高效,且是软件质量得到有效保证。
2.1 结对编程
结对编程是两人一组连续协作共同完成软件设计、实现和测试的开发方式。在文献[1]指出,结对编程与单独编程相比,完成的程序具有更好的设计,更加简短有效,且具有更少的错误和缺陷。结对两人工作时,交流中彼此传递着知识,分享知识,并且互相学习编程技巧。因此,结对编程方式有利于结对的人充分沟通和交流,既能互相促进和补充知识和技能、彼此受益;又能提高编程质量和减少所用时间。
2.2 测试驱动开发
与传统开发方式不同,测试驱动开发(Test Drived Development,TDD)提倡以测试为中心。在编写任何实际功能的实现代码前,先编写该功能的测试;编写功能的实现代码是以通过该功能的所有测试为目标。测试驱动开发可以尽早地发现错误和避免错误,极大地降低了错误的出现几率和修改成本;从而保证最终软件有可靠的质量。
2.3 重构
重构(Refactor)是指在不改变功能的外部行为的前提下,对功能的内部实现进行优化,去除冗余部分,提高代码可读性。增加新的测试和功能后,通过重构对代码进行“重新”设计,增进内部的清晰性和一致性。
2.4 简单设计
简单设计(Simple Design)以最简单方式设计、实现每个功能,去除一切不必要的冗余部分,只要能通过当前的预定的所有测试即可。并在后续的不断重构中,根据需求变化进行修改和优化。
另外,在为每一个类和方法设计其功能职责时,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运算功能测试列表
序号 说明 输入 输出
1 Result为0.0,传入参数2.0 2.0 Result为0.0
2 Result为0.0,传入参数0.0 0.0 提示“除数为0”错误
3 Result(非0)为10.0,传入参数2.0 2.0 Result为5.0
4 Result(非0)为10.0,传入参数0.0 0.0 提示“除数为0”错误 3.3 编写测试用例
测试用例是对功能需求的具体体现,根据TDD测试驱动开发原则,在编写功能实现代码前,需先编写测试该功能的用例。为了方便编写测试用例,可提前向学生介绍xUnit、TestNG类测试工具的使用。
结对两人根据已明确的需求,编写测试用例。比如,定义计算器的测试用例类为CaculatorTest,并根据需求列表中的第1个需求,编写第一个测试方法。
public void testZeroDivide(){
//getResult()返回0.0
calculator.divide(2.0);
assertEquals(0.0, calculator.getResult());
}
3.4 编写实现代码
结对两人共同编写能够通过当前所有测试的实现代码。在该环节,学生最容易犯的错误是,编写实现代码时,主观随意、即兴发挥,实现代码并非都是为了通过当前所有测试而编写。与通过测试不相关的代码部分,无法进行测试验证其正确性,所以,根据简单设计原则,应该避免和去除与当前测试无关的部分。
另外,编写代码时,可由一人进行代码编写,同时另一人在边上观看,并且两人时常交换。一方面,两人可以及时发现代码错误,并减少错误出现的几率,保证代码的编写质量;二是,代码编写过程中,两人在查找代码错误、修改错误及尽力避免错误的大量讨论,彼此的知识、技巧和经验得到了充分的交换和补充,是对已学的书本内容进行了又一次生动而深刻学习。
3.5 运行测试、重构
运行当前所有测试,验证实现代码的正确性。如果实现代码存在错误,未通过所有测试,则返回步骤4检查实现代码,修改错误。修改后,并再次运行测试。在多次的“修改代码-运行测试”的迭代中,如发现冗余的、无关的代码,应重构当前程序,优化和修改设计,及时去除冗余部分,从而提高代码质量。
实现代码能够通过当前所有测试后,跳回步骤3,按照测试列表,在测试用例中编写增加一个新的测试,继续编写实现代码、运行测试,直到通过所有测试。
这种增量的、迭代方式的过程中,程序不断地被重构,既可以根据变化进行修改,又可以通过优化提高质量,使得最终的程序具有良好的质量和健壮性。
在基于XP极限编程的这种增量的、迭代方式的过程中,学生的知识和技巧不断地得到了强化学习和提高,并且学生养成了良好的软件开发习惯,提高了对软件开发的质量意识,为后续课程的学习奠定了坚实的基础。
4 结论
经过实践发现,按照上述方法將XP极限编程应用到Java编程教学中,教学效果有了明显的改善:
(1)提高了学生编写程序的质量和健壮性。学生的程序代码中,随意命名“a1,b1”的情况和冗余代码明显减少,程序编码的规范性和质量有了较大提高。程序运行不再频繁出错,程序具有了一定的健壮性。
(2)增强了对软件开发的质量意识。学生不再只是以程序能够运行为目标,在开发过程中,能够主动通过多次迭代、重构来优化程序,提高程序质量,质量意识有了明显增强。
(3)软件开发习惯有了明显改变。学生逐渐熟悉了“测试驱动、结对编程”的增量、迭代开发方式,以前的“单打独斗”编程习惯有了明显的转变。
参考文献:
[1]W.Laurie,K.Robert,结对编程技术[M].北京:机械工业出版社,2004.
[2]Kent Beck.解析极限编程—拥抱变化[M].北京:机械工业出版社,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.测试驱动开发艺术[M].北京:人民邮电出版社,2010.
作者简介:葛宪强,男,讲师,硕士,研究方向:软件工程、图形处理;许杰,女,中级,硕士,研究方向:教育管理。
作者单位:聊城大学计算机学院,山东聊城 252059;聊城高级财经学校工程系,山东聊城 252000
关键词:极限编程;Java教学;教学改革
中图分类号:TP311.11-4
1 当前编程教学现状
Java是计算机软件工程专业教学中使用的主要编程语言之一。在以往的Java编程教学中发现,学生在学习过程中普遍存在如下问题:
编写出的程序错误多,查找错误、修改错误占用了大量时间。程序设计和代码的质量比较差。编写的程序即使能够运行,但也经常出错。通过调查分析,究其原因主要是,每个学生都是传统的“单打独斗”编程方式,编程过程缺少与他人的沟通交流;遇到问题后,个人单独解决,考虑不够周全。二是,学生对编程质量的认识较弱,没有养成编写“良好运行”的健壮程序的习惯。
本文通过将XP极限编程的核心方法引入Java编程教学,有利于帮助学生养成良好的编程习惯,增强了学生对编程质量的认识,取得了良好的教学效果。
2 极限编程(eXtreme Programming,XP)
XP极限编程是近年来使用广泛的软件敏捷开发方法之一。与“一次性针对所有需求完成设计、实现、测试”的传统开发模式不同,XP将开发过程分解為测试、编码、设计/重构三个短小周期,针对每一个需求模块采用增量、迭代方式完成测试、编码、重构,在迭代过程中优化设计。如图1所示。
图1 XP极限编程
XP极限编程通过强调结对编程、测试驱动、重构、简单设计核心方法,使整个开发流程简单、高效,且是软件质量得到有效保证。
2.1 结对编程
结对编程是两人一组连续协作共同完成软件设计、实现和测试的开发方式。在文献[1]指出,结对编程与单独编程相比,完成的程序具有更好的设计,更加简短有效,且具有更少的错误和缺陷。结对两人工作时,交流中彼此传递着知识,分享知识,并且互相学习编程技巧。因此,结对编程方式有利于结对的人充分沟通和交流,既能互相促进和补充知识和技能、彼此受益;又能提高编程质量和减少所用时间。
2.2 测试驱动开发
与传统开发方式不同,测试驱动开发(Test Drived Development,TDD)提倡以测试为中心。在编写任何实际功能的实现代码前,先编写该功能的测试;编写功能的实现代码是以通过该功能的所有测试为目标。测试驱动开发可以尽早地发现错误和避免错误,极大地降低了错误的出现几率和修改成本;从而保证最终软件有可靠的质量。
2.3 重构
重构(Refactor)是指在不改变功能的外部行为的前提下,对功能的内部实现进行优化,去除冗余部分,提高代码可读性。增加新的测试和功能后,通过重构对代码进行“重新”设计,增进内部的清晰性和一致性。
2.4 简单设计
简单设计(Simple Design)以最简单方式设计、实现每个功能,去除一切不必要的冗余部分,只要能通过当前的预定的所有测试即可。并在后续的不断重构中,根据需求变化进行修改和优化。
另外,在为每一个类和方法设计其功能职责时,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运算功能测试列表
序号 说明 输入 输出
1 Result为0.0,传入参数2.0 2.0 Result为0.0
2 Result为0.0,传入参数0.0 0.0 提示“除数为0”错误
3 Result(非0)为10.0,传入参数2.0 2.0 Result为5.0
4 Result(非0)为10.0,传入参数0.0 0.0 提示“除数为0”错误 3.3 编写测试用例
测试用例是对功能需求的具体体现,根据TDD测试驱动开发原则,在编写功能实现代码前,需先编写测试该功能的用例。为了方便编写测试用例,可提前向学生介绍xUnit、TestNG类测试工具的使用。
结对两人根据已明确的需求,编写测试用例。比如,定义计算器的测试用例类为CaculatorTest,并根据需求列表中的第1个需求,编写第一个测试方法。
public void testZeroDivide(){
//getResult()返回0.0
calculator.divide(2.0);
assertEquals(0.0, calculator.getResult());
}
3.4 编写实现代码
结对两人共同编写能够通过当前所有测试的实现代码。在该环节,学生最容易犯的错误是,编写实现代码时,主观随意、即兴发挥,实现代码并非都是为了通过当前所有测试而编写。与通过测试不相关的代码部分,无法进行测试验证其正确性,所以,根据简单设计原则,应该避免和去除与当前测试无关的部分。
另外,编写代码时,可由一人进行代码编写,同时另一人在边上观看,并且两人时常交换。一方面,两人可以及时发现代码错误,并减少错误出现的几率,保证代码的编写质量;二是,代码编写过程中,两人在查找代码错误、修改错误及尽力避免错误的大量讨论,彼此的知识、技巧和经验得到了充分的交换和补充,是对已学的书本内容进行了又一次生动而深刻学习。
3.5 运行测试、重构
运行当前所有测试,验证实现代码的正确性。如果实现代码存在错误,未通过所有测试,则返回步骤4检查实现代码,修改错误。修改后,并再次运行测试。在多次的“修改代码-运行测试”的迭代中,如发现冗余的、无关的代码,应重构当前程序,优化和修改设计,及时去除冗余部分,从而提高代码质量。
实现代码能够通过当前所有测试后,跳回步骤3,按照测试列表,在测试用例中编写增加一个新的测试,继续编写实现代码、运行测试,直到通过所有测试。
这种增量的、迭代方式的过程中,程序不断地被重构,既可以根据变化进行修改,又可以通过优化提高质量,使得最终的程序具有良好的质量和健壮性。
在基于XP极限编程的这种增量的、迭代方式的过程中,学生的知识和技巧不断地得到了强化学习和提高,并且学生养成了良好的软件开发习惯,提高了对软件开发的质量意识,为后续课程的学习奠定了坚实的基础。
4 结论
经过实践发现,按照上述方法將XP极限编程应用到Java编程教学中,教学效果有了明显的改善:
(1)提高了学生编写程序的质量和健壮性。学生的程序代码中,随意命名“a1,b1”的情况和冗余代码明显减少,程序编码的规范性和质量有了较大提高。程序运行不再频繁出错,程序具有了一定的健壮性。
(2)增强了对软件开发的质量意识。学生不再只是以程序能够运行为目标,在开发过程中,能够主动通过多次迭代、重构来优化程序,提高程序质量,质量意识有了明显增强。
(3)软件开发习惯有了明显改变。学生逐渐熟悉了“测试驱动、结对编程”的增量、迭代开发方式,以前的“单打独斗”编程习惯有了明显的转变。
参考文献:
[1]W.Laurie,K.Robert,结对编程技术[M].北京:机械工业出版社,2004.
[2]Kent Beck.解析极限编程—拥抱变化[M].北京:机械工业出版社,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.测试驱动开发艺术[M].北京:人民邮电出版社,2010.
作者简介:葛宪强,男,讲师,硕士,研究方向:软件工程、图形处理;许杰,女,中级,硕士,研究方向:教育管理。
作者单位:聊城大学计算机学院,山东聊城 252059;聊城高级财经学校工程系,山东聊城 252000