软件工程实践第二次作业

这个作业属于哪个课程软件工程社区
这个作业要求在哪里作业要求
这个作业的目标完成对网球比赛的选手以及比赛信息的输出
其他参考文献《构建之法》


作业基本信息…

Gitcode项目地址

仓库链接

PSP表格

2.PSP表格

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

澳大利亚网球官网获取JSON

进入官网,在tournment下选择player或result
在这里插入图片描述
进入开发者工具,筛选器中筛选players
在这里插入图片描述
选择需要的文件点击----Players的JSON数据在这里插入图片描述
在这里插入图片描述

解题思路描述

添加第三方库

解析json需使用到第三方库如gson,jackson,org.json,fastjson等等
我使用了FastJson
fastjson jar下载

如何解析json

解析json的方法
1.如果看到是{ }–>使用JSONObject
2.如果看到的[ ]–>使用JSONArray解析

分步解析Players,Schedule

players的数据较为简单,full_name对应选手全名,gender为选手性别, nationality为国籍。
schedule的解析需要层层递进,matches下找到teams,teams下找到一个队伍的一场比赛信息。

文件读写

无法识别的指令,则输出Error
result后的日期不符合以下要求,则输出N/A

接口设计和实现过程

1>在AOSearch.java里只对输入input.txt的指令进行juageRight的判断
2>在Lib类放入所有工具函数,
PrintPlayers();//选手fullname, gender, nationName
readJson(String jsonPath);//读取JSON文件
setOutput(String path, String data);//文件输出
PrintResult(String date);//输出time,winner,score
findWinner(JSONObject js);//返回储存着winner的字符串数组
getscore(JSONObject js);返回储存着score的字符串数组
findtime(JSONObject js);//返回储存着time的字符串数组
juageRight(String date);//判断指令是否合法
readStringFromtxt(String txtpath)//文件读取
以及工具类Player;

关键代码展示

一.读取JSON
在这里插入图片描述
二.输出Players
在这里插入图片描述
三.输出Result
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

性能改进

一.对文件输入函数进行优化,可以将指令一行一行读入
在这里插入图片描述
在这里插入图片描述
二.优化AOSearch.java中对指令的条件判断
在这里插入图片描述
在这里插入图片描述
三.使用cache可以大大缩短缓存时间。

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
 Cache<String, String> cache = Caffeine.newBuilder().initialCapacity(5).maximumSize(19).expireAfterWrite(17, TimeUnit.SECONDS).build();
if (cache.getIfPresent(TTT[0]) == null) { //如果缓存中没有这条指令则将其存入缓存
                       playersInfo = Lib.printPlayers(Lib.readStringFromtxt(Lib.PLAYERS_JSON).toString());
                      // playersInfo = LibTest.writeTest(); cache优化测试
                       cache.put(TTT[0], playersInfo);
                   }else { //如果缓存中存在这条指令则从缓存中获取
                       playersInfo = cache.getIfPresent(TTT[0]);
                   }
                   Lib.setOutput(Lib.OUTPUTFILE, playersInfo);

在这里插入图片描述
在这里插入图片描述

单元测试

利用Junit5测试覆盖率
在这里插入图片描述
在这里插入图片描述

异常处理

if (TTT.length==2) {
                   if (TTT[0].equals("result")){
                       if(Lib.juageRight(TTT[1])){
                           Lib.printResult(TTT[1]);
                           //System.out.println(TTT[1]);
                       }
                       else{
                           bw = new BufferedWriter(new FileWriter("C:\\Users\\xdwhhh\\Desktop\\project-java\\222000124\\output.txt",true));
                           stringBuffer.append("N/A"+ "\n");
                           stringBuffer.append("-----" + "\n");
                           bw.write(stringBuffer.toString());
                           bw.close();
                       }
                   }else{
                       //RRR="N/A"+"\n"+"-------"+"\n";
                       //Lib.setOutput("C:\\Users\\xdwhhh\\Desktop\\project-java\\222000124\\output.txt", RRR);
                       bw = new BufferedWriter(new FileWriter("C:\\Users\\xdwhhh\\Desktop\\project-java\\222000124\\output.txt",true));
                       stringBuffer.append("ERROR"+ "\n");
                       stringBuffer.append("-----" + "\n");
                       bw.write(stringBuffer.toString());
                       bw.close();

心得体会

这次实践作业刚看到的时候,一头雾水,甚至不知道作业的要求,一种无从下手的感觉,刚开始做的时候,并没有考虑封装接口,一股脑的把所有功能都往AOSearch里面加,中途出现了不知道功能与功能的划分,不知道该往json的哪一层解析了,这才开始封装,但我用的仍然是最笨的办法,将result的数据分为三个字符串数组,最后一起遍历;这次作业的收获,不仅让我对gitcode的功能更加熟悉,使用起来也更加顺畅并且学习如何进行单元测试并且学习了一点改进代码性能的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值