第四周小组作业:WordCount优化

基本功能

一、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 ArrayList fileString(){
    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);
            //按行读取指定文件
            ArrayList  lineArray = 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文件夹

第四周小组作业:WordCount优化_第1张图片

五、Junit 测试截图

  1)wordTest:使用asserEquals判断是否符合预期,由于较为简单,质量中等。

第四周小组作业:WordCount优化_第2张图片

 

   2)readFileByLinesTest:分别进行等价类测试,对于读取的非txt文件,没有反馈,但考虑到会在输入控制中检验输入的文件格式为txt,该模块功能尚且完整。

第四周小组作业:WordCount优化_第3张图片

  3)countTest:符合设计预期,设计的用例都通过了,暂时还算可以吧?

第四周小组作业:WordCount优化_第4张图片

六、小组贡献分: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)界面截图:

第四周小组作业:WordCount优化_第5张图片

  2)代码存在的问题都为一些风格规范问题,对应的具体和解决方法分别是

    (1)类的命名第一个单词字母没有大写:将每个类的首字母改为大写

    (2)类中没有添加@author信息:修改方法参照https://blog.csdn.net/ln865709215/article/details/53112789

    (3)方法内部的注释规范问题:注释得写在被注释对象的上一行

    (4)类的属性的注释规范问题:需要在被注释的属性后面(即尾注释)采用/**内容*/的格式。

 五、整个小组代码存在的问题

  主要还是代码风格不够规范,对于@author此类的注解信息,因为一开始没有这种习惯,导致后来手动添加比较麻烦;最为严重的是类名的首字母没有大写,其他常见问题与我自己的代码相似,不在一一列举。

你可能感兴趣的:(第四周小组作业:WordCount优化)