11061184 (yjxrtzyx) 乔立男
11061209 (wddwxy) 王旭阳
关于结对编程
我与我的搭档在事先作了了解分析之后,认为我对算法更熟悉一些,所以让我负责算法设计以及错误检查,而我的搭档对C#语言和面向对象编程比我更了解,所以他主要去搞代码实现这一块。下面是我们结对编程时的照片:
结对编程,一般是指两个程序员在一起,共同进行编程工作。其中两人可以互相思维碰撞,交流经验,取长补短,齐心协力,从而大大提高编程的效率。具体而言,其特点表现在以下方面:
优点
(1)结对编程可以提高二人的总体水平,优势互补,增强了解决问题的能力。
(2)同伴的帮助有助于提升自信心。
(3)一个人独处时有可能经常心不在焉地开小差,而在同伴的监督下,就不得不严肃地去处理问题了。
(4)编写代码时出现的问题往往自己是看不到的,而对别人的毛病却总是异常敏感,这样可以及时纠正错误,养成良好编程习惯,避免走许多弯路。
缺点
结对编程的时间并不好约定,且两个人若意见不一致,可能产生争执,这中间浪费的可就是两个人的时间了。
信息隐藏,隐藏了软件运行过程中许多中间变量,不仅提升了安全性,也使得程序内部更加简洁有序,主次分明;而对界面的设计则可以使软件的使用过程更加人性化。
单元测试
在单元测试部分,我对scheduler类进行了单元测试,如图所示。
在单元测试中,需要频繁调用其他类中的部分,故在建立测试用例的时候并不能够面面俱到,所以造成了代码覆盖率低的恶果。
希望老师能在这个部分多讲一些,毕竟这个是新接触的,自学的不太明白。
UML图
通过Visual Studio自带的反向工程的功能,生成了UML的类图,可以看出各个类间的依赖关系,通过接口定义了标准,在用不同的类继承接口,实现功能。
算法分析
在算法方面,我的电梯调度算法比较贴近实际生活中我们所遇到的情况差不多。
我将整个调度过程分成了两个部分,一部分是用户在电梯外提出乘坐电梯的请求,我们称之为外部请求;另一部分是用户在电梯中,点击其目的地的请求,我们称之为内部请求。
于是我们将这两个部分统一的放到任务列表中进行调度,具体的调度方法如下:
一、前提:电梯的currentDirection为NO,即电梯为停止状态
1、检查电梯已经完成的任务,完成后在任务列表中删除任务
2、判断任务列表中是否有任务:
有任务:按照规定的顺序去执行任务列表中的任务(电梯向上为正序执行,电梯向下为逆序执行)
无任务:检查是否有外部任务进入,若没有将电梯归位至一层(因为1层客流量最大)
否则按照固定顺序去选择外部任务。
顺序:
1、选择请求在当前位置以下的任务,方向向下,离当前位置越近越好(减少冤枉路,并尽量向一层靠拢)
2、选择请求在当前位置以下的任务,方向向上,离当前位置越远越好(能够接上更多的乘客)
3、选择请求在当前位置以上的任务,方向向上,离当前位置越近越好(能够接上更多的乘客)
4、选择请求在当前位置以上的任务,方向向下,离当前位置越远越好(能够接上更多的乘客)
二、前提:电梯为运行状态
1、判断电梯运行方向,确定电梯的任务执行顺序,若向上,则执行第一个任务,否则执行最后一个
2、若遇到新外部请求,其在当前电梯的运行轨道上,切电梯能够停下,则将新外部请求加入任务队列中,对任务队列进行维护。
运行效果:
针对passenger2.xml进行测试,原始方案得到如下结果:
我们的方案得到如下结果,可以明显看出我们算法的效率。
总结
这次结对编程对我们是一次重大的考验和挑战,我因此结识了一位出色的好伙伴,也从中学到了很多有用的知识。
---------乔立男
这次的结对编程让我学会了使用vs来进行团队开发项目,令我们明白了如何去协作,如何去测试,如何去和队友进行交流。同时第一次接触这种开发模式,可以说收获颇丰。
---------王旭阳