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

222000309李典游 学生 2023-03-03 21:53:35

作业基本信息

这个作业属于哪个课程<2023年福大-软件工程实践-W班>
这个作业要求在哪里<软件工程实践第二次作业——个人实战>
这个作业的目标<完成对澳网选手和比赛数据的收集,并实现一个能够对赛事数据进行统计并输出的控制台程序>
其他参考文献《构建之法》

目录

  • 作业基本信息
  • 1.Gitcode项目地址
  • 2.PSP表格
  • 3.解题思路描述
  • 3.1.从澳网上获取相关json数据
  • 3.2.对JSON文件进行解析
  • 3.3.使用fastjson库函数将json文件转为字符串输出,依次遍历
  • 4.接口设计和实现过程
  • 5.关键代码展示
  • 5.1.Judge_Date(String str)函数:判断input.txt文件中result后的日期是否符合要求
  • 5.2.Read_Json(String json)函数:读取JSON文件转换为字符串形式
  • 5.3.Get_Result(String str)函数:根据result后跟的参数输出要写入output.txt的字符串
  • 6.性能改进
  • 7.单元测试
  • 8.异常处理
  • 9.心得体会

1.Gitcode项目地址

香积成寿寺的仓库地址

2.PSP表格

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

3.解题思路描述

3.1.从澳网上获取相关json数据

players数据和0116到0122的数据已提供,其余比赛日的比赛数据则从澳网官网中获取
进入澳网官网页面,搜索results,按F12开启浏览器开发者模式,选择网络项,搜索results,找到对应的json文件并下载到本地。

img

3.2.对JSON文件进行解析

我采用的是引入com.alibaba.fastjson包对JSON文件进行解析。在项目中引入com.alibaba.fastjson.JSON,com.alibaba.fastjson.JSONArray,
com.alibaba.fastjson.JSONObject三个包,用来解析相对应的JSON对象

3.3.使用fastjson库函数将json文件转为字符串输出,依次遍历

players.json文件的处理:先用JSONObject获取存储在src/data文件目录下的player.json文件,再用JSONArray存取相应的players节点,依次遍历输出,并形成需要输出的字符串形式
results.json文件的处理:根据input.txt中result后所跟的参数,生成JSON文件的路径,并从中提取相应的matches比赛信息,判断是否存在弃赛的情况,再从中取出actual_start_time,并作为时间输出;而获取胜利者则先要找到胜利队伍的ID,再去寻找比赛胜利者的ID;获取比分要先获取两队每轮的比分,再按照譬如:score:6:4 | 6:3的格式加入字符串;最后将比赛实际开始时间,比赛实际开始时间以及每一轮双方的比分拼接在一起成为一个字符串
信息

4.接口设计和实现过程

我的程序分为AOSearch类和Lib类
AOSearch类只包含一个主函数,用来判断输入指令的参数个数是否正确,并构造一个Lib类对象
Lib类中包含了主要的接口和函数

  • Read_Commands方法,生成带缓存器的读写器,读取input.txt中的指令,根据文本中的内容逐行判断要进行怎样的操作,对于要输出所有选手信息的指令,要调用Read_Json方法读取相应的JSON文件,转换成JSONObject对象,并获取其中的选手全名,性别和国籍信息,拼接成一个字符串输出到output.txt文件中;如果经过判断是符合规则的result指令,则调用Get_Result方法,生成要输出的字符串;如果经过判断不符合指令要求,也要判断是Erro类型错误还是N/A类型错误
  • Get_Result方法,根据result后跟的参数输出要写入output.txt的字符串,具体来说就是解析schedule文件中的这些JSON文件,首先要判断是否有弃赛的情况,再从中取出actual_start_time,并作为时间输出;而获取胜利者则先要找到胜利队伍的ID,再去寻找比赛胜利者的ID;获取比分要先获取两队每轮的比分,再按照譬如:score:6:4 | 6:3的格式加入字符串;最后将比赛实际开始时间,比赛实际开始时间以及每一轮双方的比分拼接在一起成为一个字符串,并返回给Read_Commands方法
  • Read_Json方法和Judge_Date方法分别完成了读取JSON文件转成字符串和判断input.txt文件中result后的日期是否符合要求的操作

5.关键代码展示

5.1.Judge_Date(String str)函数:判断input.txt文件中result后的日期是否符合要求

public boolean Judge_Date(String str)
{
    if (str.charAt(0) == 'Q' && str.length() == 2)
    {
        if (str.charAt(1) == '1' || str.charAt(1) == '2' || str.charAt(1) == '3' || str.charAt(1) == '4' )
            return true;
        else 
            return false;
            
    }
    else if (str.charAt(0) == '0' && Integer.valueOf(str).intValue() >= 116&&Integer.valueOf(str).intValue() <= 129 && str.length() == 4)
        return true;
    
    return false;
}

5.2.Read_Json(String json)函数:读取JSON文件转换为字符串形式

