第一次个人编程作业

这个作业属于哪个课程班级链接
这个作业要求在哪里 作业链接
这个作业的目标 论文查重算法设计+学习PSP表格+单元测试+JProfiler性能分析+Git管理

1.github链接

https://github.com/Rushmmmc/mcCheck

image-20210918204914619

image-20210920150111354

2.PSP表格

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning 计划 10 10
· Estimate · 估计这个任务需要多少时间 15 15
Development 开发 240 240
· Analysis · 需求分析 (包括学习新技术) 250 200
· Design Spec · 生成设计文档 20 30
· Design Review · 设计复审 20 30
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 20 30
· Design · 具体设计 20 60
· Coding · 具体编码 60 60
· Code Review · 代码复审 20 20
· Test · 测试(自我测试,修改代码,提交修改) 20 40
Reporting 报告 60 80
· Test Repor · 测试报告 20 30
· Size Measurement · 计算工作量 20 20
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 20 30
  · 合计 795 895

3.计算模块接口的设计与实现过程

主要的类

image-20210918205854842

功能

Article:读入文本文件、把文本中存在的二字词的哈希值计算并存储在treeset中,利用哈希值判断是否重复来计算重复率

ErrorException:一旦发生异常抛出的异常

Utils:用来关闭资源(BufferedReader/InputStreamReader/FileInputStream)的工具类

关键函数

Article构造函数:读入文本文件、把文本中存在的二字词的哈希值计算并存储在treeset中

compare(Article origin,Article target):利用两个Article对象生成的哈希值treeset进行计算相同的词个数

getRate(String originPath,String targetPath):调用Article构造函数、compare()两个函数,之后通过compare的返回值还有两个Article对象中的较小的treeset容量来计算查重率

查重思路设计

一位真正的作家永远只为内心写作 可以把它看作含有词汇:一位、位真、真正.... 写作这些词,然后计算这些词的哈希值并放入treeset中比较重复程度

细节

  • treeset需要判空再取first()

  • 判断两个treeset的首节点是否相同,如果相同则两者皆去掉首节点然后都重新获得首节点,即缩小treeset范围并往后遍历。如果两者不相同,则哈希值较小者往后走

  • 捕捉异常并进行合适的处理

  • 利用DecimalFormat类控制返回保留两位小数的结果

独到之处

不需要导入外部的自然语言处理库

4.计算模块接口部分的性能改进

类的占用情况

image-20210918182937644

CPU Load

image-20210918183636241

堆内存情况

image-20210918183612802

耗时

image-20210918185734366

5.计算模块部分单元测试展示

import org.junit.jupiter.api.Test;

/**
* api/
*
* @author :Rush
* @date : 2021/9/18 19:10
*/
class ArticleTest {

   /**
    * 功能描述: 普通情况 两个文件都正常
    * @author Rush
    * @date 2021/9/18 19:56
    */
   @Test
   void normal() {
       double rate = Article.getRate("example/orig.txt",
               "example/orig_0.8_add.txt");
       Article.output("res/res.txt",rate);
  }

   /**
    * 功能描述: 源文件为空
    * @author Rush
    * @date 2021/9/18 19:57
    */
   @Test
   void SourceEmpty(){
       double rate = Article.getRate("example/empty.txt",
               "example/orig_0.8_add.txt");
       Article.output("res/res.txt",rate);
  }

   /**
    * 功能描述: 被查文件为空
    * @author Rush
    * @date 2021/9/18 19:57
    */
   @Test
   void targetEmpty(){
       double rate = Article.getRate("example/orig.txt",
               "example/empty.txt");
       Article.output("res/res.txt",rate);
  }

   @Test
   void del(){
       double rate = Article.getRate("example/orig.txt",
               "example/orig_0.8_del.txt");
       Article.output("res/res.txt",rate);
  }

   @Test
   void dis_1(){
       double rate = Article.getRate("example/orig.txt",
               "example/orig_0.8_dis_1.txt");
       Article.output("res/res.txt",rate);
  }

   @Test
   void dis_10(){
       double rate = Article.getRate("example/orig.txt",
               "example/orig_0.8_dis_10.txt");
       Article.output("res/res.txt",rate);
  }

   @Test
   void dis_15(){
       double rate = Article.getRate("example/orig.txt",
               "example/orig_0.8_dis_15.txt");
       Article.output("res/res.txt",rate);
  }

   @Test
   void inputError(){
       //输入的库不存在
       double rate = Article.getRate("example/origabcde.txt",
               "example/orig_0.8_dis_15.txt");
       Article.output("res/res.txt",rate);
  }

   @Test
   void outputError(){
       //输出的路径不存在
       double rate = Article.getRate("example/orig.txt",
               "example/orig_0.8_dis_15.txt");
       Article.output("....../res/resa.txt",rate);
  }

   @Test
   void inputOutputError(){
       //输入输出的路径都不存在
       double rate = Article.getRate("example/aorig.txt",
               "example/orig_0.8_dis_15.txt");
       Article.output("....../res/resa.txt",rate);
  }
}

测试结果

image-20210918211626485

image-20210918211657227

image-20210918211708105

代码覆盖率

 

image-20210918195405642

image-20210918195619233

 

6.计算模块部分异常处理说明

输入文件不存在

    @Test
   void inputError(){
       //输入的库不存在
       double rate = Article.getRate("example/origabcde.txt",
               "example/orig_0.8_dis_15.txt");
       Article.output("res/res.txt",rate);
  }

image-20210918212020485

输出的路径文件夹不存在

    @Test
   void outputError(){
       //输出的路径不存在
       double rate = Article.getRate("example/orig.txt",
               "example/orig_0.8_dis_15.txt");
       Article.output("....../res/resa.txt",rate);
  }

image-20210918212033033

输入输出的文件都不存在

    @Test
   void inputOutputError(){
       //输入输出的路径都不存在
       double rate = Article.getRate("example/aorig.txt",
               "example/orig_0.8_dis_15.txt");
       Article.output("....../res/resa.txt",rate);
  }

image-20210918212048514

7.代码质量检查

使用的是IDEA内置的代码质量检查以及阿里巴巴代码检查插件

先看人为制造的命名不合理警告

image-20210918212255182

再看实际项目的代码效果

可以看到右侧检查栏不存在警告或错误

image-20210918212333085

总结

  • 本次软工作业的查重思路是借鉴网上的将文章分为两个两个词 如12345就分为 12/23/34/45四个词,进行哈希再比对是否存在重复哈希来查重个人感觉思路还是比较简洁易懂,思路简单但效果极佳,还不需要引入外部自然语言库,最难得的是实现起来比较简单。

  • 本次是我第一次接触性能分析工具和测试(计算代码覆盖率)工具,对这些工具有了初步了解

posted @ 2021-09-18 21:29  国家一级野生摸鱼生物  阅读(282)  评论(1)    收藏  举报