基本功能
一、github项目地址:https://github.com/aier02/wordcount_advanced(个人负责的模块)
https://github.com/DouglasLee001/wordcountPRO(小组项目地址)
二、PSP表格
PSP2.1 |
PSP阶段 |
预计耗时 (分钟) |
实际耗时 (分钟) |
Planning |
计划 |
10 |
15 |
· Estimate |
· 估计这个任务需要多少时间 |
10 |
15 |
Development |
开发 |
390 |
490 |
· Analysis |
· 需求分析 (包括学习新技术) |
30 |
20 |
· Design Spec |
· 生成设计文档 |
20 |
30 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
30 |
40 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
40 |
10 |
· Design |
· 具体设计 |
20 |
60 |
· Coding |
· 具体编码 |
120 |
100 |
· Code Review |
· 代码复审 |
30 |
30 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
100 |
180 |
Reporting |
报告 |
90 |
100 |
· Test Report |
· 测试报告 |
45 |
30 |
· Size Measurement |
· 计算工作量 |
15 |
10 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 |
60 |
|
合计 |
490 |
605 |
三、模块的接口实现说明
1)word类:
(1)保存识别的单词和词频,分别记录在字符串word和整型num,并且提供词频加一和转换小写字母的函数
1 public word(String theWord) 2 { 3 this.num=1; 4 this.word=theWord; 5 }
(2)add()每调用一次num+1,即词频加一
public void add(){ this.num++; }
(3)change()将所有单词转为小写
public void change(){ this.word=this.word.toLowerCase(); }
2)readFileByLines类:提供fileString方法,返回一个字符串数组,每个元素为所读取的txt文件中的一行,具体实现为利用BufferedReader读取文件直到遇到null,使用readLine方法将得到的字符串保存到动态字符串数组lineArray中,关键实现如下:
public ArrayListfileString(){ File file = new File(fileName); ArrayList lineArray = new ArrayList (); BufferedReader reader =null;{ try { reader = new BufferedReader(new FileReader(file)); String tempString = null; // 一次读入一行,直到读入null为文件结束 while ((tempString = reader.readLine()) != null) { lineArray.add(tempString); } reader.close(); }
3)count类:实现countWord(),识别文件中的单词并且统计词频(无排序功能),使用正则表达式"([a-zA-Z]+(-[a-zA-Z]+)*)"匹配需求中要求的单词,[a-zA-Z]+用于识别开头为大小写字母的字符串,而-[a-zA-Z]+则用于匹配短横线后至少接一个大小写字母的子字符串,(-[a-zA-Z]+)*用于识别0个或者1个短横线接大小写字母的字符串;创建一个word对象的动态数组,按行读取文件后,每次匹配到一个单词,则和动态数组中已有的单词的属性word进行对照,不同则创建该单词对象,即word为该单词字符串,num为1的word对象,并添加到数组末尾;相同,则调用该单词对象的add()方法,实现词频加一。
readFileByLines readFile= new readFileByLines(this.file); //按行读取指定文件 ArrayListlineArray = new ArrayList (); ArrayList wordArray = new ArrayList (); lineArray=readFile.fileString(); String pattern="([a-zA-Z]+(-[a-zA-Z]+)*)"; Pattern r = Pattern.compile(pattern); for(int i =0;i ){ Matcher m = r.matcher(lineArray.get(i)); while(m.find()){ word cur=new word(m.group(1)); //System.out.println(wordArray.size()); int flag=0; for(int j=0;j ){ if(wordArray.get(j).word.equals(cur.word)){ wordArray.get(j).add(); flag++; //sSystem.out.println("nihao"); break; } } if(flag==0){ cur.change(); wordArray.add(cur); } } } setWordArray(wordArray); }
四、测试用例的设计
1)测试方法的考虑:对于我自己负责模块中的3个类,根据各个类的复杂程度,分别考虑黑盒测试和白盒测试,明显地,对于word类这种实现了简单的对象创建和属性修改的类,更倾向于使用黑盒测试中的等价类测试,简单地测试了里面的方法。对于readFlieByLines类,由于存在条件判断,故使用了判定覆盖,测试读取文件的正确性;另外对于文件内容的获取,则使用了黑盒测试的边界值测试,测试对于文件内容为空值的情况;对于count类,关键在于单词的识别和词频的统计,由于采用了正则表达式和循环中的判断,使用白盒测试的判定测试,测试countWord方法对于不同情况下根据flag值不同而走的不同路径。
2)测试效率的考虑:使用junit框架能够实现快速有效地进行针对性的测试,通过与自己的预期结构进行对比,查漏补缺。
3)测试用例表,具体测试代码详见github中的test文件夹
五、Junit 测试截图
1)wordTest:使用asserEquals判断是否符合预期,由于较为简单,质量中等。
2)readFileByLinesTest:分别进行等价类测试,对于读取的非txt文件,没有反馈,但考虑到会在输入控制中检验输入的文件格式为txt,该模块功能尚且完整。
3)countTest:符合设计预期,设计的用例都通过了,暂时还算可以吧?
六、小组贡献分:0.25
扩展功能
一、代码规范参照地址:http://www.cnblogs.com/xinz/archive/2011/11/20/2255971.html(邹欣老师的博客)
1)选择其中的“代码风格规范”,包括了缩进,行宽,括号,断行和空白的{}行,分行,命名,下划线问题,大小写问题,注释。
2)个人理解:“代码风格规范”目的是提高代码的可读性,特别是在分工合作的项目中,统一代码风格有助于提高后期系统集成的效率和安全性。缩进和行宽更多地是让代码整体看上去更加的流畅和清晰;命名规范是使得每个命名有实际的意义,让人一眼就能知道其中的含义,譬如作为单词对象的word,存储word对象的数组wordArray,用于统计的countWord方法等;大小写问题使得每个命名的意义更加具体,易于分别其类型,是类,还是普通变量,对于类,常用每个单独的单词首字母大写,其余小写,而普通变量则第一个单词首字母小写,其后的单词首字母大写,比如读文件的类ReadFileByLines,统计方法countWord。
二、对组员代码的主观评价
我选择了同组的李桐岩(17013)同学所负责的输出控制模块的代码,部分如下:
1 //输出结果文件 2 public static void writeFile(String content){ 3 BufferedWriter bw = null; 4 try { 5 File file = new File("result.txt");//将要输出的文件所在地址 6 if (!file.exists()) { 7 file.createNewFile(); 8 } 9 FileWriter fw = new FileWriter(file.getAbsoluteFile()); 10 bw = new BufferedWriter(fw); 11 bw.write(content); 12 bw.close(); 13 } catch (IOException e) { 14 e.printStackTrace(); 15 } 16 }
问题:
1)括号{}没有对齐。
2)注释没有写到被注释对象的上一行。
3)try和catch没有对齐。
优点:
1)符合命名规范,意义明确。
2)符合大小写问题的规范,清晰明了。
三、静态代码检查工具选择了:阿里巴巴Java开发代码检测IDE插件,参考安装网址:https://www.cnblogs.com/ysgcs/p/7675977.html
四、静态代码检查过程
1)界面截图:
2)代码存在的问题都为一些风格规范问题,对应的具体和解决方法分别是
(1)类的命名第一个单词字母没有大写:将每个类的首字母改为大写
(2)类中没有添加@author信息:修改方法参照https://blog.csdn.net/ln865709215/article/details/53112789
(3)方法内部的注释规范问题:注释得写在被注释对象的上一行
(4)类的属性的注释规范问题:需要在被注释的属性后面(即尾注释)采用/**内容*/的格式。
五、整个小组代码存在的问题
主要还是代码风格不够规范,对于@author此类的注解信息,因为一开始没有这种习惯,导致后来手动添加比较麻烦;最为严重的是类名的首字母没有大写,其他常见问题与我自己的代码相似,不在一一列举。