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. Postgresql - jsonb_pretty & dateStyle

    1. SHOW datestyle; DateStyle ----------- ISO, MDY(1 row) INSERT INTO container VALUES ('13/01/2010') ...

  2. 4.5Python数据类型(5)之列表类型

    返回总目录 目录: 1.列表的定义 2.列表的常规操作 3.列表的额外操作 (一)列表的定义: 列表的定义 [var1, var2, --, var n ] # (1)列表的定义 [var1, var ...

  3. Linux 小知识翻译 - 「模块」

    说起module(模块),有的像「可热插拔的零部件」的意思. 在讨论Linux时提到的模块一般是指可以组装到内核中的模块. 模块这个概念是在硬件和程序设计领域中广泛使用的概念.我们这次说的模块特指Li ...

  4. July 10th, Week 29th Sunday, 2016

    Everything is good when new, but friend when old. 老朋友更醇香. When did you meet with your last friends l ...

  5. Mac显示器不亮

    上班的时候mac连接上显示器,但是显示器并没有亮,于是乎各种插拔ing...偶尔一两次还可以接受,但是天天这样小身板招架不住呀,于是乎终于找到一个可以让显示器快速亮起的方法,遂赶紧分享给各位小火鸡~ ...

  6. 离线安装Cloudera Manager 5和CDH5(最新版5.9.3) 完全教程(七)界面安装

    一.安装过程 1.1 登录 1.2 接受许可协议 1.3 选择免费版本 1.4 选择下一步 1.5 选择当前管理的主机 1.6 选择使用Parcel安装,选择CDH版本,点击继续 1.7 等待安装 此 ...

  7. kafka监控kafka-eagle 容器化配置

    由于kafka.zk 集群已经部署在k8s中,  kafka的服务名 kafka-hs, zk的服务名为:zk-cs ,对kafka进行监控,所以需要把监控部署到k8s中,选择使用kafka-eagl ...

  8. Python脱产8期 Day01

    一 编程语言与目的 1.有特定语法,可以通过编程的方式,让计算机进行识别,从而让计算机根据人的意愿完成人想让其完成的事 2.控制奴役计算机,让其完成你想让它完成的事,从而解放人力. 二 计算机 五大组 ...

  9. Android 解决启动页白屏或者黑屏的问题

    欢迎页启动的线程由于请求和处理的数据量过大而,导致欢迎页在出现之前界面上会有一个短暂的白色闪屏停留,当然白色闪屏的停留是因为 application 的主题样式android:theme=@style ...

  10. 关于PHP程序员技术职业生涯规划

    看到很多PHP程序员职业规划的文章,都是直接上来就提Linux.PHP.MySQL.Nginx.Redis.Memcache.jQuery这些,然后就直接上手搭环境.做项目,中级就是学习各种PHP框架 ...