软件工程第二次结对编程
1.题目要求:
- (1)我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:
- (2)能够自动生成四则运算练习题
- (3)可以定制题目数量
- (4)用户可以选择运算符
- (5)用户设置最大数(如十以内、百以内等)
- (6)用户选择是否有括号、是否有小数
- (7)用户选择输出方式(如输出到文件、打印机等)
- (8)最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)
2.角色分工
本次结对作业我和我的同伴的分工情况是:
- 驾驶员:王新哲
- 领航员:刘春慧
3.源代码地址
4.代码审查表
重要性 | 激活 | 级别 | 检查项 |
Y | 20 | 命名规则是否与所采用的规范保持一致? | |
重要 | 50 | has/can/is前缀的函数是否返回布尔型? | |
注释 | |||
重要 | Y | 10 | 注释是否较清晰且必要? |
重要 | Y | 10 | 复杂的分支流程是否已经被注释? |
10 | 距离较远的}是否已经被注释? | ||
10 | 非通用变量是否全部被注释? | ||
重要 | Y | 50 | 函数是否已经有文档注释?(功能、输入、返回及其他可选) |
Y | 10 | 特殊用法是否被注释? | |
声明、空白、缩进 | |||
20 | 每行是否只声明了一个变量?(特别是那些可能出错的类型) | ||
重要 | Y | 40 | 变量是否已经在定义的同时初始化? |
重要 | Y | 40 | 类属性是否都执行了初始化? |
20 | 代码段落是否被合适地以空行分隔? | ||
20 | 是否合理地使用了空格使程序更清晰? | ||
Y | 20 | 代码行长度是否在要求之内? | |
20 | 折行是否恰当? | ||
语句/功能分布/规模 | |||
20 | 包含复合语句的{}是否成对出现并符合规范? | ||
20 | 是否给单个的循环、条件语句也加了{}? | ||
20 | if/if-else/if-else if-else/do-while/switch-case语句的格式是否符合规范? | ||
Y | 40 | 单个变量是否只做单个用途? | |
重要 | Y | 20 | 单行是否只有单个功能?(不要使用;进行多行合并) |
重要 | Y | 40 | 单个函数是否执行了单个功能并与其命名相符? |
20 | 操作符++和— —操作符的应用是否复合规范? | ||
规模 | |||
重要 | Y | 20 | 单个函数不超过规定行数? |
重要 | 100 | 缩进层数是否不超过规定? | |
重要 | 100 | 是否已经消除了所有警告? | |
重要 | 40 | 常数变量是否声明为final? | |
重要 | 80 | 对象使用前是否进行了检查? | |
重要 | 80 | 局部对象变量使用后是否被复位为NULL? | |
重要 | Y | 70 | 对数组的访问是否是安全的?(合法的index取值为[0, MAX_SIZE-1])。 |
重要 | Y | 20 | 是否确认没有同名变量局部重复定义问题? |
Y | 20 | 程序中是否只使用了简单的表达式? | |
重要 | 20 | 是否已经用()使操作符优先级明确化? | |
重要 | 20 | 所有判断是否都使用了(常量==变量)的形式? | |
80 | 是否消除了流程悬挂? | ||
重要 | 80 | 是否每个if-else if-else语句都有最后一个else以确保处理了全集? | |
重要 | 80 | 是否每个switch-case语句都有最后一个default以确保处理了全集? | |
Y | 80 | for循环是否都使用了包含下限不包含上限的形式?(k=0; k | |
重要 | Y | 40 | XML标记书写是否完整,字符串的拼写是否正确? |
40 | 对于流操作代码的异常捕获是否有finally操作以关闭流对象? | ||
20 | 退出代码段时是否对临时对象做了释放处理? | ||
重要 | 40 | 对浮点数值的相等判断是否是恰当的?(严禁使用==直接判断) | |
可靠性(函数) | |||
重要 | 60 | 入口对象是否都被进行了判断不为空? | |
重要 | 60 | 入口数据的合法范围是否都被进行了判断?(尤其是数组) | |
重要 | 20 | 是否对有异常抛出的方法都执行了try...catch保护? | |
重要 | 80 | 是否函数的所有分支都有返回值? | |
重要 | 50 | int的返回值是否合理?(负值为失败,非负值成功) | |
20 | 对于反复进行了int返回值判断是否定义了函数来处理? | ||
Y | 60 | 关键代码是否做了捕获异常处理? | |
重要 | 60 | 是否确保函数返回CORBA对象的任何一个属性都不能为null? | |
重要 | 60 | 是否对方法返回值对象做了null检查,该返回值定义时是否被初始化? | |
重要 | 60 | 是否对同步对象的遍历访问做了代码同步? | |
重要 | 80 | 是否确认在对Map对象使用迭代遍历过程中没有做增减元素操作? | |
重要 | 60 | 线程处理函数循环内部是否有异常捕获处理,防止线程抛出异常而退出? | |
20 | 原子操作代码异常中断,使用的相关外部变量是否恢复先前状态? | ||
重要 | 100 | 函数对错误的处理是恰当的? | |
可维护性 | |||
重要 | 100 | 实现代码中是否消除了直接常量?(用于计数起点的简单常数例外) | |
Y | 20 | 是否消除了导致结构模糊的连续赋值?(如a= (b=d+c )) | |
20 | 是否每个return前都要有日志记录? | ||
20 | 是否有冗余判断语句?(如:if (b) return true; else return false;) | ||
Y | 20 | 是否把方法中的重复代码抽象成私有函数? |
5.项目结构图及运行结果截图
整个程序分为两大部分:第一是生成题目,生成表达式及答案后写入当前目录下的文件,第二是判断答案是否正确,读取文件后判断,再将结果写入当前目录下的文件。
程序流程图如下:
运行结果截图如下:
6.小结:
在这次结对编程的过程中,我学到了很多东西,java之前有看过一点,但并没有练习过,也正是由于软件工程这门课程是我重新学起了java。在这次作业的开始,本来我和同伴是的决定是说由我来编程,但怎么说呢,由于java基础太差,查完资料后有了大致的整体思路,知道关键在于如何使用逆波兰式来决定运算的先后顺序和怎么确保 随机出的题目不能重复,自己尝试着编写代码,但失败了,只能从网上查些资料,看了一些代码,但无奈的是java的知识欠缺的太多,很多程序里涉及的java知识面很广,比如java的awing组件的界面设计,键盘监听部分等等,还有很多其他关于对java内部类的使用,对字符串的操作等等,很多都是我没用过的,尤其是java的GUI界面的布局,更是没有了解过,我只能去补java知识。所以我们只能换过来由我的同伴进行编程,毕竟她对java语言比我熟悉得多。在这次结对编程的过程中,我也从我同伴那学到了很多东西,她的代码风格整体很规范,思路很清晰,程序中每个函数代码块的功能都清楚明了,虽然程序中遇到了很多问题,但是我们也都解决了,后来也想尝试着编写个GUI界面的,但是没办法,我们两都不会,现学现卖也没写不出来就放弃了。
总之,通过这次结对编程,一方面使我学到了很多java的知识,也更加深刻地体会到了老师在课上所讲的代码规范的重要性,结对编程的好处;另一方面,也知道了自己知识方面的匮乏,跟别人差距之大,实在是有太多的东西需要学习,需要练习了,从前编程都只是在小黑框里输出,从来不考虑程序可能存在的风险,只考虑程序在正常情况下的运行,也不会想程序的结构合不合理,能否优化,只要输出正确结果就认为了对了,没有任何的实用性。现在看了很多别人的博客,感触颇多,确实是与别人差距很大,还有就是别人的程序有的一眼看上去就能感觉到结构非常清晰明了,各个块的功能一目了然。所以自己真的是有太多的东西需要学习,还有很长的路要走。