310
社区成员




这个作业属于哪个课程 | 2023年福大-软件工程实践-W班 |
---|---|
这个作业要求在哪里 | 软件工程实践第二次作业——个人实战 |
这个作业的目标 | 完成对世界游泳锦标赛跳水项目相关数据的收集,并实现一个能够对赛事数据进行统计的控制台程序 |
其他参考文献 | 码出高效_阿里巴巴Java开发手册、源代码管理 |
https://gitcode.net/qq_62699435/project-java
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 120 | 60 |
• Estimate | • 估计这个任务需要多少时间 | 120 | 60 |
Development | 开发 | 1590 | 1610 |
• Analysis | • 需求分析 (包括学习新技术) | 240 | 240 |
• Design Spec | • 生成设计文档 | 60 | 70 |
• Design Review | • 设计复审 | 60 | 50 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 120 | 100 |
• Design | • 具体设计 | 90 | 100 |
• Coding | • 具体编码 | 600 | 720 |
• Code Review | • 代码复审 | 240 | 210 |
• Test | • 测试(自我测试,修改代码,提交修改) | 180 | 120 |
Reporting | 报告 | 180 | 160 |
• Test Repor | • 测试报告 | 60 | 50 |
• Size Measurement | • 计算工作量 | 60 | 50 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 60 | 60 |
合计 | 1890 | 1830 |
通过网页上的api将选手数据和比赛数据拷贝一份储存在本地文件中,文件命名为players和比赛名称
要求有两种输出,分别是输出选手信息和输出比赛数据,意味着需要从已经拷贝到本地的txt文档中筛选出有效信息,利用文件流BufferedReader和BufferedWriter读出字符串,再通过JSON解析即可得到需要输出的数据并写入output.txt
将不同的输出封装起来,在main函数中按行读取input.txt中的字符串,解析读入的字符串是否为合法要求,根据字符串执行不同的函数即可完成output.txt的写入功能。
getPlayers:当从input.txt中读入某一行的字符串为players时,调用该接口。通过JSONTokener读入预先存储在本地文件players.txt中的选手数据,解析为JSONObject,循环读出每一位选手的firstName和lastName连接为fullName,以及国籍和性别,通过BufferedWriter写入output.txt中。
getScore:接口需要参数path,来源于result请求后的字符串,将path转换为相对地址pathName对应本地文件txt的名称,即可打开正确的比赛记录文件。和接口一类似从本地txt文件中读入比赛信息,通过JSONObject和JSONArray的嵌套使用过滤出需要的数据,写入output.txt。
printError:当iunput请求是不符合规定的请求时,调用该接口,在output.txt中写入字符串Error
由于开始编程时没有考虑有重复申请相同信息的情况,采取的是一次请求一次输出的方法,当样本量增大时时间复杂度太高。
所有11条不同指令消耗的时间(120ms):
11*10=110条指令消耗的时间(540ms):
1100条指令消耗的时间(3949ms):
可以明显发现时间复杂度几乎是线性增大的,解决的方法也很简单,建立合适的数据结构将筛选后的数据存储起来,实现数据的复用。但是这样几乎要把之前的代码推倒重来,观察发现这次的题目其实数据量不大,输出的数据也比较固定,总共只有11种合法指令,所以考虑第一次输出的同时将输出存储到哈希表中,之后遇到相同指令时直接从哈希表中取出数据即可,同样体现了数据的复用。
即使是这样修改之后,时间复杂度和室友对比之后发现仍然较高,检查发现原因是BufferedWriter没有实现复用,每次输出到output中时都要新建一个BufferedWriter,写入之后再关闭,浪费资源。于是将BufferedWriter也封装起来实现复用,性能取得巨大提升。
优化后:
所有11条不同指令消耗的时间(120ms->113ms):
11*10=110条指令消耗的时间(540ms->125ms):
1100条指令消耗的时间(3949ms->132ms):
10888条指令消耗的时间(221ms):
白盒测试:使用了一个包含11种合法输入的10890行的input.txt测试输出结果,得到output.txt共716760行,与舍友程序得到的结果进行对比,结果相同,基本能够通过白盒测试。
编写了一个test测试程序自动测试getPlayers接口能否输出正确的程序
在读写文件前先检查文件是否存在
检查是否是非法输入,通过正则表达式检验是否为result+比赛名的合法输入
try-catch捕获程序过程中的异常,而不会中断程序的执行。
1、基本了解了从网页爬取数据的步骤,对网页数据有了更多的理解。但是爬取数据的方法有待拓展,基本是通过api网址手动爬取保存到本地文件中,后续可以学习使用工具更方便地爬取。
2、初步掌握JSON解析的方法,能够从网页上爬取的数据进行解析,得到想要的某一部分数据,同时也涉及输入输出流的运用,从文件中读取大数据,进行解析得到部分数据,再输出到对应文件中,日常使用中也很好用。
3、封装思想。经过性能优化环节,对封装的作用有了更深理解,能实现代码和数据的复用,极大提升性能,之后编程过程中也会注意封装。
4、重视需求分析,一开始没有考虑到数据结构怎么建立,只考虑到一次输入一次输出,后续修改就非常麻烦了。所以之后会认真分析需求,建立合适的数据结构和接口,实现代码复用。