Pair Project: Elevator Scheduler [电梯调度算法的实现和测试] 10061204 姚铭

同组人:10061204 姚铭&10061178 刘宇翔  

关于结对编程的思考

结对编程是我在软件工程课上才接触到的新名词。起初听到结对编程这个词时,以为是两个程序员用两台电脑一起写代码,后来才知是两人共用一台电脑合作写代码。这是就需要两人有所分工,一般来说就是相当于飞机上一个驾驶和一个副驾驶,驾驶员主要负责控制飞机的航行,而副驾驶则要协助驾驶进行航行的决策。就如1987年Intuit公司面临时间紧迫和仅有两个技术人员的情况下疯狂的结对编程:Dunn和Proulx两人一人敲代码,另一个人思考怎样写代码,几小时后双方再互换位置。这种独特的两人合作模式能给工程的进行带来更高的效率。

个人觉得结对编程的优点有以下几点:

(1)两个程序员在一起可以互补,若是两人的擅长领域不同,在结对编程时可以充分发挥两个人的长处,从而更容易获得强大的解决方案。而且两个人同时盯着一个显示器更容易发现bug,减少了个人编程中寻找bug的时间,有利于效率的提高。

(2)两个人一起工作更容易使自己投入到工程中,毕竟两人一起工作时不太容易走神,而且也不好意思自己去休息,让别人一个人工作。

(3)一对程序员在一起工作的时候,水平相对较低的一方会潜移默化地受水平略高的程序员影响,学到一些新的东西。而水平高的一方同样因为不断地把自己的想法说出来而整理了自己的思路。双方都能从中受益。

(4)不间断的复审减少了工程中出现错误的可能,同时在出现错误时,可以更快地发现错误并及时改正,提高了工作效率。

但结对编程也同时存在一些弊端:

(1)如果双方的编程水平差距过大,不利于工程的顺利进行。

(2)双方在工作过程中的交流难免会逐渐转移到与工程无关的其他话题,耽误工程的进行。

(3)在编程过程中对于算法的设计、代码的风格等方面两人难免会出现分歧,若分歧没有合理解决,则不利于工程的顺利完成。

 

我的队友刘宇翔的优点和缺点:

优点:

1.能够积极地参与到工程中,在算法方面有独到的见解

2.编程能力较强,能够较好地进行模块化设计与算法实现

3.性格开朗,在一起合作没有压力感

缺点:

编程的风格不是特别好,可读性不是特别强

 

 

关于Information Hiding, interface design, loose coupling

Information Hiding:信息隐藏指的是在设计模块时将某些特定的信息,包括属性或方法隐藏起来,对于不需要这些信息的其他类来说是不可访问的。信息隐藏提高了数据的安全性,避免了信息在无关的其他地方被非法更改,也有益于程序模块化的设计。

在编程过程中,运用信息隐藏技术需要我们对各模块的数据和方法在整个程序中的作用有着比较深的理解,对于某些信息,如果对其他模块没有实质作用,且不能被随意访问,应将其隐藏起来。

Interface design:接口是把公共的非静态方法和属性组合起来,以封装特定功能的一个集合。一旦定义了接口,就可以在类中实现它。

实际工程中,当我们遇到模块中一些固定的特定功能时,我们可以把这些功能封装成接口。一方面我们可以利用这些接口实现固定功能的不同实现方法,使得不同的实现方法可以更加灵活的运用,另一方面在程序的维护和升级阶段,我们可以扩展接口,实现更加完备的功能,方便特定功能模块的管理。

Loose Coupling:松散耦合是在一个系统中使各组件互相连接的方法,使这些模块在最小的可行范围内彼此依赖。耦合指的是一个元素对另一元素的直接了解程度。松散耦合的目的是减少风险,一个元素内发生的变更造成其它元素内非预期的变更。限制互相连接会在事情出错时帮助隔离问题并简化测试、维护和检修过程。

