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

这个作业属于哪个课程 软件工程实践2022年春-F班
这个作业要求在哪里 软件工程实践第二次作业——个人实战
这个作业的目标 完成对赛事数据的爬取,并实现一个能够对国家排名及奖牌个数统计的控制台程序。
其他参考文献 CSDN

文章目录
    • Gitcode项目地址
    • PSP表格
    • 解题思路描述
      • 数据获取
      • 文件解析
      • 程序构建
    • 接口设计和实现过程
    • 关键代码展示
    • 性能改进
    • 单元测试
    • 异常处理
    • 心得体会

Gitcode项目地址 项目地址
PSP表格
PSP Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划
? Estimate ? 估计这个任务需要多少时间 30 20
Development 开发
? Analysis ? 需求分析 (包括学习新技术) 300 350
? Design Spec ? 生成设计文档 5 5
? Design Review ? 设计复审 10 20
? Coding Standard ? 代码规范 (为目前的开发制定合适的规范) 15 10
? Design ? 具体设计 20 30
? Coding ? 具体编码 300 400
? Code Review ? 代码复审 60 40
? Test ? 测试(自我测试,修改代码,提交修改) 30 150
Reporting 报告
? Test Repor ? 测试报告 60 80
? Size Measurement ? 计算工作量 15 20
? Postmortem & Process Improvement Plan ? 事后总结, 并提出过程改进计划 5 5
合计 850 1130
解题思路描述 数据获取
根据提供的网站,审查元素获得相应的数据,并通过转码网站进行转码,获得需要的数据。
文件解析
利用fastjson.jar的类对数据进行解析,完成对.json文件的解析。
程序构建
本次程序主要实现——输出奖牌总榜和输出每日赛程这两个基本功能,然后在进行优化。
接口设计和实现过程 程序主要进行对数据的处理和对用户指令的处理,程序主要分为两个部分一个是主类OlympicSearch和另外两个接口类schedule和Medal,主类主要进行对用户指令的处理,接口类主要是对奖牌 总榜和每日赛程这两类数据进行处理和输出。
关键代码展示 Medal类
int num = 0; JSONObject jsonObject0 = JSON.parseObject(Total); String data = https://www.it610.com/article/jsonObject0.get("data").toString(); JSONObject jsonObject1 = JSONObject.parseObject(data); num =jsonObject1.getInteger("total"); String medals = jsonObject1.getString("medalsList"); JSONArray medalsList = JSONArray.parseArray(medals); File f = new File(file); FileOutputStream fop = new FileOutputStream(f,true); OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8"); for (int i = 0; i < num; i++) { JSONObject jsonObject = JSONObject.parseObject( medalsList.get(i).toString()); String countryid = jsonObject.get("countryid").toString(); int rank = jsonObject.getInteger("rank"); int gold = jsonObject.getInteger("gold"); int silver = jsonObject.getInteger("silver"); int bronze = jsonObject.getInteger("bronze"); int total = jsonObject.getInteger("count"); writer.append("rank"+rank+":"+countryid+"\n"); writer.append("gold:"+gold+"\n"); writer.append("silver:"+silver+"\n"); writer.append("bronze:"+bronze+"\n"); writer.append("total:"+total+"\n"); writer.append("-----"+"\n"); } writer.close(); fop.close(); }

schedule类与medal类相似
JSONObject jsonObject0 = JSON.parseObject(text); jsonObject0 = (JSONObject) jsonObject0.get("data"); int total = jsonObject0.getInteger("total"); JSONArray matchList = jsonObject0.getJSONArray("matchList"); File f = new File(file); FileOutputStream fop = new FileOutputStream(f,true); OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8"); for (int i = 0; i < total; i++) { JSONObject jsonObject = JSONObject.parseObject( matchList.get(i).toString()); String sport = jsonObject.getString("itemcodename"); String time = jsonObject.getString("startdatecn"); String name = jsonObject.getString("title"); String venue = jsonObject.getString("venuename"); writer.append("time:"+time.substring(11,16)+"\n"); writer.append("sport:"+sport+"\n"); writer.append("name:"+name); if ((jsonObject.get("homename") != null) && (!jsonObject.getString("homename").equals(""))) { writer.append(" "+jsonObject.getString("homename")+"VS"+jsonObject.getString("awayname")); } writer.append("\n"); writer.append("venue:"+venue+"\n"); writer.append("-----\n"); } writer.close();

OlympicSearch类
File f = new File(file); FileOutputStream fop = new FileOutputStream(f,true); OutputStreamWriter writer = new OutputStreamWriter(fop, StandardCharsets.UTF_8); String[] date = {"0202","0203", "0204","0205","0206","0207","0208","0209","0210","0211","0212","0213","0214","0215","0216","0217","0218","0219","0220"}; if (str.equals("total")) { Medal.getMedal(file); } else if (str.matches("schedule (.*)")) { if (str.length()!=13) { writer.append("N/A\n"+"-----\n"); writer.close(); }//判后面空白的情况 else if (useLoop(date,str.substring(9,13))) { schedule.getSchedule(file,str.substring(9,13)); } else { writer.append("N/A\n"+"-----\n"); writer.close(); } } else if (str.equals("")) { } else { writer.append("Error\n"+"-----\n"); writer.close(); }

性能改进 优化了缓存,将已经输入过的文件存起来,减少了多次重复输入的时间。
单元测试 覆盖率测试
软件工程实践第二次作业——个人实战
文章图片

测试用例
软件工程实践第二次作业——个人实战
文章图片

软件工程实践第二次作业——个人实战
文章图片

异常处理 参数错误
if (args != null && args.length == 2) { input = args[0]; output = args[1]; } else { System.out.println("参数个数错误"); return; }

心得体会 【软件工程实践第二次作业——个人实战】这次作业其实完成得挺艰难的,自己对整个项目的把握是很差的,从一开始的解题思路和实际编码都是问题重重,还是感谢同学和舍友的帮助,在我没有思路时,可以帮我找到正确的思路。整个作业完成下来,让我对完成项目的整体规划有了长足进步。最后,还是希望在未来自己的编程能力可以有所增强。

    推荐阅读