软件工程实践第二次作业
——结对编程
[Jewish]SHOU 1759223 sjw同学
结对编程对象:1759233 xhy同学
目录:
《软件工程综合实践专题》……1
——结对编程……1
1.语言选择以及需求分析……2
2.结对编程……3
3.源代码……4
4.测试用例……5
5.感悟总结……6
Page 2 语言选择以及需求分析
①需求分析:某位小学老师要每周给同学出300道四则运算练习题:
1.两个运算符100以内的数字,不需要写答案
2.需要写答案,并且保证答案在【0,100】区间内
3.不允许出现重复的题目
②语言以及实现工具选择:经过协商,我们在体验结对编程的情况下分别使用了python以及java语言都实现了以上需求,其中java实现的部分扩展成窗口化客户端工具,可供学生做题并且具有判别对错的功能
Page 3 结对编程
①概念:结对编程是一种敏捷软件开发的方法,两个程序员在一个计算机上共同工作。一个人输入代码,而另一个人审查他输入的每一行代码。输入代码的人称作驾驶员,审查代码的人称作观察员(或导航员)。两个程序员经常互换角色。在结对编程中,观察员同时考虑工作的战略性方向,提出改进的意见,或将来可能出现的问题以便处理。这样使得驾驶者可以集中全部注意力在完成当前任务的“战术”方面。观察员当作安全网和指南。结对编程对开发程序有很多好处。比如增加纪律性,写出更好的代码等。
②实行:由于我与结对编程的同学之前都未尝试过这种极端编程,在刚开始编写代码的时候往往双方的思路不同而导致分歧,但是在交流之后选择了较简单的方法,或者结合二者的思想进行编程,使编程效率大幅上升,并且容易发现容易被对方忽略的语法错误,也会被对方发现自己经常忽视的语法错误,减少语法错误的发生,经过一个下午的结对编程分别使用python以及java实现了需求。以下是一些由结对编程解决的一些问题:
例子1:开始的时候使用python实现的时候,由于python的方便简洁,我们两个的想法有很多,比如:
firstNum=random.randint(1,99)
secondNum=random.randint(1,99)
choice=['+','-','*','/']
operate=random.choice(choice)
开始时就随机运算符产生了分歧,这是最后决定的版本,开始时一个人想用1到4产生随机数,然后1到4分别代表加减乘除,然而每次输出会发现运算符每次都要换,然后经过讨论用元组的方法储存运算符并做随即运算,最后print方法只需要调用一次即可,节约了代码量。
例子2:为了解决题目不重复
count=0
allExcise=[]
while count<300:
firstNum=random.randint(1,99)
secondNum=random.randint(1,99)
choice=['+','-','*','/']
operate=random.choice(choice)
answer=represent(operate,choice,firstNum,secondNum)
if answer!=0:
show=str(firstNum)+operate+str(secondNum)+"="+str(answer)
if show not in allExcise:
allExcise.append(show)
print(show)
else:
count-=1
else:
count-=1
count+=1
为了解决题目避免重复的问题,想出了一一比较的方法可是我觉得浪费性能,就想出了将所有结果存进一个列表,列表中存着的都是一个个题目的字符串,如果新随机出的算数题目不在元组中则加入元组,若不再则计数变量-1防止无效重复题占用题数。
3.有时对方有些语言忘记的时候也能相互提醒,提高了不少效率。
Page 4 源代码
①java客户端源代码:
运行结果:
java客户端除了随机出现算术类型,还有4种模式,加减乘除单类加强题,并且做出了窗口,让学生即时做题,做完后可以评卷,判断对错,做完后,可以查阅答案。
代码分析:在与python差不多的算法下,增加了窗口,可以进行人机交互操作了
②python源代码:
import random
def represent(operate,choice,first,second):
if operate==choice[0]:
answer=first+second
elif operate==choice[1]:
answer=first-second
elif operate==choice[2]:
answer=first*second
else:
answer=first/second
if answer<100 and answer>0:
return answer
else:
return 0
def transport():
count=0
allExcise=[]
while count<300:
firstNum=random.randint(1,99)
secondNum=random.randint(1,99)
choice=['+','-','*','/']
operate=random.choice(choice)
answer=represent(operate,choice,firstNum,secondNum)
if answer!=0:
show=str(firstNum)+operate+str(secondNum)+"="+str(answer)
if show not in allExcise:
allExcise.append(show)
print(show)
else:
count-=1
else:
count-=1
count+=1
if __name__=='__main__':
transport()
运行结果:
1.测试用例说明:
假设测试用户使用windows系统电脑运行。功能如下:
随机生成300道100以内的加减乘除法运算,并且其答案区间也在100以内,另外也不许有重复的题目
表1
测试日期 2019-3-17用例描述 随机生成300道不重复的且答案在100以内的100以内算术题
用例接口 python程序/java客户端
测试序号 场景 步骤 结果
1 假设小学老师布置算术题 运行程序 成功
2 假设学生即时做题 运行客户端程序 成功
Page 6 感想感悟
由于之前都一个人编程习惯了,经过这次结对测试的经历,让我们意识到了结对编程会极大地加快编程效率,能达到事半功倍的工作效果,此外还能改正之前编程的坏习惯,比如我和他为了使对方易于理解自己的代码就会注意到格式的重要性,使代码简洁整洁规范了。但是人与人之间的合作不是一件简单的事情,因为我们都习惯了独自编程,其次还需要看两个人之间的默契,通过两个人缜密的思考和计划可以极大的缩短代码长度、减少语法错误的发生、减少思考的时间,从而做出更加完美的产品。而另一方面,两个有经验的人可能会发现配对编程里没有什么技能的转移,但是让他们在不同的抽象层次解决同一个问题会让他们更快地找到解决方案,而且错误更少。两个程序员具有相同的缺点和盲点的可能性小,所以采用结对编程时候会获得更好的解决方案,这个解决方案恰恰是其它软件工程方法学中所没有的。在我们平时的编程当中,如果遇到一个非常难解决的问题,这时可能会对问题产生厌烦,那么你势必会希望录求帮助,无论是从信息量庞大的网上,还是从身边的技术大师那里,你都会努力去解决。这个时候不妨采用结对编程试一下,会有不同的感觉,会体会到两个人思想的碰撞、语法知识的互补以及增强两人的默契。