在软件工程中,为了避免模块之间产生过多的联系以免产生不必要甚至危险的牵连,我们应该尽量使各模块的信息尽量完整与独立。将相关联的信息尽量放在一个或者少数几个类或模块中,一方面能减少耦合程度,另一方面也利于模块化管理,便于程序修改和管理。

 

关于Design by Contract, Code Contract

契约式设计是一种设计计算机软件的方法。这种方法要求软件设计者为软件组件定义正式的,精确的并且可验证 的接口,这样,为传统的抽象数据类型又增加了先验条件、后验条件和不变式。这种方法的名字里用到的“契约”或者说“契约”是一种比喻,因为它和商业契约的情况有点类似。契约式设计是一个软件范例,使用它可以确保你的编码的错误更少。它通过执行“契约”来达到这一步。当你输入参数(前提条件)时,你期望得到什么,当你退出(后置条件)时又会产生什么样的结果,这些功能决定了一份契约的订立。例如,在函数int factorial(int n)中,你希望n是正的(前提条件),也希望它会产生一个正值(后置条件)。

 

契约式设计的三个关键词  

一、前置条件:为了调用函数,必须为真的条件,在其违反时,函数决不调用,传递好数据时调用者的责任。   

二、后置条件:函数保证能做到的事情,函数完成式的状态,函数有这一事实表示它会结束,不会无休止的循环   

三、类不变项:从调用者的角度来看,该条件总是为真,在函数的内部处理过程中,不变项可以为变,但在函数结束后,控制返回调用者时,不变项必须为真。

 

优点:

契约能使文档更出色;契约是类特性的公开视图中的固有成分;

有着更可靠的文档,运行时要检查断言,以便保证制定的契约与程序的实际运行情况一致;

断言定义了测试的预期结果,并且由代码进行维护,使程序有明确的测试指导;

既能够获得精确规范得到的益处,同时还使得程序员继续以他们所熟悉的方式工作。

缺点:

断言不能沿着继承层次往下遗传。如果你重新定义 了某个具有合约的基类方法,实现该合约的的断言不会被正确调用(除非你再新的代码中复制他们) ,你必须手工调类不变项,基本的合约不会主动实现。

 

Code Contracts

程序代码合约是.NET Framework 4.0的新功能,它是微软对契约式编程概念所提出的一种解决方案,主 要由前置条件、后置条件、与对象非变异这三大契约所构成,可以很容易的为程序代码加入验证 程序代码,降低程序的错误发生率,提高程序的质量,也可以整合单元测试,减少单元测试的工作量,甚至整合文档管理器,让产出的程序文件更为详细 。

 

使用Code Contracts主要可让我们享有下列四项特点:

1、提升自动测试程度

2、静态验证

3、执行阶段验证

4、文件产生

 

UML 图

算法概要

初步的算法和现实中的电梯差不多。首先根据电梯当前的状态,若电梯目前静止,检查电梯上下方是否有请求,若存在,寻找距离电梯最近的请求层数作为目标。

若电梯此时正在上行,检测其上方是否有请求,选择符合停止条件且最近的楼层作为目标。当达到最高层或某层以上再无请求时,运行方向置为no。

若电梯正在下行,情况与电梯上行的情况类似,方向相反。

考虑到需求中说用户从0层和1层上电梯的较多的情况,进行了一个小优化,当电梯空闲时使其运行到1层。起初设计的是运行到0层或1层(取0,1随机数),但考虑到0,1概率基本相等且若存在高层请求时1层距其更近,改为了运行到1层。进行实际测试结果符合预测。

另一方面,考虑到体重限制,原本电梯剩余容量小于45kg即不再载客。但考虑到某些情况剩余容量稍大于45但也不多的情况下载客量有限,不利于平均时间的优化,我们适当加大了容量限制,即大于100kg再载客。通过实际检测,效率确实可以快一点。

 

 

 

转载于:https://www.cnblogs.com/yao9208/archive/2012/10/22/2733860.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值