结对编程项目总结以及一些小小的体会

结对项目:电梯调度算法的实现和测试

12061205 王力民   12061196 金鑫

这就是我们两个忙着编代码的样子啦,之前也没有尝试过这样一种结对编程的方式,第一次这样合作,还是有不少感想与收获的吧。

一、关于结对编程的优缺点

优点:

1. 在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力。

2. 对开发人员自身来说,结对工作能带来更多的信心,高质量的产出能带来更高的满足感,同时,能够降低学习成本,一边编程,一边共享知识和经验,有效地在实践中进行学习。

3. 在心理上,  当有另一个人在你身边和你紧密配合, 做同样一件事情的时候,  你不好意思开小差, 也不好意思糊弄。

4. 在企业管理层次上,结对能更有效地交流,相互学习和传递经验,能更好地处理人员流动。因为一个人的知识已经被其他人共享。

缺点:

1.对于有不同习惯的编程人员,可以在一起工作会产生麻烦,甚至矛盾。

2.程序员们有时会对一个问题各执己见,导致浪费很多时间彼此争论。

3.两个人在一起工作可能会出现工作精力不能集中的情况。程序员可能会交谈一些与工作无关的事情,反而分散注意力,导致效率比单人更为低下。

4.有经验的人更喜欢单兵作战,找个人来站在他背后看着他可能会让他感到非常的不爽,最终导致编程时受到情绪影响,反而出现反作用。

二、结对成员

  1. 王力民

编程能力强,思维清晰,有耐心。有时想的太多。主要负责编码。

  1. 金鑫

愿意花时间,细致,认真。代码编写能力不足。主要负责博客撰写。

三、关于设计方法

  1. Information Hiding,信息隐藏。

将程序模块化时,保证每个模块对其他所有模块都隐蔽自己的设计决策,让模块规定并设计成为在模块中包含的信息不被不需要这些信息的其他模块访问。应用有在多层设计中的层与层之间加入接口层,使所有类与类之间都通过接口类访问和 类的所有数据成员都是private,所有访问都是通过访问函数实现等。

  1. Interface Design,接口设计。

软件的接口设计元素描述了信息如何流入和流出系统以及被定义为体系结构一份的构件之间是如何通信的。这次的作业中用到的主要是各种设计构件之间的内部接口,通过这些接口让软件体系结构中的构件之间进行内部通信与协作。接口实现时,保证所有操作和消息传递模式都得到实现,且不同类的操作之间能够进行通信和协作。

  1. Loose Coupling,松耦合。

耦合是类之间彼此联系程度的一种定性度量。因为随着通信和协作数量的增长,类之间的联系程度越来越强,系统的复杂性也随之增长了,类之间的耦合程度也就增加了。通过增加接口,使类之间的通信协作通过接口很好的完成,保证程序尽可能保持低耦合。松耦合系统通常是基于消息的系统,此时客户端和远程服务并不知道对方是如何实现的。客户端和服务之间的通讯由消息的架构支配。只要消息符合协商的架构,则客户端或服务的实现就可以根据需要进行更改,而不必担心会破坏对方。松耦合通讯机制提供了紧耦合机制所没有的许多优点,并且它们有助于降低客户端和远程服务之间的依赖性。

四、Design by Contract, Code Contract

  1. Design by Contract,契约式设计。

优点:

(1) 这种方法要求软件设计者为软件组件定义正式的,精确的并且可验证的接口,这样,为传统的抽象数据类型又增加了先验条件、后验条件和不变式。因此,契约式设计中的函数,期望所有调用它的客户模块都保证一定的进入条件,这样它就不用去处理不满足先验条件的情况。同时,保证了退出时给出特定的属性。做到在进入时假定,并在退出时保持一些特定的属性。

(2) 使调试过程更简单。便于程序中的错误的查找与解决。

(3) 能帮助代码重用,因为每段代码的契约都被很好的文档化了,模块的契约可以被当做软件文档来描述模块的行为。

缺点:断言不能沿着继承层次往下遗传。如果你重新定义了某个具有合约的基类方法,实现该合约的的断言不会被正确调用,你必须手工调类不变式,基本的合约不会主动实现。

