1.Advantages and disanvantages of Peer Programming

  advantages

The code are constantly validated by two people, reducing the possibility of indivudual making stupid mistakes.

    • The code belongs to two people simutaneously, avoiding consulting each other some trivial problem, such as variable definition, occuring too frequently. To some extent, this also abbandoned individualism.
    • Under the supervisoion of your partener, we tend to resolve the tasks from within. The more concentrated, the more efficient. We kind of like one statement about peer programming: While sit besides your partener, the keyboard that lies beneath your hands turns into a piano. It is not you programming a front of your teammate, but performing a pleasing symphony in front of your audience. Wholeheartedly, Peer Programming is really a creative and interesting ways of programming.
    • share experiences and knowledges
  •   Disadvantages
      • need time to get to know each other for better cooperation. May feel uncomfortable at the beginning.
      • Not every situation suit this method.
      • The experienced may become frustrated about fresh-man. The fresh-man, in contrast, may feel too nervous to perform well.
      还有一些在网上看到的,感觉都是会遇到的问题:

        •   喜欢发号施令的人总是对敲键盘的人说:“到末行,加个反括号,然后…”。他不去关注解决方法和下一步该怎么做,而过度关注一些编程细节。
        •   拼写纠错者坐在你旁边,纠正你输入的每个错误字符。当然,他没有时间来真正的进行导航。
        •   深藏不露者仅仅自己敲着代码而不告诉别人他在做什么。领航员不得不靠自己去弄懂代码。关于该用什么方法,该选择哪种设计,领航员和实施者之间完全没有交流。
        •   跳跃很大的人喜欢在代码中进行大范围的跳跃,这样领航员不知道进行到哪里了。
  •   In brief, one should contemplate before conducting peer programming. All in all, just like the <Peopleware> said, human is always the one that we should consider first.

2.Hiding Information,interface design,loose coupling  

  • Information Hiding 

  Information hiding is part of the foundation of both structured design and object-oriented design. In structured design, the notion of “black boxes” comes from information hiding. In object-oriented design, it gives rise to the concepts of encapsulation and modularity, and it is associated with the concept of abstraction.

----From Code Complete Section 5.3

  信息隐藏是在面向对象中非常重要的方法,它和对象的封装与模式化密切相关。它可以将一个类内部非常敏感,开发人员不想让使用者直接操作的变量隐藏在自身内部。这样,增加了软件的健壮性和安全性。

  

  Code Complete中列举了两类需要考虑隐藏的内容:

    Hiding complexity so that your brain doesn’t have to deal with it unless you’re specifically concerned with it:复杂化的信息。这样某个模块的问题就不会被带入到另一个模块中。想这次的Elevator Framework,对于Elevator而言,不需要知道Scheduler当中到底发生了什么事情,只需等待调度器分配给他StopAt(floor)指令,接着到达指定楼层就可以了。同时Elevator更不需要知道每一个Passenger的信息,Passenger会在电梯停在相应楼层猴自己上电梯。这样的Information Hiding 很好地重现了现实生活的情况,有助于Object-Oriented Design的开发。

    Hiding sources of change so that when change occurs the effects are localized:个人认为这样可以防止错误扩散到外部代码中去。这样可以将因为change产生的exception在该模块内部进行捕获。

  • Interface Design and loose coupling

  接口设计实现了information hiding(只给用户提供接口让其调用)。这次pair work 中深深体会到了好的接口设计带来的方便。在编程的初期,及时我们不是很清楚整个代码的结构和运行原理,但是只要修改IScheduler,我们写的调度算法就可以很自然地接入到整个系统中。(老师就是老师,写的整个Elevator Framework能够很清楚地分清楚每个模块的功能,并且很好地实现了模块之间的通信,感觉我们的面向对象编程思想还很不成熟,根本达不到老师这样完善。希望以后能够多教授一些这方面技巧)

  我们进行接口设计的目的就是为了各个模块之间的松耦合,两者之间相辅相成。

  这里我们还在网上看到一个值得注意的误区。面向对象接口应该适当的使用。比如当电梯的实现只有一个SenElevator时,就不必再写一个IElevator接口了。千万不要“为了写接口而写接口”。

