1.作业地址及结对伙伴
- 博客作业要求地址:https://www.cnblogs.com/happyzm/p/9626779.html
- 结对伙伴:
- 姓名:贾海涛
- 学号:201621123027
- 博客地址:http://www.cnblogs.com/jiahaitao/p/9750427.html
- 码云团队项目地址:https://gitee.com/Fogram/PairProject-Java
- 码云提交记录:
- 讨论照片
3.结对PSP表格
PSP2.1 | 个人开发流程 | 预估耗费时间(分钟) | 实际耗费时间(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 75 |
· Estimate | 明确需求和其他相关因素,估计每个阶段的时间成本 | 60 | 75 |
Development | 开发 | 700 | 960 |
· Analysis | 需求分析 (包括学习新技术) | 100 | 120 |
· Design Spec | 生成设计文档 | 60 | 65 |
· Design Review | 设计复审 | 30 | 45 |
· Coding Standard | 代码规范 | 30 | 60 |
· Design | 具体设计 | 60 | 100 |
· Coding | 具体编码 | 300 | 420 |
· Code Review | 代码复审 | 60 | 80 |
· Test | 测试(自我测试,修改代码,提交修改) | 60 | 70 |
Reporting | 报告 | 100 | 140 |
· | 测试报告 | 45 | 60 |
· | 计算工作量 | 25 | 30 |
· | 并提出过程改进计划 | 30 | 50 |
3.解题思路
- 本次程序要求基本同上一次类似,但在上一次的基础上新增以下内容:输出排名前n的单词的数量;输入参数格式;对词组进行统计;根据参数将统计结果输出到文件;
- 输出排名前n的单词的数量:这一要求可以通过将参数中的该部分数值取出,加入for循环中即可,但需考虑不同单词数若低于这一指定值的情况。
- 输入参数格式:对于输入参数,分析过后发现无非就是一个指令后再跟着一个参数值,不同种指令之间有固定的模式,去除
WordCount.exe
后,正确的参数的长度只有4和6两种,指令只有“-n/-m/-i/-o”四种且都为“-n/-m”开头,出于实现便利的考虑,设置为“-n/-m”不同时出现,"-o"则自主决定是否跟在参数尾,分析过后这样对于参数的判断就比较简单了。 - 对词组进行统计:词组的获取方式利用将单词按指定个数筛选拼接为一个长字符串,再按类似处理单词的方法进行统计,难以实现的是若要判断以非空格符分割的前后单词不能拼接为词组,考虑可以将字符也存入数组,在拼接的时候进行字符判断决定是否拼接。
- 根据参数将统计结果输出到文件:前面第3点提到了“-o”自主决定是否跟在参数尾,若有该参数,则将统计结果写入文件,无该参数则不写。写入文件该部分也较为简单。
4.设计实现过程
- 后台Servlet在编写时,主要设计为
Main
类与FileDeal
两个类,Main
类主要涉及一部分参数的筛选,并决定执行调用FileDeal
类的什么方法。 FileDeal
类中包含了FileDeal()
构造方法,用于一部分参数的设定;FileNotExist()
向前端界面输出报错信息;getConnection()
建立与文件的连接;getChars()
获取字符总数;getLines()
获取行数;getWords()
获取单词数;getWordsSort()
统计单词出现次数并排序;getGroups()
统计词组出现次数并排序;wordstoString()
输出单词统计结果,并写入文件;groupstoString()
输出词组统计结果,并写入文件。- 本次实验是结对编程,且要求有GUI界面,因此分工时我负责Servlet的主要功能实现,编写完后交由贾海涛负责前端界面交互以及将servlet的Java代码修改为能输出与读取前端内容的代码,并对整合后的代码逻辑进行判断调整。完成后再协同进行数据测试,对整体逻辑再判断,减少一部分冗余代码,增强容错性。
5.代码说明及测试
1. 代码说明
1. JSP代码
- JSP界面简单设置了一个表单,用于输入参数。
2. go代码
- go代码部分即为编写代码时的Main函数,该部分重写
doGet()
方法,也包含了一部分筛选参数的语句,根据不同筛选结果将表单参数传递至后台交由Servlet的相应函数进行处理,。
3. FileDeal代码
getConnection()
方法实现与文件建立连接getWordsSort()
方法通过映射(Map)与比较器实现对文件中单词的统计及排序,结果返回一个包含键值对的数组infoIds
。wordstoString()
方法获取上一步获得的infoIds
数组,按照格式将结果输出反馈至前台,并根据是否给定“-o”参数决定是否将统计结果输出到文件中。getGroups()
处理词组的方法与其他的方法等基本与处理单词的类似,此处不再贴代码及阐述。
2. 单元测试
运行index.jsp时的输入界面
- 输入参数测试
含无法识别指令(-r为例):
-m 10 -r d:\1.txt
与-n 10 -r d:\1.txt
无可识别指令参数(-n/-m):
10 3 d:\1.txt
参数不完整(-o后缺失):
-n 10 -i d:\1.txt -o
与-m 3 -i d:\1.txt -o
参数数值小于0:
-n -2 -i d:\1.txt
与-m -3 -i d:\1.txt
指定文件不存在:
-n 10 -i d:\d.txt
一次传入多个指令(-n/-m):
-n 10 -m 3 -i d:\1.txt -o d:\output.txt
正确参数:
-n 10 -i d:\1.txt
与-m 3 -i d:\1.txt
与-n 10 -i d:\1.txt -o d:\output.txt
与-m 3 -i d:\1.txt -o d:\output.txt
。(注:由于单词判断条件为前四个为字母,所以当选定词组长度为1时,输出的结果与单词统计结果不一致)
文件数据测试
英文文件
纯中文文件
空白文件
3. 回归测试
- 注:单元测试数据已经使用了上一次的测试用例并在此基础上增加了其他的测试用例,所以回归测试结果已在单元测试中。
4. 覆盖率测试
参数为
-n 10 -i d:\1.txt -o d:\output.txt
,正常执行并输出到文件时。参数为
-m 3 -i d:\1.txt -o d:\output.txt
,正常执行并输出到文件时。参数为
10 3 d:\1.txt
,错误参数不通过时。
6.结对感受
1. 本次结对感觉优劣并存
- 优点
- 工作量:结对有一定的分工,明确各自的任务后,工作量会少很多,比一个人写全部要轻松一些。
- 代码规范:结对编程时可以一定程度上改善自己对于代码规范的问题,虽然可能最终也并不是很规范。
- 问题分析:"一千个读者就有一千个哈姆雷特"。对待同一个问题,不同的人有不同的见解,结对编程分析问题时,就会有不同的考虑问题解决问题的方式,就不像单人那样过于闭塞,有多个不同的解决方案的时候就有选择的余地,队友也可以从其他的角度指出自己的方案是否存在不足。遇到自己解决不了的问题时,可能队友就是一盏明灯。
- 缺点
- 代码规范:队友之间的编程习惯不同,阅读上有时会有一定难度,不理解的话就不好下手写自己的部分。
- 问题分析:分析问题各执己见时,容易陷入两难境地。