使用:

  1. Code Contract

优点:

(1)     规范了协定,统一了代码。显式区分了前置条件和后置条件,并将断言也统一了起来。

(2)   改进测试。代码协定提供静态协定验证、运行时检查和文档生成。

(3)     自动测试工具。可以使用代码协定来筛选掉不满足前置条件的没有意义的测试参数,从而生成更有意义的单元测试。

(4)     静态验证。静态检查器可以在不运行程序的情况下确定是否存在任何违反协定的情况。它会检查隐式协定和显式协定。

(5)     引用文档。文档生成器在现有的 XML 文档文件增加协定信息。还提供了可与 Sandcastle 一起使用的样式表,以便生成的文档页具有协定节。

五、UML

各个实体之间的关系如上类图所示。

六、算法

1、关于算法这一块,我们最开始讨论出了一个比较完善的算法。

以每位乘客为单位建立请求队列,每个请求包括乘客所在的楼层和要去的楼层。

然后以以下条件判断电梯是否开门:

  1)电梯经过每一层的时候都判断是否有请求等候在这一层,如果有并且顺路,就满足请求。(这里加一个优化,就是计算一下电梯停下来所花费的时间和其他楼层的电梯到这里满足指令所花费的时间,选择较小的)

  2)如果有空电梯,立即满足请求。

后来在实现的时候,发现老师给的框架是一个乘客发出请求时建立一个请求对象,进入电梯后再建立另一种类型的请求对象,以此构成请求队列。与预先设计的算法有些出入,实现起来略有难度。

2、后来在分析过源代码之后,我们设计了另一个算法。

  1)源代码是在每一层都停下来,乘客上下电梯都是自动完成的。后来助教给了一个优化的版本,是寻找下一个需要停的目标楼层,这样做是考虑了disablefloor。

  2)因此我在想是否可以在找下一个目标楼层的时候加入优化,即各种限制条件。

  3)但编码实施一段时间后我发现自己想错了。那个NextAvailableFloor方法并不是用来找下一个目标楼层,而是下一个可以停的楼层。换句话说也就是靠这个方法依次返回每个楼层来驱动电梯运行,如果在这个方法中加入优化,可能导致电梯长时间无法运动。

3、最后跟宿舍的另一个队的队员讨论之后,得出了一个还算可行的算法。

  1)只修改Scheduler中的调度算法。

  2)以电梯为驱动,即在时间的循环内每一个时刻都遍历四部电梯,刷新电梯运行状态。

  3)对每一部电梯,都遍历请求队列。

    a)分电梯外和电梯内请求考虑

    b)要带走顺路的电梯外请求

  4)遍历完请求之后改变电梯的运行状态

七、总结

1、经过这次之后,我深深地体会到了对项目做好规划的重要性。最开始我就是随便看看代码想想算法,但其实在实现的时候才发现很多细节都没有注意到。于是重新根据程序运行顺序读了一遍代码,思考了代码模版的框架,最终完成了这次项目。

2、要深刻地理解面向对象编程中各个对象各司其职的思想。最开始我希望去修改elevator类中的NextAvailableFloor来实现优化。但其实犯了一个严重的错误,本应就调度算法进行优化,我却希望修改elevator中的方法。最后想明白这一点之后,修改了Scheduler中的调度算法。

3、由于个人编程能力有限,在修改Scheduler中的调度算法时,之前想过的很多优化都没有实现进去,导致最后程序效率并不高。关于这一点,只能通过今后的锻炼来提升自己,增强编程能力。

时间: 2024-12-26 17:50:29

结对编程项目总结以及一些小小的体会的相关文章

结对编程项目——电梯调度

电梯调度 现有一新建办公大厦,共有21层,共有四部电梯,所有电梯基本参数如下表所示: 电梯编号 可服务楼层 最大乘客数量 最大载重量 1 全部楼层 10 800 kg 2 单层 10 800 kg 3 双层 20 1600 kg 4 全部楼层 20 2000 kg 其使用规定如下: 1.楼层号为0~20,其中0号为地下一层: 2.有楼层限制的电梯不在响应楼层停靠,如单双层: 3.所有电梯采用统一按钮控制 请根据上述要求设计并实现一个电梯控制程序,如果有图形显示就更好了. 伙伴介绍与评价: 本次结

