这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/homework/13136 |
这个作业的目标 | 1.学习GitHub创建文件 2.学习psp表格规划时间 3.开发一个论文查重的代码 4.运用Code Quality Analysis工具分析代码 5.使用具Studio Profiling Tools改进代码 6.学习GitHub签入进展 7.写测试用例确保程序正确执行 |
GitHub 链接:https://github.com/1AYyh/3122004498
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 45 |
· Estimate | · 估计这个任务需要多少时间 | 20 | 10 |
Development | 开发 | 360 | 350 |
· Analysis | · 需求分析 (包括学习新技术) | 120 | 240 |
· Design Spec | · 生成设计文档 | 40 | 30 |
· Design Review | · 设计复审 | 20 | 20 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20 | 15 |
· Design | · 具体设计 | 180 | 50 |
· Coding | · 具体编码 | 160 | 150 |
· Code Review | · 代码复审 | 20 | 15 |
· Test | · 测试(自我测试,修改代码,提交修改) | 30 | 30 |
Reporting | 报告 | 50 | 50 |
· Test Repor | · 测试报告 | 60 | 50 |
· Size Measurement | · 计算工作量 | 20 | 15 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 30 |
· 合计 | 1190 | 1200 |
计算模块接口的设计与实现过程
设计与组织:
- 代码主要被组织为一个单一的类
PaperPlagiarismChecker
,它包含了整个应用程序的逻辑。 - 主要函数包括:
main(String[] args)
:程序入口点,处理命令行参数并调用其他函数。calculateSimilarity(String originalText, String plagiarizedText)
:核心函数,计算两个文本之间的相似度。writeSimilarityToOutput(double similarity, String outputFilePath)
:辅助函数,将计算结果写入文件。
算法关键与独到之处:
- 算法基于字符集来计算两个文本之间的Jaccard相似度,适合处理中文和其他非空格分隔语言的文本,这是算法的独到之处。
- 通过将文本转换为字符集合,计算交集和并集的大小来得出相似度分数,这种方法简单而有效。
计算模块接口部分的性能改进
性能改进记录:
- 初始版本的性能主要受到
calculateSimilarity
函数中集合操作的影响。 - 改进思路包括优化集合操作,比如使用更高效的数据结构(如
HashSet
)和减少不必要的转换(直接操作字符串数组而不是转换为列表)。
计算模块部分单元测试展示
单元测试代码示例:
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class PaperPlagiarismCheckerTest {
@Test
public void testCalculateSimilarity() {
String original = "今天是星期天,天气晴,今天晚上我要去看电影。";
String plagiarized = "今天是周天,天气晴朗,我晚上要去看电影。";
double expected = 0.85; // 假设的相似度结果
double actual = PaperPlagiarismChecker.calculateSimilarity(original, plagiarized);
assertEquals(expected, actual, 0.01);
}
}
- 构造测试数据的思路是基于实际的原文和抄袭版本文本来模拟真实场景。
计算模块部分异常处理说明
异常设计目标:
- 处理文件读写异常(
IOException
),确保程序在文件操作失败时能够优雅地处理错误,而不是崩溃。 - 处理命令行参数错误,提供清晰的使用说明。
异常处理单元测试样例:
@Test
public void testIOExceptionHandling() {
// 模拟一个不存在的文件路径,预期应该捕获IOException
assertThrows(IOException.class, () -> {
PaperPlagiarismChecker.main(new String[]{"nonexistent.txt", "alsoNonexistent.txt", "output.txt"});
});
}
- 每种异常的单元测试样例都应模拟可能导致该异常的场景,确保异常处理逻辑正确。