一.结对编程人员:

   张艺(学号后三位:185) 杨伊(学号后三位:151)

二.这是我们工作的样子:(图片)

三.结对编程优缺点:

    优点:

    1.结对编程时间紧密,在一定程度上可以督促双方学习,提高效率。

   2.Coder在coding过程中会遇到一些细小的问题,而reviewer可以及时指出错误,并给予解决方案进行讨论。

   3.遇到问题时,两个人一起讨论,并补充对方没有想到的地方,是完善程序最好的方式。

   缺点:

   在编程过程中,很长时间是coder在coding的过程中想思路,大概这也是每个程序员的特点,而这个时候reviewer就会长时间遇到空档期。

四.组员各自的优缺点:

      1.张艺:编程能力强,思路清晰,实践能力强。但是特别容易被动漫带跑。

   2.杨伊:学习态度不错,有耐心,较专心。动手能力弱。

五.说明怎样利用好的设计方法:

    1.Information Hiding:信息隐藏是结构化设计与面向对象设计的基础。在结构化中函数的概念和面向对象的封装思想都来源于信息隐藏。软件业对这个原则的认同也是最近十年的事情。
        以下列举了一些信息隐藏原则的应用。
        (1) 多层设计中的层与层之间加入接口层;
        (2) 所有类与类之间都通过接口类访问; 
        (3) 类的所有数据成员都是private,所有访问都是通过访问函数实现的;

     信息隐藏机制在本次编程作业中是十分有必要的,乘客乘坐电梯只需知道电梯外按钮代表的含义即可,而电梯的运行机制是没有必要让乘客知道的。而程序中体现这一点的是使用private关键字实现类的封装。

       2.Interface Design:接口的有七个特性,分别是:稳定性,易用性,规范性,可移植性,鲁棒性,安全性和兼容性.而稳定性和易用性是设计接口时最基本的特性,接口必须相对稳定,否则将导致接口的使用者和提供者为了适应新接口而不断修改接口的实现,可能重复进行无用功,严重时影响整个软件开发进度。

       3.Loose Coupling:耦合性是指组件(函数)之间相互依赖的程度,而松耦合是指功能函数之间,尽量依赖程度不要太高。否则,修改完一个底层函数后,会对多个上层函数,进行大量的测试。

六.Design by Contract:契约式设计要求软件设计者为软件组件定义正式的,精确的并且可验证的接口,这样,为传统的抽象数据类型又增加了先验条件、后验条件和不变式。这种方法的名字里用到的“契约”,或者说“契约”是一种比喻,因为它和商业契约的情况有点类似。契约式设计的核心思想是对软件系统中的元素之间相互合作以及“责任”与“义务”的比喻。这种比喻从商业活动中“客户”与“供应商”达成“契约”而得来。

七.Unit Test:

以下是我们针对Scheduler类编写的单元测试(部分截图),从截图的右边可以看到所有方法均通过了测试:

以下是单元测试的代码覆盖率:

可见单元测试对整个程序的覆盖率是较低的,但由于我们是针对Scheduler类做的测试,因此我们点开Scheduler.dll,看看单元测试对该类的覆盖情况:

可见覆盖率达到了80%以上。

八.UML图:

九.算法关键以及独到之处:

算法的实现分为两个阶段:原始阶段优化阶段

A.原始阶段

该算法的实现有一个前提,即乘客较为机智,在进入电梯时不会进入无法到达自己目标的电梯。
实现算法前需要为每一个电梯设置一个任务列表,为调度器设置一个总任务列表。API中将请求分为DirectionReq和DestinationReq两种,下文分别以方向请求和目的地请求简称。
算法实现如下:
调度器:
1.为符合条件(请求时间与当前时间一致)的方向请求生成请求,并将其加入调度器的任务列表。
2.每个tick调度器进行调度,分为以下两步完成:
 (1).为方向请求安排电梯。选择可达请求源楼层且距离源楼层最近且方向顺路或停机且没有被乘客拒绝过的电梯,将该请求入该电梯的任务列表。在调度器的任务列表中将该请求标记为已分配。
 (2).根据电梯的运行方向对每个电梯的任务列表进行排序,若上行则从小到大,下行则从大到小。删除目标层为本层的请求。检查电梯的任务表,如为空说明电梯目前已无任务,设置电梯为停机状态。否则,设置电梯的历史方向,并将任务表中第一个任务的目标楼层作为下一次电梯停靠位置。

