结对作业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语言毕竟已经接触了三年,只能找到一些明显的小错误。张洁同学的代码结构严谨,思路清晰,注释明确,没有冗余定义和没用的语句,跟他搭档我可以学到很多。
经历了大约一周时间的结对编程,我感觉这种编程形式对代码的改良和代码编写效率有很大的提升。在编程的过程中,我们两个可以互相学习,以前可能一个人想不出的解决方案,现在两个人一起想说不定问题就会迎刃而解,大大提高了编写代码的效率。在本次作业进行测试的过程中,张洁同学也对我进行了指导,我因此成功的完成了对代码的测试,他也会在编写过程中听取我的意见,不会只坚持自己的想法。
总体来说这次结对编程是一次特别愉快的经历,我和张洁同学的时间安排上也比较一致,分工也非常明确,在编写过程中虽然会有一些意见不统一,但是还是愉快的解决了,最后在两个人的合作之下题目顺利地完成了。
-
-
- Java代码审查表
- 现有一新建办公大厦,共有21层,共有四部电梯,所有电梯基本参数如下表所示,其使用规定如下: