这个作业属于哪个课程 | 班级链接 |
---|---|
这个作业要求在哪里 | 个人项目 - 作业 - 计科22级12班 - 班级博客 - 博客园 (cnblogs.com) |
这个作业的目标 | 准备、创建、开发、管理、测试个人项目 |
GitHub项目链接
https://github.com/chocohQL/3122004348-01
可运行 jar 已发布在最新 releases
项目设计
项目分为主函数、参数解析运行工具、查重算法工具、异常提示信息、Junit单元测试5部分:
- 主函数(Main):主函数负责接收命令行参数,调用参数解析运行工具并捕获打印可能发送的异常。
- 参数解析运行工具(DuplicateCheck):负责解析命令行参数、加载源文件和目标文件、调用查重算法工具得到查重结果、输出结果文件,出现异常抛出不同的异常信息。
- 查重算法工具(HammingUtil):实现SimHash海明距离算法。
- 异常提示信息(ExceptionResult):统一管理不同异常对应不同提示信息。
- Junit单元测试(MainTest):集成Junit单元测试工具调用主函数run方法,模拟命令行输入不同参数得到的结果。
项目调用流程:Main(run) -> DuplicateCheck(check) -> HammingUtil(getSimilarity)
项目结构
src
├── main
│ └── java
│ │ └── DuplicateCheck // 参数解析运行工具
│ │ └── ExceptionResult // 异常提示信息
│ │ └── HammingUtil // 查重算法工具
│ │ └── Main // 主函数
│ └── resources // 测试输入输出文件
│ │ └── result
│ │ └── orig.txt
│ │ └── ...
├── test
│ └── java
│ │ └── MainTest.java // 测试样例
性能分析
黄色部分为项目函数的消耗,紫色部分为junit框架本身的消耗,需要关注运行事件和相较父级的占用时间,不需要观察全部的占用。项目核心最耗时的是计算SimHash码的部分。
异常和测试
通过模拟参数为空、参数为null、参数不全、错误文件地址、正确文件地址等不同情况验证程序运行。
不同的异常可以总结为三种:
public static final String UNABLE_LOAD_FILE = "无法加载文件";
public static final String UNABLE_EXPORT_FILE = "无法输出文件";
public static final String PARAMETER_EXCEPTION = "请深入参数:java -jar main.jar [原文文件] [抄袭版论文的文件] [答案文件]";
参数不全:
if (args.length != 3) {
throw new RuntimeException(ExceptionResult.PARAMETER_EXCEPTION);
}
@Test
public void test1() {
Main.run(new String[]{});
}
参数为空:
for (int i = 0; i < 3; i++) {
if (args[i] == null) {
throw new RuntimeException(ExceptionResult.PARAMETER_EXCEPTION);
}
}
@Test
public void test4() {
Main.run(new String[]{null, null, null});
}
无法加载文件:
try {
sourceFile = new String(Files.readAllBytes(Paths.get(args[0])));
targetFile = new String(Files.readAllBytes(Paths.get(args[1])));
} catch (IOException e) {
throw new RuntimeException(ExceptionResult.UNABLE_LOAD_FILE);
}
@Test
public void test5() {
Main.run(new String[]{
"a",
"b",
"c"
});
}
项目模拟了大部分输入情况,Main函数不是100%是由于命令行是通过主函数main调用run方法,而junit直接调用run方法没用调用主函数main。
PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 5 | 5 |
· Estimate | · 估计这个任务需要多少时间 | 5 | 5 |
Development | 开发 | 95 | 80 |
· Analysis | · 需求分析 (包括学习新技术) | 20 | 10 |
· Design Spec | · 生成设计文档 | 10 | 10 |
· Design Review | · 设计复审 | 10 | 5 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 5 |
· Design | · 具体设计 | 10 | 10 |
· Coding | · 具体编码 | 20 | 20 |
· Code Review | · 代码复审 | 5 | 5 |
· Test | · 测试(自我测试,修改代码,提交修改) | 10 | 15 |
Reporting | 报告 | 20 | 20 |
· Test Repor | · 测试报告 | 10 | 10 |
· Size Measurement | · 计算工作量 | 5 | 5 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 5 | 5 |
合计 | 120 | 105 |