乘客的选择策略:
1.乘客因两种可能原因导致无法进入电梯:
 (1).超重或超过人数。若如此,通知调度器重新激活任务列表中的该任务,使其可被重新安排。
 (2).电梯无法到达乘客指定楼层。若如此,将该电梯加入乘客的拒绝列表重新激活任务列表中的该任务,使其可被重新安排。
2.乘客若进入电梯,则该电梯一定可将乘客送达;将调度器中的该请求删除之。
3.乘客离开电梯与原API相同,不做改变。

算法独到之处在于考虑到了顺路策略,以及在安排电梯时尽量调度离乘客近的电梯。如果该电梯不能将乘客运载到乘客想要到的目的地,则对于该请求,这个电梯是被拒绝的,以后也不会为该乘客安排这个电梯。然后再为其调度其他的电梯,这也是和现实生活接近的。

B.优化阶段
在算法优化阶段,我们考虑增加乘客的智慧,使其能根据当前来的电梯更改自己的目的地,将临时目的地设置为电梯所能运载到的最远楼层。然后再转乘其他电梯,这样可以提高电梯的利用率。
经过优化后,平均耗时相比原始阶段有了大幅提高。

十.感想:这是我的第一次结对编程,以往编程作业都是自己想算法,自己上网查资料学习语言。但是这次结对编程,和同伴一起讨论算法,并解决算法中的问题是我从未有过的体验。虽然我们在共同编程这一点上做的不是很好,很大一部分时间都是一个人在敲代码,配合还需要进一步的磨合。但是我们从这种学习的方式中学到了很多。

pair work结对编程(张艺 杨伊)的更多相关文章

  1. pair work 附加题解法(张艺 杨伊)

    1.改进电梯调度的interface 设计, 让它更好地反映现实, 更能让学生练习算法, 更好地实现信息隐藏和信息共享,目前的设计有什么缺点, 你会如何改进它? 目前的缺点: (1)电梯由于载客重量不 ...

  2. 20175305张天钰Java结对编程四则运算(二)

    Java结对编程四则运算(二) 一.题目描述及要求 Git提交粒度不要太粗,建议一个文件/一个类/一个函数/一个功能/一个bug修复都进行提交,不能一天提交一次,更不能一周一次,参考Commit Me ...

  3. 20175305张天钰Java结对编程四则运算

    Java结对编程四则运算 一.题目描述:如何对表达式进行求值运算呢 1.中缀表达式与后缀表达式(娄老师讲解) 中缀表达式就是运算符号在运算数中间的表达式,比如1+2,顾名思义,后缀表达式就是运算符在运 ...

  4. 2017-2018-2 1723《程序设计与数据结构》第九周作业 & 第二周结对编程 总结

    作业地址 第九次作业:https://edu.cnblogs.com/campus/besti/CS-IMIS-1723/homework/1878 (作业界面已评分,可随时查看,如果对自己的评分有意 ...

  5. 2017-2018-2 20172323 『Java程序设计』课程 结对编程练习_四则运算 2

    相关过程截图 关键代码解释 将运算式分开的代码 String[] result = num.split("\\s"); 将输入的num以空格为间隔符号分开,将每一个间隔开的字符存入 ...

  6. 结对编程-地铁续(有种上个学期OO的既视感)

    我们组比较特殊..三人结对 github:https://github.com/qingchanghan/WPFUI_Metro po一张照片: 石浩然,韩青长.陈彦吉 (台式机真的很高端,分屏贼帅) ...

  7. 关于软件工程结对编程作业 PairProject : Elevator Scheduler(电梯调度算法的实现与测试)的总结

    1)结对编程队友 1106xxxx 张扬 1106xxxx 杨军 其中,此项目的编程实现主要由前者完成. 2)关于结对编程 结对编程的优点: 最直接的一点:在结对编程中,由于有另一个人在你身边和你配合 ...

  8. 结对编程—黄金点游戏WinForm单机版

    本小游戏场景来自邹欣老师的<移山之道>一书: "阿超的课都是下午两点钟,这时班上不少的同学都昏昏欲睡,为了让大家兴奋起来,阿超让同学玩一个叫"黄金点"的游戏: ...

  9. Week4 结对编程

    1.照片 1.1  结对编程参与者:李文涛.黎柏文 1.2  展示照片 2.结对编程的优点&缺点 2.1 优点 2.1.1.两人分工合作,减少了工作量 2.1.2.结对编程的伙伴往往能提供不同 ...

