• 全部
...

软件工程实践第二次作业——个人实战

222100132谢凌云 2024-03-02 20:17:25
这个作业属于哪个课程2023年福大-软件工程实践-W班
这个作业要求在哪里软件工程实践第二次作业——个人实战
这个作业的目标完成对世界游泳锦标赛跳水项目相关数据的收集,并实现一个能够对赛事数据进行统计的控制台程序
其他参考文献码出高效_阿里巴巴Java开发手册源代码管理

目录

  • Gitcode项目地址
  • PSP表格
  • 解题思路描述
  • 1、先对数据进行分析
  • 2、需求分析
  • 3、得出框架
  • 接口设计和实现过程
  • 1、getPlayers接口
  • 2、getScore接口
  • 3、接口printError
  • 关键代码展示
  • getPlayers接口
  • getScore接口
  • printError接口
  • main函数
  • 性能改进
  • 单元测试
  • 异常处理
  • 心得体会

Gitcode项目地址

https://gitcode.net/qq_62699435/project-java

PSP表格

PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划12060
• Estimate• 估计这个任务需要多少时间12060
Development开发15901610
• Analysis• 需求分析 (包括学习新技术)240240
• Design Spec• 生成设计文档6070
• Design Review• 设计复审6050
• Coding Standard• 代码规范 (为目前的开发制定合适的规范)120100
• Design• 具体设计90100
• Coding• 具体编码600720
• Code Review• 代码复审240210
• Test• 测试(自我测试,修改代码,提交修改)180120
Reporting报告180160
• Test Repor• 测试报告6050
• Size Measurement• 计算工作量6050
• Postmortem & Process Improvement Plan• 事后总结, 并提出过程改进计划6060
合计18901830

解题思路描述

1、先对数据进行分析

通过网页上的api将选手数据和比赛数据拷贝一份储存在本地文件中,文件命名为players和比赛名称

img

2、需求分析

要求有两种输出,分别是输出选手信息和输出比赛数据,意味着需要从已经拷贝到本地的txt文档中筛选出有效信息,利用文件流BufferedReader和BufferedWriter读出字符串,再通过JSON解析即可得到需要输出的数据并写入output.txt

3、得出框架

将不同的输出封装起来,在main函数中按行读取input.txt中的字符串,解析读入的字符串是否为合法要求,根据字符串执行不同的函数即可完成output.txt的写入功能。

接口设计和实现过程

1、getPlayers接口

getPlayers:当从input.txt中读入某一行的字符串为players时,调用该接口。通过JSONTokener读入预先存储在本地文件players.txt中的选手数据,解析为JSONObject,循环读出每一位选手的firstName和lastName连接为fullName,以及国籍和性别,通过BufferedWriter写入output.txt中。

2、getScore接口

getScore:接口需要参数path,来源于result请求后的字符串,将path转换为相对地址pathName对应本地文件txt的名称,即可打开正确的比赛记录文件。和接口一类似从本地txt文件中读入比赛信息,通过JSONObject和JSONArray的嵌套使用过滤出需要的数据,写入output.txt。

3、接口printError

printError:当iunput请求是不符合规定的请求时,调用该接口,在output.txt中写入字符串Error

关键代码展示

getPlayers接口

img

getScore接口

img

printError接口

img

main函数

img

性能改进

由于开始编程时没有考虑有重复申请相同信息的情况,采取的是一次请求一次输出的方法,当样本量增大时时间复杂度太高。

所有11条不同指令消耗的时间(120ms):

img

11*10=110条指令消耗的时间(540ms):

img

1100条指令消耗的时间(3949ms):

img

可以明显发现时间复杂度几乎是线性增大的,解决的方法也很简单,建立合适的数据结构将筛选后的数据存储起来,实现数据的复用。但是这样几乎要把之前的代码推倒重来,观察发现这次的题目其实数据量不大,输出的数据也比较固定,总共只有11种合法指令,所以考虑第一次输出的同时将输出存储到哈希表中,之后遇到相同指令时直接从哈希表中取出数据即可,同样体现了数据的复用。
即使是这样修改之后,时间复杂度和室友对比之后发现仍然较高,检查发现原因是BufferedWriter没有实现复用,每次输出到output中时都要新建一个BufferedWriter,写入之后再关闭,浪费资源。于是将BufferedWriter也封装起来实现复用,性能取得巨大提升。

优化后:
所有11条不同指令消耗的时间(120ms->113ms):

img

11*10=110条指令消耗的时间(540ms->125ms):

img

1100条指令消耗的时间(3949ms->132ms):

img

10888条指令消耗的时间(221ms):

img

单元测试

白盒测试:使用了一个包含11种合法输入的10890行的input.txt测试输出结果,得到output.txt共716760行,与舍友程序得到的结果进行对比,结果相同,基本能够通过白盒测试。

img

编写了一个test测试程序自动测试getPlayers接口能否输出正确的程序

img

异常处理

在读写文件前先检查文件是否存在

img

检查是否是非法输入,通过正则表达式检验是否为result+比赛名的合法输入

img

try-catch捕获程序过程中的异常,而不会中断程序的执行。

img

心得体会

1、基本了解了从网页爬取数据的步骤,对网页数据有了更多的理解。但是爬取数据的方法有待拓展,基本是通过api网址手动爬取保存到本地文件中,后续可以学习使用工具更方便地爬取。
2、初步掌握JSON解析的方法,能够从网页上爬取的数据进行解析,得到想要的某一部分数据,同时也涉及输入输出流的运用,从文件中读取大数据,进行解析得到部分数据,再输出到对应文件中,日常使用中也很好用。
3、封装思想。经过性能优化环节,对封装的作用有了更深理解,能实现代码和数据的复用,极大提升性能,之后编程过程中也会注意封装。
4、重视需求分析,一开始没有考虑到数据结构怎么建立,只考虑到一次输入一次输出,后续修改就非常麻烦了。所以之后会认真分析需求,建立合适的数据结构和接口,实现代码复用。

...全文
给本帖投票
137 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
助教-何浩然 助教 2024-03-13
  • 打赏
  • 举报
回复

整体上很棒,继续加油!

310

社区成员

发帖
与我相关
我的任务
社区描述
福州大学的软件工程实践-2023学年-W班
软件工程需求分析结对编程 高校 福建省·福州市
社区管理员
  • FZU_SE_teacherW
  • Pity·Monster
  • 助教张富源
加入社区
社区公告
暂无公告

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

手机看
关注公众号

关注公众号

客服 返回
顶部