WordCount优化
小组github 地址
https://github.com/whoNamedCody
小组成员:17048冷福星 17050李慎纲 17039付佳韵 17040康之是
PSP表格
PSP2.1 | PSP阶段 | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 20 |
Estimate | 估计任务需要多少时间 | 30 | 20 |
Development | 开发 | 240 | 250 |
Analysis | 需求分析 | 20 | 20 |
Design Spec | 生成设计文档 | 20 | 10 |
Design Review | 设计复审 | 20 | 10 |
Coding Standard | 代码规范 | 20 | 10 |
Design | 具体设计 | 30 | 30 |
Coding | 具体编码 | 60 | 80 |
Code Review | 代码复审 | 20 | 30 |
Test | 测试 | 50 | 60 |
Reporting | 报告 | 70 | 100 |
Test Report | 测试报告 | 30 | 60 |
Size Measurement | 计算工作量 | 20 | 20 |
Postmortem | 总结 | 20 | 20 |
合计 | 340 | 370 |
接口设计
输入模块:
class WCinput
{
public String input(String[] args)
核心模块:
ArrayList<WordInfo> handle(String handleString){
ArrayList<WordInfo> result=new ArrayList<WordInfo>();
输出模块:public class wcoutput
接口实现
输入模块:
package wcpro; import java.io.File; class WCinput { public String input(String[] args) { String inputFile=null; if (args.length == 0) { System.out.println("您调用WCpro.exe时没有指定任何参数,请输入待分析文件名"); System.exit(0); } else if (args.length > 1) { System.out.println("您调用WCpro.exe时指定输入文件过多,请输入一个待分析文件名"); System.exit(0); } else if(args[0].endsWith(".txt")) { inputFile=args[0]; File file=new File(inputFile); if(!file.exists()) { System.out.println("待分析文件"+inputFile+"不存在"); System.exit(0); } } else { System.out.println("请输入.txt文件作为待分析文件"); System.exit(0); } return inputFile; }
核心代码实现:
ArrayList<WordInfo> handle(String handleString){ ArrayList<WordInfo> result=new ArrayList<WordInfo>(); Pattern pattern=Pattern.compile("[a-zA-Z]+\\-?[a-zA-Z]*"); Matcher matcher=pattern.matcher(handleString); while(matcher.find()){ String word=matcher.group().toLowerCase(); if(word.lastIndexOf("-")==(word.length()-1)) word=word.substring(0, word.length()-1); WordInfo wordInfo=new WordInfo(word); int index=result.indexOf(wordInfo); if(index==-1) result.add(wordInfo); else result.get(index).count(); } Collections.sort(result); return result; }
输出代码实现:
package output; import java.io.*; public class wcoutput { public static void output(String[] word,int[] wordFreq) { String Uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; String lowercase = "abcdefghijklmnopqrstuvwxyz"; char arr[]= new char[100]; String newword = "";//更新大小写后的单词 int out; int ascll; int length;int serial=0; try { //向默认文件"result.txt"中输出信息 FileOutputStream fs =new FileOutputStream(new File("result.txt")); PrintStream p =new PrintStream(fs); //输出数组元素个数大于100时只输出前100个 if(wordFreq.length>100) out=100; //否则按实际个数输出 else out = wordFreq.length; for(int i=0;i<out;i++) { newword = ""; for(int j=0;j<word[i].length();j++) { ascll=word[i].charAt(j);//把字符转换成对于的Ascll码 //如果是大写转换成小写 if(Uppercase.indexOf(ascll)!=-1) { arr[j]=lowercase.charAt(Uppercase.indexOf(ascll)); newword +=arr[j]; } //如果是小写或其它字符则保持不变 else { arr[j]=word[i].charAt(j); newword +=arr[j]; } }
测试设计
保证设计的测试用例应至少覆盖函数中所有的可执行语句,同时主要针对特殊字符
、数字
、连字符
、大小写字母等
的出现设计测试用例。由于模块功能较为单一,主要使用黑盒测试。
测试运行及评价
测试结果:
高级功能实现
(1)测试数据集设计思路:a.有140个以上需要根据词频排序的单词
b.每种类型的单词出现20个以上:纯单词如software;连字符单词如content-based;单引号单词如Let’s;带短横线的单词如moon-;带双引号的单词如“aaa;带数字、 常用字符和单词的情况如(see Box 3–2).8885d_c01_016;带数字的单词如bbb-2;
c.5个以上统一单词的大小写形式,如apple和APPLE
d.5个以上词频相同的不同单词排序,如:apple 5 camera 5 demo 5 yellow 5 zero 5
(2)优化前:
同时我做了单元测试的优化时间,显示时间的高级功能,代码参考组长github里的word的java文件。
具体代码如下:
时间显示:
优化后:
改用正则词法进行单词判断,并且先进行了大小写的转换。
结论:单元测试效果较好,通过了所有测试,被测模块质量水平较高。
拓展功能实现
我们小组统一选用FindBugs,具体教程是谷歌搜索教程。
具体做法:在需要查找bug的java文件、包或项目上点击右键,选择Find Bugs。并在Bug Explorer 中查看bug
开发规范说明
代码规范与复审(精简版)现代软件工程讲义 3 代码规范与代码复审
选择部分:代码风格规范,代码设计规范中的函数和错误处理
交叉代码评审
使用该规范分析[学号17048]提交的代码,分析其所有的函数命名,变量命名,结论为其代码完全符合所选取的开发规范,其命名均具有良好的可读性。
对项目中各模块的静态分析见(3)
不足之处:代码中定义了两个没有无用变量;对{}的使用没有另起一行,使得结构清晰标准;
好的规范:写了详尽的注释,并且注释为英文,格式统一,长注释在前一行开头,变量短注释在定义后;
变量命名遵循规范,具有一定的实际意义,便于区分;
变量统一在方法前集中声明,说明变量含义;
函数方法设计分工合理;
对可预料的各种错误输入和异常情况进行处理;
组内代码分析
组内提交的代码大多有良好的代码规范,但是模块划分不够细致,而且整体注释较少,所使用的数据结构也不够高效。
同时很多注释位置没有按规范来,并没有使用英文注释。
findbugs检查输入模块(input)没有发现问题;
代码规范上不足之处:{}的使用与小组其他成员不统一;注释没有使用英文注释,平台移植时可能出现问题;缺乏统一的变量说明注释
规范之处:变量命名遵循规范,有实际意义;对各种错误输入有所处理,容错性提高;函数方法设计合理。
同行评审及性能分析
参加者:小组成员:康之是,冷福星,李慎纲,付佳韵
主持,记录:康之是
评审者:李慎纲,付佳韵
开发者,代码讲解:冷福星
评审对象:核心模块(kernel)
评审过程:开发者讲解代码逻辑,函数功能等;
开发者运行程序,测试压力txt文件,反复多次,得到平均运行时间;
评审者提出意见,开发者回答;
达成共识,进行改进
提出意见:核心功能中先进行大小写转换再进行判断,并且更改对单词的判断方法函数,采用正则表达式进行词法分析。
作业小结
软件开发过程中软件测试是不可缺少的一部分,同时软件测试也是软件质量的重要保证。
我在小组里主要做的是其他模块,包括main函数,整合组内各个模块,使之生成完整的代码,完成了单元测试的高级功能,设计了测试用例,统计了时长,做了优化。
同时小组成员在实现基础功能前提下,每个人分别做了各个模块的拓展功能,并三个以上的人实现了显示时间,优化代码的高级功能。
posted on 2018-04-02 11:40 kangzhishi 阅读(267) 评论(1) 编辑 收藏 举报