public String Read_Json(String json) throws IOException
{
    String js = " ";
    try 
    {
        BufferedReader br = new BufferedReader(new FileReader(new File(json)));
        StringBuilder sb = new StringBuilder();
        while (true) 
        {
            int ch = br.read();
            if (ch != -1) 
            {
                sb.append((char) ch);
            } 
            else 
                break;
            
            
        }
        js = sb.toString();
    } 
    catch (FileNotFoundException e) 
    {
        e.printStackTrace();
    }
    
    return js;
}

5.3.Get_Result(String str)函数:根据result后跟的参数输出要写入output.txt的字符串

public String Get_Result(String str) 
{
    String result = "";
    try 
    {
        JSONObject jo = JSON.parseObject(Read_Json("src/data/" + str + ".json"));
        JSONArray ja = jo.getJSONArray("matches");
        for (int i = 0; i < ja.size(); i++) 
        {
                        JSONObject match = ja.getJSONObject(i);
                        JSONObject match_status = match.getJSONObject("match_status");
                
                        if (match_status.getString("abbr").equals("W/O"))
                        {
                            result += "W/O\n-----\n";
                            continue;
                        }
                
                        result += "time:";
                        String time = match.getString("actual_start_time");
                        result += time;
                
                        JSONArray teams = ja.getJSONObject(i).getJSONArray("teams");
                        JSONObject team_a = teams.getJSONObject(0);
                        JSONObject team_b = teams.getJSONObject(1);
                
                        String winner_id = " ";
                        if (team_a.get("status") != null) 
                            winner_id = team_a.getString("team_id");
                        else 
                            winner_id = team_b.getString("team_id");
                
                        result += "\nwinner:";
                        String winner = " ";
                        JSONArray team = jo.getJSONArray("teams");
                        JSONArray players = jo.getJSONArray("players");
                
            for (int k = 0 ; k < team.size() ; k++) 
                       {
                            String team_id = team.getJSONObject(k).getString("uuid");
                            if (team_id.equals(winner_id)) 
                            {
                                team.getJSONObject(k).getJSONArray("players");
                                for (int l = 0; l < team.getJSONObject(k).getJSONArray("players").size(); l++) 
                                {
                                    String id = team.getJSONObject(k).getJSONArray("players").getString(l);
                                    for (int m = 0; m < players.size(); m++) 
                                    {
                                        JSONObject player = (JSONObject) players.get(m);
                                        String uuid = (String) player.get("uuid");
                                        if (uuid.equals(id)) 
                                        {
                                            winner = player.getString("short_name");
                                            result += winner;
                                        }
                                    }
                                }
                            }
                         }
                
                        result += "\nscore:";
                        JSONArray  score_a = team_a.getJSONArray("score");
                        JSONArray score_b = team_b.getJSONArray("score");
                
                       for (int j = 0; j < score_a.size()-1 ; j++)
                        {
                            result += score_a.getJSONObject(j).getString("game");
                            result += ":";
                            result += score_b.getJSONObject(j).getString("game");
                            result += "|";
                        }
                
                        result += score_a.getJSONObject(score_a.size()-1).getString("game");
                        result += ":";
                        result += score_b.getJSONObject(score_a.size()-1).getString("game");
                        result += "\n-----\n";
                
        }    
    } 
    catch (IOException e) 
    {
        e.printStackTrace();
    }
        
    return result;
}

6.性能改进

  • 使用一个map数据结构,将已转换成字符串的JSON文件进行记录并保存。通过在map中查找是否之前已经转换过要读取的JSON文件,避免重复转换json文件。
  • 利用java.io.BufferedReader和java.io.BufferedWriter带缓存的读写器类,这些带缓存的类通过缓存机制增强了读写器的输入输出效率

7.单元测试

img

8.异常处理

我对包含可能出现I/O读取异常的函数都添加了try和catch,对抛出的异常进行提示输出
主函数中我添加了一个用来判断输入指令的参数个数是否正确的异常处理
对于input.txt中无法输出的指令进行相对应的错误输出

9.心得体会

  • 通过这次个人实战设计,打破了我以往对软件工程设计的陈旧的见解,我认识到了一个真正的项目不仅仅是把项目代码写完提交就完事了,还有很多前置准备工作和后续完善工作要完成。在以后的团队协作项目中,我们不仅要编写代码,还要做PSP表格,预估并记录我们工作的完成效率,提前做好需求分析,编写好代码规范,并确定相应的封装接口和功能模块。在编写完程序以后,还要做单元测试和性能分析,并不断地去优化和调整,这些都是以后完成一个项目一定要完成的内容。
  • 以后有任务一定要提前编写博客,不要等到最后截止时期之前再匆匆忙忙写博客。这次博客的编写我放在了最后,结果之前代码编写的一些内容和过程已经有点模糊不清了,以后要养成边写代码边写博客的习惯。
...全文
145 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

688

社区成员

发帖
与我相关
我的任务
社区描述
2023年福州大学软件工程实践课程W班的教学社区
软件工程团队开发软件构建 高校 福建省·福州市
社区管理员
  • FZU_SE_teacherW
  • 张书旖
  • 郭渊伟
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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