122
社区成员
发帖
与我相关
我的任务
分享| 这个作业属于哪个课程 | 2023软件工程 |
|---|---|
| 这个作业要求在哪里 | 软件工程实践第二次作业 |
| 这个作业的目标 | 收集并统计世界游泳锦标赛官网的跳水项目比赛结果和参赛选手信息 |
| 其他参考文献 | 《构建之法》 |
由于合并有问题,重新fork,之前提交记录如下图

| PSP Stage | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 10 | 10 |
| Estimate | 估计这个任务需要多少时间 | 10 | 5 |
| Development | 开发 | 860 | 860 |
| Analysis | 需求分析 (包括学习新技术) | 60 | 100 |
| Design Spec | 生成设计文档 | 10 | 30 |
| Design Review | 设计复审 | 30 | 30 |
| Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 | 20 |
| Design | 具体设计 | 60 | 60 |
| Coding | 具体编码 | 360 | 300 |
| Code Review | 代码复审 | 120 | 120 |
| Test | 测试(自我测试,修改代码,提交修改) | 60 | 120 |
| Reporting | 报告 | 120 | 150 |
| Test Report | 测试报告 | 60 | 60 |
| Size Measurement | 计算工作量 | 20 | 20 |
| Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 60 | 30 |
| 合计 | 890 | 1055 |
导入hutool-all-5.6.0.jar包 ,使用JSONUtil,JSONArray,JSONObject等API。
通过整理,发现运动员信息是按照国家所对应的队伍分开的,如下图 图2.1所示,在解析json文件时,可分为两步:
- 获取全部队伍
- 获取队伍内的运动员信息
(图2.1)
1.首先需要获取比赛ID
通过整理,发现各个比赛对应的id都在Sports->DsiciplineList下,如下图 图2.2
在获取比赛ID后,在datas/results
(图2.2)
2。获取比赛结果
通过整理发现,每场比赛决赛结果的成绩都在Heats->Results下,如下图 图2.3
个人成绩详情在Dives中,如下图 图2.4
获取比赛结果可分为下列三步:
- 读取event.json,获取比赛id
- 查找比赛对应json文件,读取比赛所有结果
- 获取每位选手个人成绩
(图2.3)
(图2.4)
经过分析,主要需要实现3个功能:
对应接口为:
DataReader类:负责读取数据,将读取的数据转为java对象。
DataWriter类:负责写入数据,不应依赖于DataReader等接口。
CommandReceiver类:负责调度DataReader和DataWriter和解析input.txt中的指令
DWASearch类为主程序入口,对输入cmd命令初步检验和解析后,无异常,获得指令文件路径和结果保存文件路径
然后调用CommanderReceiver.ExcuteCommand方法,并传入上述两个文件路径。
ExcuteCommand方法主要实现:
- 调用DataReader的GetCommands方法,获取所有command
- 解析command
- command正确,则调用DataReader中对应方法:GetAllPlayer()\GetMatchResult(String sportName),获取数据
- 调用DataWriter,将数据写入指定文件。

(图4.1:获取选手信息)

(图4.2:获取比赛结果)

(图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+.+)?$"

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

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

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

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

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