结对作业2.0之电梯控制程序的设计和实现

  • 设计要求
    • 现有一新建办公大厦,共有21层,共有四部电梯,所有电梯基本参数如下表所示,其使用规定如下:
      • 楼层号为0~20,其中0号为地下一层
      • 有楼层限制的电梯不在相应楼层停靠,如单双层
      • 所有电梯采用统一按钮控制
      • 请根据上述要求设计并实现一个电梯控制程序,如果有图形显示就更好了。
      • 电梯编号 可服务楼层 最大乘客数量 最大载重量
        1 全部楼层 10 800 kg
        2 单层 10 800 kg
        3 双层 10 800 kg
        4 全部楼层 20 200 kg
        • Java代码审查表
          代码审查表参考了这篇博客
          我的结对作业同伴是4班张洁,张洁担任“驾驶员”的角色,我担任“领航员”的角色。
          以下是代码审查表的内容,在Markdown编辑器中使用HTML方式录入。
          • 重要性 激活 级别 检查项
            总计
            命名
            重要 Y 20 命名规则是否与所采用的规范保持一致?
            Y 20 是否遵循了最小长度最多信息原则?
            重要 Y 50 has/can/is前缀的函数是否返回布尔型?
            注释
            重要 Y 10 注释是否较清晰且必要?
            重要 Y 10 复杂的分支流程是否已经被注释?
            N 10 距离较远的}是否已经被注释?
            Y 10 非通用变量是否全部被注释?
            重要 Y 50 函数是否已经有文档注释?(功能、输入、返回及其他可选)
            Y 10 特殊用法是否被注释?
            声明、空白、缩进
            Y 20 每行是否只声明了一个变量?(特别是那些可能出错的类型)
            重要 Y 40 变量是否已经在定义的同时初始化?
            重要 Y 40 类属性是否都执行了初始化?
            Y 20 代码段落是否被合适地以空行分隔?
            Y 20 是否合理地使用了空格使程序更清晰?
            Y 20 代码行长度是否在要求之内?
            Y 20 折行是否恰当?
            语句/功能分布/规模
            Y 20 包含复合语句的{}是否成对出现并符合规范?
            Y 20 是否给单个的循环、条件语句也加了{}?
            Y 20 if/if-else/if-else if-else/do-while/switch-case语句的格式是否符合规范?
            Y 40 单个变量是否只做单个用途?
            重要 Y 20 单行是否只有单个功能?(不要使用;进行多行合并)
            重要 Y 40 单个函数是否执行了单个功能并与其命名相符?
            Y 20 操作符++和— —操作符的应用是否复合规范?
            规模
            重要 未规定规定行数 20 单个函数不超过规定行数?
            重要 Y 100 缩进层数是否不超过规定?
            重要 Y 100 是否已经消除了所有警告?
            重要 Y 40 常数变量是否声明为final?
            重要 N 80 对象使用前是否进行了检查?
            重要 N 80 局部对象变量使用后是否被复位为NULL?
            重要 Y 70 对数组的访问是否是安全的?(合法的index取值为[0, MAX_SIZE-1])。
            重要 Y 20 是否确认没有同名变量局部重复定义问题?
            Y 20 程序中是否只使用了简单的表达式?
            重要 Y 20 是否已经用()使操作符优先级明确化?
            重要 Y 20 所有判断是否都使用了(常量==变量)的形式?
            Y 80 是否消除了流程悬挂?
            重要 Y 80 是否每个if-else if-else语句都有最后一个else以确保处理了全集?
            重要 Y 80 是否每个switch-case语句都有最后一个default以确保处理了全集?
            Y 80 for循环是否都使用了包含下限不包含上限的形式?(k=0; k
            重要 Y 40 XML标记书写是否完整,字符串的拼写是否正确?
            Y 40 对于流操作代码的异常捕获是否有finally操作以关闭流对象?
            Y 20 退出代码段时是否对临时对象做了释放处理?
            重要 Y 40 对浮点数值的相等判断是否是恰当的?(严禁使用==直接判断)
            可靠性(函数)
            重要 Y 60 入口对象是否都被进行了判断不为空?
            重要 Y 60 入口数据的合法范围是否都被进行了判断?(尤其是数组)
            重要 Y 20 是否对有异常抛出的方法都执行了try...catch保护?
            重要 Y 80 是否函数的所有分支都有返回值?
            重要 Y 50 int的返回值是否合理?(负值为失败,非负值成功)
            20 对于反复进行了int返回值判断是否定义了函数来处理?
            Y 60 关键代码是否做了捕获异常处理?
            重要 Y 60 是否确保函数返回CORBA对象的任何一个属性都不能为null?
            重要 Y 60 是否对方法返回值对象做了null检查,该返回值定义时是否被初始化?
            重要 Y 60 是否对同步对象的遍历访问做了代码同步?
            重要 Y 80 是否确认在对Map对象使用迭代遍历过程中没有做增减元素操作?
            重要 Y 60 线程处理函数循环内部是否有异常捕获处理,防止线程抛出异常而退出?
            Y 20 原子操作代码异常中断,使用的相关外部变量是否恢复先前状态?
            重要 Y 100 函数对错误的处理是恰当的?
            可维护性
            重要 Y 100 实现代码中是否消除了直接常量?(用于计数起点的简单常数例外)
            Y 20 是否消除了导致结构模糊的连续赋值?(如a= (b=d+c ))
            Y 20 是否每个return前都要有日志记录?
            Y 20 是否有冗余判断语句?(如:if (b) return true; else return false;)
            Y 20 是否把方法中的重复代码抽象成私有函数?
            • 单元自动测试
              由于本程序的特殊性,无法编写JUnit自动单元测试,因此在这里贴上测试样例运行截图。
              - 图一首先是运行初始界面

              四部电梯的总控视图已经在图中给出,此时四部电梯已经预设定好可以服务的楼层信息,用户需要输入的是想要去的楼层、载客数以及载重量,输入数据之后点击“完成输入”按钮录入信息。
              - 图二是对服务楼层=10,最大载客数=100,最大载重量=10的数据进行测试

              由题意可知,我们的四部电梯都不可能承载最大载客数为100,因此没有电梯可以运行,此时下方的状态栏会显示“无法乘坐该电梯!”的提示字样。
              - 图三服务楼层=10,最大载客数=100,最大载重量=1000的数据进行测试

              同理图二,我们的四部电梯也没有一部可以承重最大载重量=1000的人/物品,所以状态栏同样会显示“无法乘坐该电梯!”的提示字样。
              - 图四中,我们测试服务楼层=100,最大载客数=100,最大载重量=1000的数据

              同理图二图三,我们的楼层最高也只有21层,所以无法实现去100层的要求,因此电梯同样无法运行,状态栏显示“无法乘坐该电梯!”的提示字样。
              - 图五中,我们测试服务楼层=10,最大载客数=10,最大载重量=10的测试数据

              这次数据可以实现了,根据题目要求的表格,我们可以确定能够运行的电梯有编号1,3,4的电梯,根据就近原则,我们的程序实现了1号电梯承载10位客人载重10去10层的要求,状态栏显示“电梯已到达该楼层!”的提示语句。
              - 图六中,我们在图五的基础上更改测试数据:服务楼层=3,最大载客数=10,最大载重量=10

              根据题目要求的表格,我们可以确定能够运行的电梯有编号1,2,4的电梯,在图五的基础上,此时电梯1号位于10层,我们要求的服务楼层是3层,1号与服务楼层的差距有7层,而2号电梯距离服务楼层的差距有3层,因此根据就近原则,我们选择让2号电梯运行,实现承载10位客人,载重10去3层的要求,状态栏显示“电梯已到达该楼层!”的提示语句。
              - 图七中,我们在图六的基础上更改测试数据:服务楼层=8,最大载客数=10,最大载重量=10

              根据题目要求的表格,我们可以确定能够运行的电梯有编号1,3,4的电梯,在图六的基础上,此时电梯1号位于10层,我们要求的服务楼层是8层,1号与服务楼层的差距有2层,而3号电梯距离服务楼层的差距有8层,因此根据就近原则,我们选择让1号电梯运行,实现承载10位客人,载重10去8层的要求,状态栏显示“电梯已到达该楼层!”的提示语句。

            • 小结
              在老师的建议下,第一次实践了结对编程的这种编程形式,上次作业虽说也是结对编程,但是基本是自己一个人进行的,只是互评了队友的代码,并没有像这次这样两个人进行探讨和研究,最后对要求做出解答的过程。在这个过程中,我受益良多。
              首先,张洁同学编写代码的时候我也在看,偶尔可以发现一些小错误,比如格式错误等,毕竟java这门语言不比c语言熟悉,C语言毕竟已经接触了三年,只能找到一些明显的小错误。张洁同学的代码结构严谨,思路清晰,注释明确,没有冗余定义和没用的语句,跟他搭档我可以学到很多。
              经历了大约一周时间的结对编程,我感觉这种编程形式对代码的改良和代码编写效率有很大的提升。在编程的过程中,我们两个可以互相学习,以前可能一个人想不出的解决方案,现在两个人一起想说不定问题就会迎刃而解,大大提高了编写代码的效率。在本次作业进行测试的过程中,张洁同学也对我进行了指导,我因此成功的完成了对代码的测试,他也会在编写过程中听取我的意见,不会只坚持自己的想法。
              总体来说这次结对编程是一次特别愉快的经历,我和张洁同学的时间安排上也比较一致,分工也非常明确,在编写过程中虽然会有一些意见不统一,但是还是愉快的解决了,最后在两个人的合作之下题目顺利地完成了。

posted @ 2018-04-15 11:28  仲夏今天也在写前端  阅读(388)  评论(0编辑  收藏  举报