第一次个人编程作业
作业概述
| 这个作业属于哪个课程 | 软件工程 |
|---|---|
| 这个作业要求在哪里 | 个人项目 |
| 这个作业的目标 | 完成个人编程作业 |
GitHub链接
https://github.com/JNDGH/JNDGH
PSP表格
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 30 | 30 |
| · Estimate | · 估计这个任务需要多少时间 | 500 | 600 |
| Development | 开发 | 60 | 60 |
| · Analysis | · 需求分析 (包括学习新技术) | 30 | 30 |
| · Design Spec | · 生成设计文档 | 10 | 10 |
| · Design Review | · 设计复审 | 20 | 20 |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
| · Design | · 具体设计 | 20 | 10 |
| · Coding | · 具体编码 | 120 | 120 |
| · Code Review | · 代码复审 | 20 | 10 |
| · Test | · 测试(自我测试,修改代码,提交修改) | 60 | 60 |
| Reporting | 报告 | 60 | 60 |
| · Test Repor | · 测试报告 | 20 | 20 |
| · Size Measurement | · 计算工作量 | 20 | 30 |
| · Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 10 | 10 |
| · 合计 | 1060 | 1070 |
模块接口设计与实现


- StringUtil:封装字符串处理工具
isEmpty判断字符串是否为空
splitTokens将字符串切割为一个个汉字或者英文单词 - FileUtil:封装文件io处理工具
readFileToString读取文件为字符串
writeToFile将字符串写入文件 - JaccardTextSimilarity:封装文本相似度检测工具
getSimilarity比较2段字符串,并返回相似度
getScore 比较2个token集合,返回Jaccard相似系数 - Application:main主函数入口,处理命令行传入参数,读取文件,计算相似度,将结果写入文件
jar包
使用maven进行构建,导入的依赖如下
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- 日志门面-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.10</version>
</dependency>
</dependencies>
使用maven的命令 maven clean package 即可打成jar包。jar已上传至GitHub
性能分析



由图可知io流读取文件内容消耗的时间最多
public static String readFileToString(String path) throws IOException {
StringBuilder stringBuilder = new StringBuilder();
Stream<String> lines = Files.lines(Paths.get(path));
//按行加载,防止文件过大OOM
lines.forEachOrdered(stringBuilder::append);
return stringBuilder.toString();
}
单元测试
public class StringUtilTest {
@Test
public void isEmpty() {
assertTrue(StringUtil.isEmpty(""));
assertTrue(StringUtil.isEmpty(null));
assertFalse(StringUtil.isEmpty("good"));
}
@Test
public void splitTokens() {
String text = "你好,我喜欢English,你呢?";
List<String> tokens = Arrays.stream(new String[]{"你", "好", "我", "喜", "欢", "English", "你", "呢"}).
collect(Collectors.toList());
assertEquals(tokens, StringUtil.splitTokens(text));
}
}
这是StringUtil的单元测试,isEmpty测试传入的字符串为null,长度为0,以及正常字符串,并进行断言,而splitTokens则是考虑到了汉字,英语,标点符号(标点符号不应该加入token),并进行断言

异常处理
- 参数个数错误
自定义一个异常类,当传入的参数不为3时,抛出异常
public class ArgsException extends Exception{
public static final int ARGS_NUMBER = 3;
public ArgsException(){
super("参数数量错误");
}
}
异常处理方式
if (args.length != ArgsException.ARGS_NUMBER) {
log.error("传入参数个数:{}", args.length);
throw new ArgsException();
}

由单元测试可得异常捕获成功
- 文件异常
文件读取,写入等异常,均由方法抛出,交由jvm处理
public static String readFileToString(String path) throws IOException
public static void writeToFile(String text, String path) throws FileNotFoundException

抛出的异常可捕获

浙公网安备 33010602011771号