结对编程项目——————————贾伟&&陈伯雄
结对编程:
起初,对于结对编程大家都表示出来的是惊讶。这是大学为数不多的能合作完成的作业,在高兴的同时展现出来的是担心。
担心的有几个方面:
1、一个是题目对于自己来说太难,那样会有可能无法完成,还影响同学的成绩。
2、结对编程在做作业方面会影响效率,还是增加效率方面不太了解。
3、如果两个想打酱油的人撞倒一起,会不会出现火花、、、
我所期待的结对编程:我想象中的结对编程应该是两个互补的人,在一起工作,比如一个人的代码能力很强。而另一个的逻辑分析能力和算法能力很强,那么他们结对会有很大的优势,这样的结对会很大的加快工作效率。当然,也有可能两个人的某一方面都很弱,那么两个人都要花时间来学习;好处可能就在这里,两个人一起学习,效率肯定是大于一个人的。总之,结对编程应该是一个比较高效的编程方法。
下面是结对编程的优缺点:
(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 ,描述这些做法的优缺点, 说明你是如何把它们融入你的作业中的。
答:Design by Contract(契约式设计)是Bertrand Meyer总结的一项设计技巧,也是Meyer发明的Eiffel语言的主要特点。不过,这条原则的作用范围并不局限于Eiffel,而是所有的程序设计语言。
Design by Contract使用了三类断言:后继条件(post-conditions),前提条件(pre-conditions),以及不变量(invariants)。前驱条件与后继条件都是针对操作(operation)而言的。
契约式设计的三个关键词:
一 前置条件(precondiction):
为了调用函数,必须为真的条件,在其违反时,函数决不调用,传递好数据时调用者的责任。
二 后置条件 (postcondion):
函数保证能做到的事情,函数完成式的状态,函数有这一事实表示它会结束,不会无休止的循环
三 类不变项(class invariant):
从调用者的角度来看,该条件总是为真,在函数的内部处理过程中,不变项可以为变,但在函数结束后,控制返回调用者时,不变项必须为真。(摘自:UML Distilled 3rd edition译文)
我对此此的理解是:约式设计的主要目的是希望程序员能够在设计程序时明确地规定一个模块单元在调用某个操作前后应当属于何种状态,是一种设计风格,一种语法规范;有了语言级别的前置后置条件和不变式的明确定义,程序的结构变得更加便于阅读和交流。而且契约有助于测试。写契约时,你必须用先验条件和后验条件来说明每个例程的任务,之后还必须撰写程序体内的实现代码以完成任务。由于不得不按照两种稍有差别的方式思考这个程序,你将能更清楚地理解这个程序的任务和完成任务的方法。这样做也有助于我们尽早发现错误。测试更加到位,因此代码更加可靠 断言在运行时进行检测,从而确保程序符合它们既定的契约。契约可以随意关闭或者启用,因此我们能够方便地反复测试程序的各个部分。但是断言不能沿着继承层次往下遗传。如果你重新定义 了某个具有合约的基类方法,实现该合约的的断言不会被正确调用(除非你再新的代码中复制他们),你必须手工调类不变项,基本的合约不会主动实现。
程序代码合约(Code Contracts)是.NET Framework 4.0的新功能,它是微软对契约式编程(Design by contract)概念所提出的一种解决方案,主 要由前置条件(Preconditions)、后置条件(Postconditions)、与对象非变异(Object Invariants)这三大契约所构成,可以很容易的为程序代码加入验证 程序代码,降低程序的错误发生率,提高程序的质量,也可以整合单元测试,减少单元测试的工作量,甚至整合文档管理器,让产出的程序文件更为详细 。
使用Code Contracts主要可让我们享有下列四项特点:
1、提升自动测试程度
2、静态验证
3、执行阶段验证
4、文件产生
UML图:
算法设计思路:
每个电梯是独立调度的,使用同一套调度算法,并没有对上班高峰期进行优化。当在电梯闲置时我们让电梯停在了1楼。
其他部分:电梯的运行就是模拟的现实生活中电梯的运行。对于消息队列的处理是,若某电梯确定去某一层楼,则消除与电梯历史方向相同的需求。
这样不会发生电梯错误消除信息的队列。电梯每次向上都到有需求的最高处,电梯向下时会到有需求的最低处。
另一方面,考虑到体重限制,原本电梯剩余容量小于45kg即不再载客。但考虑到某些情况剩余容量稍大于45但也不多的情况下载客量有限,不利于平均时间的优化,我们适当加大了容量限制,即大于100kg再载客。通过实际检测,效率确实可以快一点。