软件工程实践第二次作业——文件读取

222100413刘家伟 2024-02-27 22:31:44
这个作业属于哪个课程https://bbs.csdn.net/forums/ssynkqtd_06
这个作业要求在哪里https://bbs.csdn.net/topics/618087255
这个作业的目标完成对世界游泳锦标赛跳水项目相关数据的收集,并实现一个能够对赛事数据进行统计的控制台程序。在文章开头给出Gitcode项目地址。给出PSP表格。解题思路描述。设计与实现过程。程序性能改进。单元测试展示。撰写解决项目的心路历程与收获>
其他参考文献...

目录

  • GitCode项目地址
  • PSP表格
  • 解题思路描述
  • 模块接口的设计与实现过程
  • 性能改进
  • 单元测试
  • 异常处理说明
  • 解决项目的心路历程与收获

GitCode项目地址

PSP表格

PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划2060
- Estimate- 估计这个任务需要多少时间2020
Development开发20001500
- Analysis- 需求分析 (包括学习新技术)200200
- Design Spec- 生成设计文档2020
- Design Review- 设计复审3060
- Coding Standard- 代码规范 (为目前的开发制定合适的规范)1010
- Design- 具体设计6060
- Coding- 具体编码12001400
- Code Review- 代码复审9090
- Test- 测试(自我测试,修改代码,提交修改)240180
Reporting报告60120
- Test Report- 测试报告3030
- Size Measurement- 计算工作量1010
- Postmortem & Process Improvement Plan- 事后总结,并提出过程改进计划3030
合计40203790

解题思路描述

首先可以利用example提供的data数据,利用fastJson2解析内容,然后转换成实体类,接着就按要求对实体类进行操作。解析内容首先要找到文件,利用工具类找到项目路径在找到相对路径即可找到所有的data数据。也可以从官网爬取数据。 有了实体类就很简单,不需要硬编码对json数据进行解析操作。 把init初始化操作和正常操作分离,比如大致两个功能一个是输出players信息一个是输出result对应的信息,先要分析command命令是否正确,利用hashset的特性快速判断,是正确的就执行对应命令,即执行对应两个方法。接下来不断优化command的判断以及两个功能的执行即可。

模块接口的设计与实现过程

主要分为两个基本类,一个DWASearch用来做main类,执行入口方法,一个Lib类开发功能。
Lib类需要解析json文件,所以写了json转换的对应类比如Participations选手类,Disciplines赛事类,Results赛事结果类,一开始利用网上的json转Java对象工具获取所有字段,后期精简不需要的字段。
由于json转换类需要来自不同的json文件,而且只需要在程序运行的时候初始化一次即可,所以我写了不同类对应的初始化操作函数比如initParticipationsList(),initEventSet(),initResult()等,然后再用一个init()函数包括住所有init函数,做到代码的解耦,分布进行初始化操作。
Lib类需要提供两个主要的函数,一个是readInputFile()去解析命令行的input文件,把所有命令都解析出来放到一个集合中,然后是executeCommand()函数去执行集合里的所有命令。
关键和独到之处:
1.一个init()函数包括住所有init函数,做到代码的解耦,方便后续代码的构建和重构,提高拓展性
2.充分利用Java的面向对象特性,利用json转换类执行操作而不是直接硬操作jsonMapObject然后用字符串比较
3.利用Java的streamAPI来简化代码,让代码结构更优雅简明

性能改进

1.利用Buffer流处理文件,比字节流stream操作更快

img

2.精简Json转换类的字段,只保留必要字段,减少json解析映射时间和内存占用

img

3.缓存从文件解析的数据,读取一次即可,不需要再次读取

img

单元测试

部分测试代码截图如下

img

img


测试的函数统一调用DWASearch这个主类,自己写多个input文件来测试包含可能的输入
构造思路是找出args输入参数的所有可能情况以及input文件的所有正确和非法输入,以及input或output文件不存在的情况

测试覆盖率截图如下

img

优化覆盖率:
1.增加测试用例:编写更多的测试用例,覆盖更多的代码路径和边界情况。例如,对于一个方法,可以考虑其各种可能的输入情况,并确保每种情况都有对应的测试用例。
2.重构代码:有时候低测试覆盖率可能是代码设计不合理的结果。通过重构代码,将复杂的逻辑拆分成更小的、可测试的单元,可以更容易地编写出覆盖率更高的测试用例。

异常处理说明

需要处理文件不存在以及用户非法输入的异常
文件包括数据文件和input、output文件
如果是数据文件不存在则无法运行程序,只能抛出异常;如果是input不存在也无法运行程序,可以友好地提示用户输入有问题;如果是output文件不存在可以利用相对路径创建,减少用户的操作,无需用户创建output文件
用户的非法输入异常包括input和output的输入文件地址异常和input文件的格式异常
文件地址异常即找不到文件已经在文件不存在部分处理,input文件格式异常我用hutool的判空字符串函数处理用户输入的所有指令来处理异常
部分处理代码如下

img

img

解决项目的心路历程与收获

一开始看到json无从下手,利用搜索引擎学习到了可以用json工具类解析。学到了用json解析工具快速对数据进行解析和封装,提高了我的数据处理能力
数据文件在项目的固定相对路径 我利用网上和自己写的方法结合处理对文件的搜寻
优化项目性能的时候看到了可以用buffer对数据进行缓存,避免原本字节流形式的低效

...全文
116 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

122

社区成员

发帖
与我相关
我的任务
社区描述
FZU-SE
软件工程 高校
社区管理员
  • LinQF39
  • 助教-吴可仪
  • 一杯时间
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