WordCount优化
(1) Github地址: https://github.com/LongtermPartner/ExtendWordCount
(2) PSP表格:
PSP2.1 |
PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
Planning |
计划 |
5 | 5 |
· Estimate |
· 估计这个任务需要多少时间 |
5 | 5 |
Development |
开发 |
330 | 370 |
· Analysis |
· 需求分析 (包括学习新技术) |
30 | 40 |
· Design Spec |
· 生成设计文档 |
10 | 10 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
10 | 10 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
30 | 30 |
· Design |
· 具体设计 |
20 | 30 |
· Coding |
· 具体编码 |
180 | 200 |
· Code Review |
· 代码复审 |
20 | 20 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
30 | 30 |
Reporting |
报告 |
50 | 30 |
· Test Report |
· 测试报告 |
20 | 20 |
· Size Measurement |
· 计算工作量 |
10 | 0 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
20 | 10 |
合计 |
385 |
405 |
(3) 对接口的实现:
我们小组搭建的框架是:将整个程序分为四个模块:Input,Output,CountAndSort,Main,由相应组员完成对应负责的模块。考虑到模块间的耦合性,为了便于各个模块间的单元测试,主函数只有三行关键代码,即输入模块调用,返回值文件传给主模块计数并排序模块,主功能模块将处理好的单词排序封装成由Map<String,Integer>集合组成的Arraylist数组,并传给输出模块,由输出模块写入到输出文本。输出模块只输出前100个高频度单词,100以后不输出。
我负责的是输入模块。该模块对输入进行有效性校验,识别和处理无效输入,并针对有效输入,从中提取所需数据。我的思路是先对输入参数的个数进行判断,再判断文件的后缀名。花费时间较多的部分是根据文件内容对文件进行初步筛选。刚开始我的想法是把文件分成字符串读取,然后用正则表达式判断文件内容是否符合要求。后来发现没办法把符号加进去,就把文件分成字符读取,然后用if语句判断。但是这样if语句太长了,而且不知道效率如何。之后在网上发现了一种很好的办法,先定义一个字符串,内容就是所有符合要求的字符,然后对每个输入的字符,判断字符串是否包含它,如果不包含就抛出输入异常。虽然最后没有用到
具体函数如下:
import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FilenameFilter; import java.io.IOException; import javax.swing.JFileChooser; import javax.swing.JOptionPane; //输入功能 对文件名是否存在判断,并将文件传给计数排序模块函数 public class Input { //输入情况有一个参数或为0个和多个参数情况 public static File input(String[] args) { File inputFile=null; String filePath = null; String fileP = null; String fileName=null; //一个参数 -x和文件名filename两种情况 if (args.length == 1) { if(args[0].equals("-x")){ //图形界面选择文件 JFileChooser jfc=new JFileChooser(); jfc.setDialogTitle("请选择一个文件"); jfc.showOpenDialog(null); jfc.setVisible(true); //得到用户选择的文件路径 if(jfc.getSelectedFile()!=null){ fileName=jfc.getSelectedFile().getAbsolutePath(); inputFile=new File(fileName); return inputFile; } else{ JOptionPane.showMessageDialog(null, "请选择文件"," ", JOptionPane.INFORMATION_MESSAGE); System.exit(0); } } else{ filePath = args[0]; File file = new File(filePath); fileName = file.getName(); String suffix = fileName.substring(fileName.lastIndexOf(".") + 1); if (suffix.equals("txt")) { fileP = filePath; } else { JOptionPane.showMessageDialog(null, "文件名格式不对(仅支持txt格式)"," ", JOptionPane.INFORMATION_MESSAGE); System.exit(0); throw new IllegalArgumentException(); } inputFile = new File(fileName); } } //其他非一个参数情况 0个和多个参数非法输入 弹出输入格式错误对话框 else{ JOptionPane.showMessageDialog(null, "输入格式有误(仅支持一个输入参数)", " ", JOptionPane.INFORMATION_MESSAGE); System.exit(0); } return inputFile; } }
(4)测试用例的设计:
测试主要从输入文件的类型、是否使用图形界面、不同功能的使用等角度进行。
(5)单元测试的运行截图:
(6)小组贡献分:0.21
扩展部分:
(1)邹欣老师博客:现代软件工程讲义 代码规范与代码复审
http://www.cnblogs.com/xinz/archive/2011/11/20/2255971.html
(2)使用该规范分析了学号后5位为17068的代码
问题:有的变量命名不够规范,注释太少
优点:代码简洁,结构清晰
(3)静态代码检查工具:
我们小组选择的静态代码检查工具为:PMD
工具下载地址: http://pmd.sourceforge.net/eclipse/
(4)结果截图:
问题如下:
1.数据流异常分析
2.变量名字太短,如fW, bw。
3.可定义为final的变量没有定义为final
4.在if...else...语句中没有合理使用大括号。
5.在方法体内对方法参数重新赋值
6.无意义的引用。
改进如下:
1.将fW, bw定义为final类型
2.将变量名称具体化
3.在if...else...语句中合理使用大括号
4.避免在方法体内对方法参数重新赋值,可以将方法参数的值赋给另一个局部变量
5.去掉无意义的引用
(5)小组中代码存在的问题主要是变量命名、定义和对大括号的使用不够规范
高级部分:
(1)测试数据集的设计思路为选取文本内容较多的txt文件。本人具体选择的是某英文小说的三个章节,共4897个字。
(2)处理时长:
经过多次测试,处理此测试数据集的时间在65ms~75ms左右。
(3)每位小组成员都作为作者、讲解员、评审员、记录员等身份进行了评审。
经过评审,我们得出结论:影响程序性能的主要因素是计数和排序模块的算法,为计数时对单词的判定方法以及排序算法的快慢。
(4)通过测试,我们发现制约程序性能指标的主要因素是计数和排序两方面,和同行评审结果相似。
(5)在本次作业中,软件开发是第一阶段,二三阶段均是通过测试来优化程序,提升质量。软件测试可以发现程序中存在的问题和缺陷,需要贯穿整个过程。通过使用各种测试方法进行测试和优化可以有效完善程序,从而提高程序质量。