随机推荐

  1. cc1plus.exe: error: unrecognized command line option "-fno-keep-inline-dllexport "

    在Windows环境下的控制台上,通过qmake指令编译Qt程序时,出现 cc1plus.exe: error: unrecognized command line option "-fno ...

  2. BSOJ 4591 -- 【JLOI2015】城池攻占

    Description 小铭铭最近获得了一副新的桌游,游戏中需要用m个骑士攻占n个城池. 这n个城池用1到n的整数表示.除1号城池外,城池i会受到另一座城池fi的管辖,其中fi 每个城池有一个防御值h ...

  3. Spring AOP 和 AspectJ

    现如今有许多个可用的 AOP 库,使用这些库需要能够回答以下问题: 是否与现有的或新的应用程序兼容? 在哪里可以使用 AOP ? 如何迅速与应用程序集成? 性能开销是多少? 在本文中,我们将回答这些问 ...

  4. Ignatius and the Princess III(方案背包+搜索)

    就是问你,n这个数可以被多少种方案组成. 比如: 算是,方案+完全背包的模板题了. #include<iostream> #include<cstring> using nam ...

  5. 图像跟踪(1) CSK

    依赖OPENCV 1功能 鼠标选取目标  S按键取消重新选择 共享内存目标框 中心 X Y 边框W H //////////////////////////////////////////////// ...

  6. rman restore spfile from backup

    spfile一般在$ORACLE_HOME/dbs(linux)目录,如果你丢失了spfile并不会引起实例立刻停掉,你的实例可以继续操作,尽管当你restore spfile的时候需要关闭重启实例, ...

  7. SpringBoot实战(十四)之整合KafKa

    本人今天上午参考了不少博文,发现不少博文不是特别好,不是因为依赖冲突问题就是因为版本问题. 于是我结合相关的博文和案例,自己改写了下并参考了下,于是就有了这篇文章.希望能够给大家帮助,少走一些弯路. ...

  8. 安装win10操作系统的设备将要突破10亿台

    导读 该公司最初的目标是在发布后的三年内在 10 亿台设备上运行 Windows 10. 据微软高管梅赫迪 (Yusuf Mehdi) 周四在 Twitter 上透露,目前已经有 8 亿多台设备安装了 ...

  9. 深入浅出的webpack4构建工具---webpack+vue+router 按需加载页面(十五)

    1. 为什么需要按需加载? 对于vue单页应用来讲,我们常见的做法把页面上所有的代码都打包到一个bundle.js文件内,但是随着项目越来越大,文件越来越多的情况下,那么bundle.js文件也会越来 ...

  10. linux安装jenkins和编译发布gitlib项目

    1. jenkins下载地址 wget https://updates.jenkins-ci.org/download/war/2.138/jenkins.war 2. 安装插件 安装gitlib和m ...