Pair Project:电梯控制程序 编写心得

同组人:·10061150李斌 10061210王安然

在结束了第一个个人作业“词频分析”之后,我和七班的王安然(10061210)组成了一个小组,进行Pair Project——电梯控制程序的设计。

由于大家都不是很熟悉,所以我们利用十一之后的那节软件工程课的课间互相认识了一下。王安然的代码编写能力很强(据说获得过“冯如杯”的一等奖),所以我们两人中他担当了主要的角色。而我则是对已有代码做了一个uml框架。之后王安然对框架添加了一定的注释,这个任务话费了大约三天的时间。

就在一切看起来很美好的时候,悲剧发生了。王安然临时被派出去大连参加中国计算机大会,导致我们无法面对面进行沟通,只能通过QQ进行交流。最终,我们解决了代码中一些有其一的地方,使得我们对框架所表述的内容打成了共识。这个过程大约花费了两天的时间。

之后便是构思算法。通过对已有电梯的分析,王安然找出了两种典型的电梯算法,它们分别在北航新主楼和百度大厦有所应用。随后我们进行了讨论,分析了其优劣,并最终确定了第一种算法作为我们的实现算法。这个过程花费了大约两天的时间。

通过王安然的讲解,使我初步对这个算法有了了解。首先,每个电梯都有一个子控制程序。它负责根据这个电梯里面的乘客和它目前的状态,决定它的下一个目标;它里面有一个容器,存放它的目的地序列,这个序列由它里面的乘客和下一个外部请求决定。首先,在每个电梯运动时(Direction是Up或Down)的tick,遍历当前楼层到目的楼层之间的等待时间较短、等待人数较多的有请求的未被预定的楼层,将该楼层加入到目的地序列容器中,并将该楼层预定。若它到在停止(Direction是No)的时候,它需要删除目的地序列中的当前楼层,并决定下一个目标:若它本来没有下一个目标(目的地序列为空),则将所有楼层中未被预订的等待时间较短、等待人数较多的楼层作为它的下一个目标,同时预订该楼层;若它有下一个目标,则将当前楼层和下一个目标楼层之间的未被预订的等待时间较短、等待人数较多的楼层(如果有)作为它的下一个目标,预定该楼层。如果决定了新的目标,则将新目标加入到容器中。它会收到楼层的请求,这也就代表了一个人上了电梯,我们需要根据他的目标更新目的地容器。除此之外,总控制程序主要负责维护请求容器,并将请求分发到需要的电梯子控制程序中。

随后,我们开始对其进行实现。虽然这个算法比较简单,但在实现的过程找那个还是出现了一些问题,当然,这个问题还在我们的调试能力范围之内。

最后,我们开始对其进行测试。首先我写了一些测试用例,王安然对其进行测试。虽然相比于之前的原始版本,效率方面没有很大的提升,但是稳定性和准确性方面,却有了显著的提高。

接下来的一段时间,我和王安然将会进一步优化算法,争取使得电梯的效率有更大的突破。

通过这次结对编程,我从王安然同学身上学到了很多,比如说严谨的思维,对全局的把握等等。通过此次联系,我发现结对编程可以帮我们少走弯路,对于拓展思维提高效率大有裨益。感谢王安然同学的辛勤工作。

关于结对编程的优点:

1、两个程序员可以进行互补。结对编程其实可以算是一个小型的团队,而这个团队里的每个人擅长的领域是不一样的,这样的话,每个人便可以将自己的长项最大化的展现出来,而自己的短板恶业可以由队友来进行拟补。

2、两个程序员可以互相影响。结对编程并不是一个人在写编程,一个人在旁边看着无所事事,而是两个人一起探讨,一起编程。而这个过程中,一个人的思维变可以影响到另一个人的思维,这样变可以共同进步。

3、结对编程可以更容易的发现程序中的一些问题。

关于结对编程的缺点:

1、如果两人的编写代码的能力差距过大,那么便不是很有利于整体工程的进行。

2、编程过程中遇到的分歧如果不能够很好的解决,便不利于整体工程的进行。

3、由于大家同龄而且没有上下级的关系,那么在代码编写的过程中,难免会牵扯到一些无关紧要的话题,影响工程进度。

我的队友王安然的有点:

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图:

算法概要:

首先,每个电梯都有一个子控制程序。它负责根据这个电梯里面的乘客和它目前的状态,决定它的下一个目标;它里面有一个容器,存放它的目的地序列,这个序列由它里面的乘客和下一个外部请求决定。首先,在每个电梯运动时(Direction是Up或Down)的tick,遍历当前楼层到目的楼层之间的等待时间较短、等待人数较多的有请求的未被预定的楼层,将该楼层加入到目的地序列容器中,并将该楼层预定。若它到在停止(Direction是No)的时候,它需要删除目的地序列中的当前楼层,并决定下一个目标:若它本来没有下一个目标(目的地序列为空),则将所有楼层中未被预订的等待时间较短、等待人数较多的楼层作为它的下一个目标,同时预订该楼层;若它有下一个目标,则将当前楼层和下一个目标楼层之间的未被预订的等待时间较短、等待人数较多的楼层(如果有)作为它的下一个目标,预定该楼层。如果决定了新的目标,则将新目标加入到容器中。它会收到楼层的请求,这也就代表了一个人上了电梯,我们需要根据他的目标更新目的地容器。除此之外,总控制程序主要负责维护请求容器,并将请求分发到需要的电梯子控制程序中。

转载于:https://www.cnblogs.com/kevinlb/archive/2012/10/22/2733861.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值