结对编程作业总结
小组人员:
王翔 10061176
刘明 10061141
工作照片
一、结对编程的优缺点
每人在各自独立设计、实现软件的过程中不免要犯这样那样的错误。在结对编程中,因为有随时的复审和交流,程序各方面的质量取决于一对程序员中各方面水平较高 的那一位。这样,程序中的错误就会少得多,程序的初始质量会高很多,这样会省下很多以后修改、测试的时间。具体地说,结对编程有如下的好处:
(1)在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力。
(2)对开发人员自身来说,结对工作能带来更多的信心,高质量的产出能带来更高的满足感。
(3)在心理上, 当有另一个人在你身边和你紧密配合, 做同样一件事情的时候, 你不好意思开小差, 也不好意思糊弄。
(4)在企业管理层次上,结对能更有效地交流,相互学习和传递经验,能更好地处理人员流动。因为一个人的知识已经被其他人共享。
总之,如果运用得当,结对编程能得到更高的投入产出比(Return of Investment)。
然而,在结对编程中也有一些缺陷。
(1)个人风格造成的问题,不同的人编写程序时的习惯不同,一时间难以改变。
(2)程序员因为意见不同,导致讨论的时间过长,浪费很多时间
(3)两位程序员的编程水平如果相差太大,可能在编程过程中水平高者和水平低的之间的忍耐问题,水平低者可能会拖后腿。。
二、Information Hiding, interface design, loose coupling的运用
Information Hiding:信息隐蔽,指在设计和确定模块时,使得一个模块内包含信息(过程或数据),对于不需要这些信息的其他模块来说,是不能访问的。
Interface desig:接口设计。接口定义实施者必须提供的一组成员的签名。
下面的准则有助于确保正确设计接口。
如果一组包含某些值类型的类型需要支持某些常用功能,则必须定义接口。
避免使用标记接口(没有成员的接口)。
对于定义的每个接口,请提供至少一个使用该接口的成员(例如,采用该接口作为参数的方法,或类型化为接口的属性)。
如果从某些其他类型继承的类型需要支持其功能,则考虑定义接口。
loose coupling:松散耦合,是在一个系统或网络中使各组件互相连接的方法,因此这些组件,也称为元素,在最小的可行范围内彼此依赖。耦合指的是一个元素对另一元素的直接了解程度。
三、Design by contract的运用
Design by Contract的核心是断言(assertion)。所谓“断言”,是指永远为真的布尔型语句,如果不为真,则程序必然存在错误。通常情况下,检查断言的时机,应该局限于调试(debug)阶段,而不是代码的实际执行阶段。实际上,完成的程序永远不应期望断言会被检查。
Design by Contract使用了三类断言:后继条件(post-conditions),前提条件(pre-conditions),以及不变量(invariants)。
在程序设计中,使用断言有很多好处,能给程序员带来许多便利。
举例来说,如果我们定义对某个数的“求平方根”操作,则该操作的后继条件为:input = result * result,这里的result是输出结果,而input是输入的数值。在描述“做什么”(what we do)而不涉及“怎样做”(how we do it)——换言之,将接口和实现分离开来——时,后继条件是非常有用的方法。
在继承关系中,断言扮演着独特的角色。继承的风险之一在于,开发人员为子类重新定义的行为,可能会违背父类的行为。断言减少了这种风险。对某个类来说,其 不变量和后继条件必须能够应用于所有的子类。子类可以加强这两类断言,而不能削弱它们。而前提条件则只能削弱,而 不能增强。
四、unit test
五、UML图
六、算法关键
在Scheduler中对于IRequest和IElevator的调度,将未进入电梯的乘客申请压入一个Arraylist中即 _Passenger_Wait并对四个电梯进行一个较优的选择,然后将该乘客装入该电梯,存入一个Arraylist中即elevStop[]电梯将要将乘客运往的目标楼层,进一步确定进入电梯的乘客的目标楼层的排序与调度。
其中对_Passenger_Wait的选择方法为:选择一个 HistoryDirection与申请运行方向不违背(相同或者电梯停靠未运行),离其距离最近并且剩余装载量FreeCapacity大于100或者乘客的平均体重的电梯,让其进入。停靠电梯的处理,这种情形比较多。如果电梯是到达了一个目标楼层后,就在数组_Passenger_Wait里该电梯对应的ArrayList里 面去掉当前电梯所在的楼层。这时候,如果数组_Passenger_Wait里该电梯对应的ArrayList不为空,就是说电梯的还有目标楼层没有到达,那 么就将电梯的下一个目标设为数组_Passenger_Wait里该电梯对应的ArrayList里面最近的那个目标楼层(这里,向上运行的电梯和向下运行的 电梯情况不同);如果数组_Passenger_Wait里该电梯对应的ArrayList为空,即电梯已经完成了之前数组_Passenger_Wait里该电 梯对应的ArrayList里面的所有任务,那么如果这个时候所有楼层里都没有人发出请求了,那么电梯就往第零层和第一层走,如果有请求,那么电梯就去发 出请求的地方接人。
运行电梯的处理,又分为向上运行的电梯和向下运行的电梯,但这是一个对称的过程。如果电梯和电梯目前要前往的目标楼层之间楼层有和电梯运行方 向一样的的方向请求时,并且电梯的剩余重量还大于所有人统计平均质量时,就可以使电梯在这一层里停靠一下,接上发出请求的乘客。接上乘客之 后,乘客就会发出目标请求,目标请求会加入到数组elevStop里该电梯对应的ArrayList里面。