软件工程第二次作业–文件读取

222100435蒋亿达 2024-03-01 17:50:01
这个作业属于哪个课程2023软件工程
这个作业要求在哪里软件工程实践第二次作业
这个作业的目标收集并统计世界游泳锦标赛官网的跳水项目比赛结果和参赛选手信息
其他参考文献《构建之法》

目录

  • 0 Gitcode项目地址
  • 0.1 提交记录
  • 1 PSP表格
  • 2 解题思路
  • 2.1 将json文件转为java对象方式
  • 2.2 解析athletes.json文件,确定获取数据方式
  • 2.3 解析event.json和各个比赛结果文件,确定获取数据方式
  • 3 接口设计
  • 3.1 接口的设计
  • 3.2 代码组织
  • 3.3 通讯图
  • 4 关键代码展示
  • 5 性能改进
  • 5.1 分析
  • 5.2 改进
  • 6 单元测试
  • 7 异常处理
  • 8 心得体会

0 Gitcode项目地址

仓库地址

0.1 提交记录

由于合并有问题,重新fork,之前提交记录如下图

img

1 PSP表格

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

2 解题思路

2.1 将json文件转为java对象方式

导入hutool-all-5.6.0.jar包 ,使用JSONUtil,JSONArray,JSONObject等API。

2.2 解析athletes.json文件,确定获取数据方式

通过整理,发现运动员信息是按照国家所对应的队伍分开的,如下图 图2.1所示,在解析json文件时,可分为两步:

  • 获取全部队伍
  • 获取队伍内的运动员信息

(图2.1)

img

2.3 解析event.json和各个比赛结果文件,确定获取数据方式

1.首先需要获取比赛ID
通过整理,发现各个比赛对应的id都在Sports->DsiciplineList下,如下图 图2.2
在获取比赛ID后,在datas/results
(图2.2)

img

2。获取比赛结果
通过整理发现,每场比赛决赛结果的成绩都在Heats->Results下,如下图 图2.3
个人成绩详情在Dives中,如下图 图2.4
获取比赛结果可分为下列三步:

  • 读取event.json,获取比赛id
  • 查找比赛对应json文件,读取比赛所有结果
  • 获取每位选手个人成绩

(图2.3)

img

(图2.4)

img

3 接口设计

3.1 接口的设计

经过分析,主要需要实现3个功能:

  • 命令解析
  • 读取数据文件并整理
  • 数据写入文件

对应接口为:

DataReader类:负责读取数据,将读取的数据转为java对象。
DataWriter类:负责写入数据,不应依赖于DataReader等接口。
CommandReceiver类:负责调度DataReader和DataWriter和解析input.txt中的指令

3.2 代码组织

DWASearch类为主程序入口,对输入cmd命令初步检验和解析后,无异常,获得指令文件路径结果保存文件路径
然后调用CommanderReceiver.ExcuteCommand方法,并传入上述两个文件路径。

ExcuteCommand方法主要实现:

  • 调用DataReader的GetCommands方法,获取所有command
  • 解析command
  • command正确,则调用DataReader中对应方法:GetAllPlayer()\GetMatchResult(String sportName),获取数据
  • 调用DataWriter,将数据写入指定文件。

3.3 通讯图

img

4 关键代码展示

  • DataReader读取数据方法

(图4.1:获取选手信息)

img

(图4.2:获取比赛结果)

img

  • 解析指令(使用正则表达式匹配)

(图4.3:解析指令)
正则表达式如下:

1 "^players$",
2 "^result\s(women\s1m\sspringboard|women\s3m\sspringboard
|women\s10m\splatform|women\s3m\ssynchronised|women\s10m\ssynchronised
|men\s1m\sspringboard|men\s3m\sspringboard
|men\s10m\splatform|men\s3m\ssynchronised
|men\s10m\ssynchronised)$",
3 "^result(?:\s+.+)?$"

img

5 性能改进

5.1 分析

影响程序性能的主要为IO操作,由于数据长时间内不会变化,对于重复的指令,重复执行是无端的开销。

5.2 改进

  • 在内存中实现简易缓存机制,每执行一条未执行过的查询指令,将结果保存在内存中,下次调用无需再次执行IO操作
  • 充当缓存的数据结构如下图 图5.1 所示
    (图5.1)

    img

6 单元测试

使用IDEA自带Junit工具,主要对DataReader进行单元测试

(图6.1)

img

结果如下(类覆盖率,方法覆盖率,覆盖率,分支覆盖率):
符合预期,因为使用io流,覆盖率无法进一步提升

(图6.2)

img

7 异常处理

主要是对FileNotFoundException异常的处理,对于此类异常,处理方式主要为输出异常信息,如下图 图7.1所示
(图7.1)

img

8 心得体会

本次作业主要难点是对Json的解析,作业难度不大,重新拾起java学习的时间并没有太长,大部分时间花在学习使用第三方包的JSONUtil上。测试阶段,由于本身检测比较强硬,即指令解析不会去猜测对于一些出现局部错误的指令的意思,所以没有遇到什么错误。最后是打包成jar包这部分,执行jar包和在源代码执行有很多不同,对于打包的过程仍有很多困惑。

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

122

社区成员

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

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