个人项目:java实现论文查重

发布时间 2023-09-13 15:12:26作者: 变成七秒记忆的鱼

| 这个作业属于哪个课程 | [软件工程](https://edu.cnblogs.com/campus/gdgy/CSGrade21-12) |

| ----------------- | --------------- |

| 这个作业要求在哪里| [个人项目](https://edu.cnblogs.com/campus/gdgy/CSGrade21-12/homework/13014) |

| 这个作业的目标 | 熟悉maven等框架搭建,jprofiler观察资源消耗与调用情况,junit单元测试,熟悉开发流程 |

#正文

#1.GitHub仓库

- [本项目仓库链接](https://github.com/FlyingMantaRay/3121004677)

#2.PSP
| PSP2.1 Stages | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|-------------------------------------------|---------------------------------------------|------------------|------------------|
| Planning | 计划 | 30 | 50 |
| Estimate | 估计这个任务需要多少时间 | 20 | 30 |
| Development | 开发 | 300 | 400 |
| Analysis | 需求分析 (包括学习新技术) | 300 | 420 |
| Design Spec | 生成设计文档 | 30 | 20 |
| Design Review | 设计复审 | 20 | 20 |
| Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 20 | 20 |
| Design | 具体设计 | 100 | 120 |
| Coding | 具体编码 | 300 | 360 |
| Code Review | 代码复审 | 30 | 50 |
| Test | 测试(自我测试,修改代码,提交修改) | 300 | 500 |
| Reporting | 报告 | 60 | 70 |
| Test Report | 测试报告 | 60 | 60 |
| Size Measurement | 计算工作量 | 30 | 30 |
| Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 30 |
| **合计** | | **1600** | **2180** |

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

- MainPaperCheck
只有一个main函数,顺序进行文件读入,并将内容写到字符串中,具体是按行读的,可以减少对内存的瞬间占用(详见读写模块)
参数的设定样式使其能在cmd运行
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913120922947-761391835.png)
然后调用模块计算结果并返回,逻辑比较朴素
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913121042314-561426909.png)

- SimHashUtils
作用:计算simhash
有getHash与getSimHash方法
getHash流程图:
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913125122218-926232863.png)
详细注解:
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913125253170-1443124638.png)
getSimHash流程图:
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913130106180-561924969.png)
详细解析:
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913130137255-723176090.png)
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913130148600-952129666.png)

- TxtIOUtils
作用:处理读写
有readTxt与writeTxt模块,按行读的,可以减少对内存的瞬间占用,写时用\r\n适应多平台
流程图:
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913124204597-701471252.png)
详细注解:
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913124242435-1663426159.png)
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913124355950-1923182649.png)

- HammingUtils
作用:用于计算汉明距离
有getHammingDistance与getSimilarity方法
getHammingDistance:根据simhash计算并返回海明距离
流程图:
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913122530309-593187773.png)
代码中有详细的注释:
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913121315897-729384522.png)
getSimilarity:传入simhash调用getHammingDistance得到distance并计算相似度
流程图:
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913123159311-1991952281.png)
代码与详细注解:
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913123315227-1145970226.png)

- ShortStringException
作用:自定义一个异常,应对字符串过短
详细解析:
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913130314785-973026495.png)

- pom配置
作用:从中央仓库或镜像仓库下载外部依赖包
用maven进行项目管理 pom中加入汉化包与测试工具
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913131148996-46028842.png)

#4.计算模块接口部分的性能改进
jprofiler overview:
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913130540615-1522346296.png)
调用:
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913130605722-415386648.png)
可以看到 调用最多的是汉化包 程序的优化已经需要依赖于数学理论的突破与汉化算法内部的优化 已经达到瓶颈。

#5.计算模块部分单元测试展示
- MainTest
作用:测试项目总体运行情况
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913131557977-7585879.png)
测试结果:
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913131721540-725273611.png)
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913145041880-320536687.png)
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913145116617-981140498.png)


- TxtIOUtilsTest
在案例中设置路径不存在的情况
作用:测试正常读写与文件路径为空的情况
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913131821335-2110601063.png)
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913131830021-619844547.png)
测试结果:
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913131859484-28064391.png)
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913131907986-1637088813.png)

- SimHashUtilsTest
设计一个字符串 检查能否得到simhash
作用:测试这个类中的两个方法
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913132328473-907110672.png)
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913132226126-66999669.png)
覆盖率:
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913132310155-1731798550.png)

- HammingUtilsTest
设计了哈希值长度不相等的情况
作用:检查哈希值不相等是否有在较短字符串前补0,并检查正常运行
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913132542998-1353432130.png)
结果:
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913132600558-1238158481.png)
覆盖率:
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913132628506-1785544030.png)

- ShortStringExceptionTest
设计了str长度小于200的情况
作用:检查这个自定义的异常处理是否生效
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913133031480-476334975.png)
结果:
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913133041783-1616630036.png)
覆盖率:
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913133100581-124446300.png)

#6.计算模块部分异常处理说明
- 读写文件异常
针对路径不存在等情况捕捉
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913145707746-491307109.png)
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913145736082-954572782.png)
测试结果已经在上文测试部分给出

- 字符串过短异常ShortStringException
汉化包无法处理长度在200以下的字符串 所以要自定义一个异常 在str长度小于两百时抛出
异常的自定义:
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913145454412-556039361.png)
测试代码:
![](https://img2023.cnblogs.com/blog/3271976/202309/3271976-20230913145517491-23020247.png)
测试结果已经在上文测试部分给出