20165230 结对编程项目-四则运算 整体总结

20165230 结对编程项目-四则运算 整体总结 一.需求分析 随机生成题目 生成的题目个数从命令行输入 用户可选择生成不同难度的题目,比如通过参数指定: (1) 运算符个数范围 (2) 运算符限定(小学一年级题目只生成 + - 题目) 能多次生成题目 题目运算(判题) 支持多运算符 支持整数 支持真分数 题目合法性判断 可独立使用 可用于测试生成题目的正确性 扩展需求 题目去重 支持多语言 处理生成题目并输出到文件 完成题目后从文件读入并判题 二.设计思路 设计一个IntNumber类,用来

结对编程项目-开发环境搭建过程

开发成员:2015035107169 焦广鑫 2015035107161 杜念泽 结对编程项目:四则元算器 这次我们开发的项目是四则运算器,用到的开发语言为python2.7,具体环境搭建链接为http://jingyan.baidu.com/article/eb9f7b6da950c4869364e8f5.html

结对编程项目——四则运算

1. 结对编程项目---四则运算 (10分) 基本功能要求: 1) 实现一个带有用户界面的四则运算.2) 生成的题目不能重复.3) 支持负数,例如-1,-1/2,-3‘4/5等.(达成) 需要支持的基本设定参数 1) 题目的数量  2) 数值的范围  3) 题目中最多几个运算符(目前没有达成)  4) 题目中或运算过程中有无有分数(比如进行整数除法的时候不能除尽) 5) 题目中是否有乘除法  6) 题目中是否有括号 (目前没有达成) 7) 题目中或运算过程中有无负数         学习感受:

结对编程项目作业

结对编程项目作业内容:成员0:    学号:2015035107153    姓名:吕爽成员1:    学号:2015035107155    姓名:陶丽爽结对编程项目作业名称:四则运算出题器.选择该结对编程项目原因:零基础开始,希望我和队友可以一起努力共同完成.

结对编程项目(除附加题)开发过程

结对编程项目(除附加题)开发过程 结对同伴:李云涛 一.照片 结对同伴在家,等回校后补上. 二.结对编程评价 优点: 1.两个人的编程思想.算法.代码风格可以互相借鉴和学习,对于两人的编程水平的提高都很有帮助. 2.两个人可以分工写不同的相对独立的模块,加快开发的进度. 3.自己程序的bug可能自己怎么找都找不到,而自己的同伴就能很快找到. 缺点: 有些工作必须得两人在一起才能进行,而两人都空闲的时间不是太多,很多时候需要通过线上进行交流,导致工作被耽搁. 我自己的优点:做事认真.有恒心.有学习

结对编程项目

内容: 成员0: 学号:2015035107149 姓名:黄妍 成员1: 学号:2015035107154 姓名:马璐 结对编程项目作业名称:井字棋游戏 选择该结对编程项目原因:巩固自己的知识,让自己能更加熟练的编程.

结对编程项目作业0

标题: 结对编程项目作业 内容: 成员0: 学号:2015035107003 姓名:鞠牧孜 成员1: 学号:2015035107010 姓名:郑月 结对编程项目作业名称:五子棋游戏 选择该结对编程项目原因:因为五子棋游戏是一种受大众喜欢的一款游戏,其规则简单,变化多端,只需要另个人即可进行,非常富有趣味性和消遣性.

课后作业-结对编程项目总结

经过一个多月的时间,结对编程项目已经接近了尾声,通过软件工程这门课,让我和我的搭档学会了如何合作,如何一起处理bug,如何结对编程. 我们所做的项目是利用python自带的pygame来编写一个小程序贪吃蛇,这个游戏我们大概分为了以下个步骤,并且逐一实现,现在就来总结一下: 1.窗口和方块:首先每一个游戏必备的步骤就是主循环以及一个背景,所以我们首先做一个背景以及蛇头的初步实现,代码如下: game_screen = pygame.display.set_mode((game_screen_wi