Pair Project: Elevator Scheduler [电梯调度算法的实现和测试] --11061188刘强
队员:刘强(11061188) 林谋武(11061169)
结对编程:
结对编程的优点:
1、 两个人合作,相比于一个人自己奋斗而言,更能激发自己的潜能;我们在合作过程中,互相学习,互相磨合,各自发挥自己的长处,并及时提醒对方工作上的失误,能让我们的工作进行得更加顺利;
2、 两人在合作过程中彼此交流,能更快速地发现设计中出现的漏洞,及时改正错误,提高工作效率;
3、 两人合作相较于多人团队合作而言,更能促进彼此的交流,因为两人合作过程中,有什么问题可以直接提出,并在两人商讨之后得到满意的结论,若参与者数量太多,反而不好调配;
4、 虽然我们两个人的水平有一定差距,但是我们彼此信任,共同努力,最终还是实现了一个比较理想的算法,这是我们共同的劳动结果;
结对编程的缺点:
1、 两人的工作进度相互牵制很严重,若一人拉后腿,则工作总进度受到很大影响;
2、 产生分歧之后要尽快解决,否则容易影响默契,阻碍工作进行;
对中人员评价:
1、 刘强:
优点:1、编程能力强、算法设计能力强;2、动手能力强,能快速完成自己的任务;
3、性格开朗积极,比较会缓和气氛;
缺点:有时侯容易较真
2、 林谋武:
优点:1、学习态度比较好,不懂就问;2、做事认真负责,对自己份内任务比较重视;
3、性格温和,不易动怒;
缺点:有时候比较爱偷懒;
关于Information Hiding,Interface design,Loose coupling:
1、 信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。我们在实现算法时,参考了原有代码,并翻阅了相应资料有,最终确定对于不同类的不同信息隐藏操作;这是对于我们使用面向对象语言的一次很好的锻炼;
2、 接口是用来表示某一特定的功能模块,在工程中,如果遇到某些功能就可以把它封装起来,并在类中实现它。我们之前上过面向对象的课程,对接口设计有个大致的感性认识,经过这次程序实现,我们进一步提高了我们对接口和封装的理解,熟练了操作;
3、 松散耦合是指模块之间要尽量保持独立,模块之间尽量少的牵连,以免修改一个模块后导致其他模块的异常。这样便于程序的修改和管理。虽然这次的作业并没有让我们直接参与到模块的独立设计中,但是我们也确实感受到模块独立的好处,在以后的学习过程中,我们会进一步学习使用这种方式的;
关于“契约式设计”:
契约式设计或者Design by Contract (DbC)是一种设计计算机软件的方法。这种方法要求软件设计者为软件组件定义正式的,精确的并且可验证的接口,这样,为传统的抽象数据类型又增加了先验条件、后验条件和不变式。这种方法的名字里用到的“契约”或者说“契约”是一种比喻,因为它和商业契约的情况有点类似。其优点:1、让人更好地理解O-O方法和软件构造;2、为除错、测试、和更一般的质量保证提供了一个有效的框架;3、它是一种给软件部件建立文档的方法;
单元测试:
1、 最直接的原因是保证我们函数的正确性,如果这个函数在没有保证正确的情况下就被上层代码调用,那么随着项目的深入,调用层次会越来越深,就很容易产生严重的BUG问题,从而增加开发难度,降低开发效率!
2、 根本原因是减轻我们开发人员的工作量,使我们的工作变的轻松(这只是一个相对说法)!
3、 Unit Test测试截图如下:
UML图:
核心算法:根据rush hour test要求,需要我们合理分配上下班高峰时的电梯调度
1)首先迭代判断四个电梯状态:
a) Direction.Up:调用PickUp(elev)函数
b) Direction.Down:调用PickDown(elev)函数
c) Direction.No:调用NewReq(elev)函数
2)关键函数:NewReq(elev)
A) 首先判断0/1层请求是否达到累计请求书的70%,若达到,则将当前状态为Direction.No的电梯调度之0层,并清空请求次数数据
B) 一当前层为参照,按照(楼上的上行,楼上的下行,楼下的下行,楼下的上行)顺序依次进行电梯调度。例如:楼上的上行:
(1) 若有n个楼上层处于状态,则寻找n个楼层中的最大值,将其加入电梯目标层列表(ArrayList)。
(2) 对于当前层与最高层之间的其他上行楼层,通过调用函数PickUp() 函数实现停靠
3)对于PickUp(elev)/PickDown(elev)函数,实现对顺路楼梯层的稍带,详见代码注释
[附加题] 改进电梯调度的interface 设计, 让它更好地反映现实, 更能让学生练习算法, 更好地实现信息隐藏和信息共享。
首先,就原有的StopAtEach方法而言,此算法的实现既是非常低效率的算法,同时也非常的不符合现实状况;因为在现实生活中,我们并不可能让我们的电梯一直处于运行状态下,且在每一层都会有暂停的状况;所以我们提出了自己的改进,就是对应于输入的指令做出的相应的回应,方法定义为NewReg,并在考虑乘客体重的情况下会有不同的运行速度,更符合实际;而同时,我们考虑到电梯运行过程中,不同乘客的不同上下楼的需求,设计了不同的方法,以进行不同的实现,这样能更好地迎合现实中的情况;最后,我们还考虑了电梯运行中的顺路带人问题,实现了PickUp和PickDown的方法;即若乘客的目标楼层相对于当前楼层的方向与电梯运行的方向相同、且乘客体重适宜,我们会顺路带走乘客。这些方法的实现,更好地反映了现实情况,同时,不同方法的信息共享和信息隐藏条件都由我们设计,让我们得到了更好的练习。