结对编程成员:李嘉良10061152,由之望10061181
结对编程是指两名程序员坐在一台电脑前合作完成一个项目,这样的合作比一个程序员单独工作要快很多,而在两年的编程生涯中,一项都是自己一个人完成代码的编写,从来都没有两个人一起合作过。这一次和大神李嘉良合作完成电梯调度这一程序,在老师给出的代码中包括了电梯的各种属性,我们要做的只是想出一个算法使得电梯上下运行搭载乘客效率最高。老师给出的bus算法能保证所有的乘客都有电梯坐,但是这样做的效率极低。
正如上文说到的,结对编程最大的好处就是提高了码代码的效率,达到了事半功倍的效果,然而我认为结对编程还是会存在一定的缺陷,比如两个人的思想不可能是完全相同的,所以每个人在写代码的时候都有自己的算法,而结对编程则要两个人在算法,代码和测试都达到统一,这会变得很麻烦。
每一个人都有自己的有点和缺点,先说我自己,我的缺点就是代码能力弱,正是因为如此,我更愿意思考,思考更简单的算法,而且愿意动手尝试,虽然能力弱,但是愿意通过努力完成这些任务。再说李嘉良,他的缺点是懈怠,其实他的代码能力很强,和他差不多的比如淡定和黄杨这些人都是很早就写了一个简单的版本。不过我们还是在最后几天搞出来了一个算法,这也体现了他代码能力很强。而且李嘉良为人很好沟通,虽然在水平上比我要高很多,但是没有那种高手对菜鸟的架子。
Information Hiding:信息隐藏,指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。提高通信的效率,信息隐藏技术在信息安全保障体系的诸多方面发挥着重要作用。loose coupling:耦合,是对一个软件结构内各个模块之间互连程度的度量。内聚标志一个模块内各个元素彼此结合的紧密程度,它是信息隐蔽和局部化概念的自然扩展。在program,elevator,loaders,passenger上就可以方便的使用,而在我们工 作的重点电梯调度算法(scheduler)上,恰当使用这些接口,继承拓展原来简单的 scheduler,同时在拓展原scheduler类的同时,我们也充分利用以上方法,拓展员初始化类 和QueueReq类,并将各种判断条件从主题函数run()中分离出来,方便以后修改复用,例如 :IsAtTopFloor/IsAtBottomFloor 函数判断电梯调度边界条件,LastScheduler定义最近调 度方案,尽可能减少重复代码。契约式设计或者Design by Contract (DbC)是一种设计计算机软件的方法。这种方法要求软件设计者为软件组件定义正式的,精确的并且可验证的接口,这样,为传统的抽象数据类型又增加了先验条件、后验条件和不变式。这种方法的名字里用到的“契约”或者说“契约”是一种比喻,因为它和商业契约的情况有点类似。所谓契约,也就是合约,规定两个交互物件上的权利和责任。雇佣合同规定你的工作时数和你必须遵守的行为规则,作为公司则付你薪水,双双履行义务,双双受益。
一 前置条件(precondiction):为了调用函数,必须为真的条件,在其违反时,函数决不调用,传递好数据时调用者的责任。
二 后置条件 (postcondion):函数保证能做到的事情,函数完成式的状态,函数有这一事实表示它会结束,不会无休止的循环。
三 类不变项(class invariant):从调用者的角度来看,该条件总是为真,在函数的内部处理过程中,不变项可以为变,但在函数结束后,控制返回调用者时,不变项必须为真。
我们小组的算法:首先我们看过了老师给的bus算法,电梯在每个楼层都要停并且开门5秒,不论这一楼层是否有乘客需要乘坐电梯,这样做是十分没效率的,所以我们开始打算修改这个算吧,使得电梯在经过每一个楼层的时候进行判断,判断这一楼层是否有乘客响应,但是发现我们不能修改elevator的代码,只能在scheduler中加入自己的算法,所以这个想法就搁浅了。然后我们比对现实生活中的电梯,决定让四个电梯全部响应乘客的需求,然后当有一个电梯搭载上这名乘客的时候,响应取消。而响应的标准是先到先服务,同方向优先,最短路径优先。这样的算法与bus对比就变得更加有效率了。
但是这个算法并不是最好的,然而如果想要再精进一步,就需要修改elevator中没停一层都要开门的那段代码,其实这也是附加题的任务,但是由于时间的问题,我们小组并没有进行这方面的优化。
以上便是我和李嘉良提出的电梯调度的算法,虽然没有什么特别的地方,但是能保证每个乘客都能尽快的坐上电梯到自己想去的楼层。