这个作业属于哪个课程 | 软件工程社区 |
---|---|
这个作业要求在哪里 | 作业要求 |
这个作业的目标 | 完成对网球比赛的选手以及比赛信息的输出 |
其他参考文献 | 《构建之法》 |
文章目录
作业基本信息…
Gitcode项目地址
PSP表格
2.PSP表格
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 35 | 30 |
• Estimate | • 估计这个任务需要多少时间 | 35 | 25 |
Development | 开发 | 1000 | 1500 |
• Analysis | • 需求分析 (包括学习新技术) | 300 | 300 |
• Design Spec | • 生成设计文档 | 42 | 36 |
• Design Review | • 设计复审 | 20 | 20 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 30 | 60 |
• Design | • 具体设计 | 60 | 60 |
• Coding | • 具体编码 | 300 | 600 |
• Code Review | • 代码复审 | 60 | 30 |
• Test | • 测试(自我测试,修改代码,提交修改) | 60 | 120 |
Reporting | 报告 | 120 | 150 |
• Test Report | • 测试报告 | 30 | 20 |
• Size Measurement | • 计算工作量 | 10 | 10 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 30 | 20 |
合计 | 2132 | 2926 |
澳大利亚网球官网获取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的功能更加熟悉,使用起来也更加顺畅并且学习如何进行单元测试并且学习了一点改进代码性能的方法。