第一次个人编程作业

作业概述

这个作业属于哪个课程 软件工程
这个作业要求在哪里 个人项目
这个作业的目标 完成个人编程作业

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


抛出的异常可捕获

posted @ 2023-09-17 01:34  JNDBK  阅读(44)  评论(0)    收藏  举报