3.Design By Contract 契约式设计

  调用者必须提供正确的参数,被调用者必须保证正确的结果和调用者要求的不变性。

  •   优点: 双方都有必须履行的义务,也有使用的权利,这样就保证了双方代码的质量,提高了软件工程的效率和质量。
  •   缺点
    • 契约式编程需要一种机制来验证契约的成立与否。但是并不是所有的程序语言都有断言机制。那么强行使用语言进行模仿就势必造成代码的冗余和不可读性的提高。比如.NET4.0以前就没有assert的概念,只在4.0后全面引入了契约式编程的概念。
    • 契约式编程并未被标准化,因此项目之间的定义和修改各不一样,给代码造成很大混乱。

4.unit test

我们测试的是elevator类,最后代码覆盖率又90%左右,因为只测试了单一方向,最后乘以二就对了

5.UML

这是VS搞出来的类图,看了一下还挺靠谱的,贴一个简单的,再贴一个详细的

6.算法实现:

  •   Scheduler:修改scheduler,放弃了StopatEachFloor,使用了新的方法Allocate。Allocate算法不同于BUS调度。每当有外部请求时,调度器会根据每个电梯各自的CurrentFloor计算到达请求楼层所需的时间。然后将四个时间比较得出最短时间,将请求交给时间最短的电梯完成。

     T总 = Tdelay + Trun

     Trun的具体计算方法用if else分支语句分为了7种情况(暂时不考虑disabled floor,<R,请求方向>为请求高度及方向,<D,电梯方向>为电梯高度及方向):

    •   R上,D上,D<R,(上行顺路) t = (R-D)/v
    •   R上,D上,D>R,t = [2*maxfloor(电梯当前要到达的最高楼层)-R-D]/v
    •   R上,D下  t= (D+R-2*minfloor)/v
    •   R下,D上,  t = (2*maxfloor-R-D)/v
    •   R下,D下,D<R,t= (D+R-2*minfloor)/v
    •   R下,D下,D>R,(下行顺路) t=(D-R)/v
    •   D停止  t=|D-R|/v

      注意这里计算使用的是电梯高度而不是楼层进行时间,这非常关键:举个例子,#1在3层停靠,#2在36米上行(此时currentfloor为3),实际用时应分别为2tick,5tick+doorclosetick。如果用当前楼层计算,则都为5秒,因为循环特征会将任务分配给#1,而这明显是错误的。这个疏忽造成的bug导致我们花费了很长时间。

      Tdelay 是电梯行驶过程中停靠花费的时间,等于DestinyFloor.count()*5ticks。

      进行分配后,Elevator类会将将相应楼层位置1。每次停下后,首先将相应楼层的DestinyFloor置0,。通过遍历DestinyFloor[]找到相应方向最近的楼层作为下一目标,这里还要注意:当到达电梯目标楼层中的最大楼层是,电梯应将行驶方向反向,再寻找下一个停靠目标。

      因为我们不能控制Passengers的行动(实际生活中是这样的,因此我们尽量模拟真实情况),所以我们对Passengers做的修改在此不赘述。但是对Passenger的代码做简要分析。Passenger类中自带了计时器,意味着它的每个实例都有自己的一个计时器,用来计算traveltime。同时,每次电梯停下后会由委托穿个每个实例一个事件,即电梯已经停下。SigmaPassenger进行简单判断就可在电梯停在自己的请求\目标楼层后上\下电梯。

      之后考虑disAbled floors[]问题。这个属性是原本就在Elevator中的,只不过没有用到。TA的代码中通过加入lowestfloor 属性,我们认为用disabled floor这个数组就可以实现所有有关楼层的限制,就没有采用TA的方法。

      我们还设想,当某一部电梯闲置时间超过一定时间时,它将获得下一个任务的优先权,即不管他的时间多少,都将这个任务分配给它,但是由于时间原因,这部分设想并没有体现在我们的代码中。

7.附一张合作照片,以示纪念

Peer Programming Project: 4 Elevators Scheduler 学号后三位 157,165的更多相关文章

  1. Peer Programming Project: 4 Elevators Scheduler 附加题 157 165

    1.改进电梯调度的interface 设计, 让它更好地反映现实, 更能让学生练习算法, 更好地实现信息隐藏和信息共享. 每个电梯增加目标楼层数组,这样可以更好地进行任务的分配,在我们的电梯中,这个数 ...

  2. dxxzc团队及队员学号后三位

    队名:dxxzc团队 组长:邢正080 组员:董冰068   许国庆079   张琦057 曹华058

  3. JSP导出Excel后身份证后三位为0

    JSP导出Excel身份证号码超出Excel最大限制,用科学计数法表示,但后三位为0,修改方式: <style type="text/css">.txt    {    ...

  4. 如何处理导出的csv无法查看身份证后三位的情况?

    如何处理导出的csv无法查看身份证后三位的情况? 原因:excel中如果是常规格式无法显示那么多位数,改成文本格式就可以. 简单步骤,导入数据------>选择数据来源------>选择编 ...

  5. Leading and Trailing LightOJ - 1282 (取数的前三位和后三位)

    题意: 求n的k次方的前三位 和 后三位 ...刚开始用 Java的大数写的...果然超时... 好吧  这题用快速幂取模求后三位  然后用一个技巧求前三位 ...orz... 任何一个数n均可以表示 ...

  6. 导出数据excel表--身份证号后三位是0--〉还原

    导出数据excel表的身份证号后三位是0,怎么办? 数据导出前,在身份证号前加任意符号即可 例如: 结果

  7. E - Leading and Trailing 求n^k得前三位数字以及后三位数字,保证一定至少存在六位。

    /** 题目:E - Leading and Trailing 链接:https://vjudge.net/contest/154246#problem/E 题意:求n^k得前三位数字以及后三位数字, ...

  8. 1282 - Leading and Trailing 求n^k的前三位和后三位。

    1282 - Leading and Trailing You are given two integers: n and k, your task is to find the most signi ...

  9. plsql导出查询结果,导出csv文件。但是类似身份证等超出15位的数据后三位显示问题,和科学计数法的格式问题

    问题描述:     plsql导出查询结果时,如果使用导出查询结果,使用excelfile会特别慢.     所以我们一般使用csv文件,然后在excel中新建空白文档,在数据菜单中导入数据,但是导出 ...

随机推荐

  1. windows下更改Mac地址

    方法一.在桌面上的“网上邻居”图标上单击右键,选择“属性”,在弹出的“网络连接”的对话框中,在“本地连接”图标上单击右键,选择“属性”,会弹出一个“本地连接属性”的对话框,单击“配置”按钮,选择“高级 ...

  2. hubilder打包+C#服务端个推服务实现

    关于推送鼓捣了好长时间,这里不再写helloworld了,只讲里面遇到的问题. 1.关于苹果开发者平台上的注册 网上很多的教程,只要按照步骤来设置就行了,在 iOS证书(.p12)和描述文件(.mob ...

  3. cobaltstrike3.8服务器搭建及使用

    参考链接: https://www.ezreal.net/archives/166.htmlhttp://blog.cobaltstrike.com/category/cobalt-strike-2/ ...

  4. Java设计模式之四 ----- 适配器模式和桥接模式

    前言 在上一篇中我们学习了创建型模式的建造者模式和原型模式.本篇则来学习下结构型模式的适配器模式和桥接模式. 适配器模式 简介 适配器模式是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型 ...

  5. Pycharm 安装 idea VIM

    直接在线安装 1.File->Settings->Plugins->Install JetBrains Plugins 2.点击install安装ideavim 3.也许需要的切换v ...

  6. 全栈JavaScript之路( 二十二 )IE 专有扩展——文档模式

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/hatmore/article/details/37611911 ie8 引入了一个新的概念.&quo ...

  7. forever start app.js 启动node时,服务访问一次后第二次就不能访问了

    开始总是找不到原因,是因为在启动服务时,没有设置日志文件.突然想到了是不是forever安装的有问题,就重新安装forever , 这时候提示系统 no space left on device  , ...

  8. SSM搭建一个后台管理系统

    看一下效果图: 登陆界面: 图片上传页面: 我也把项目放到服务器上了,可以直接查看项目内容: http://codingcoge.cn/ssm-demo/login.html 1 我也放到github ...

  9. 【转】这五种方法前四种方法只支持IE浏览器,最后一个方法支持当前主流的浏览器(火狐,IE,Chrome,Opera,Safari)

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  10. 转载 .Net多线程编程—并发集合 https://www.cnblogs.com/hdwgxz/p/6258014.html

    集合 1 为什么使用并发集合? 原因主要有以下几点: System.Collections和System.Collections.Generic名称空间中所提供的经典列表.集合和数组都不是线程安全的, ...