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

222000303陈博源 学生 2023-03-03 19:05:33
这个作业属于哪个课程2023年福大-软件工程实践-W班
这个作业要求在哪里软件工程实践第二次作业——个人实战
这个作业的目标1、编写程序输出2023年澳大利亚网球公开赛的选手信息和比赛结果
2、撰写博客
其他参考文献单元测试和回归测试

目录

  • Gitcode项目地址
  • PSP表格
  • 解题思路描述
  • 读取JSON
  • 整体思路
  • 接口设计和实现过程
  • 关键代码展示
  • 性能改进
  • 单元测试
  • 异常处理
  • 心得体会

Gitcode项目地址

项目地址

PSP表格

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

解题思路描述

读取JSON

助教已经为我们取得了JSON文件,我们需要的就只有去读取JSON文件,为此我使用了阿里巴巴的fastjson2来读取JSON文件里的数据。

整体思路

因为指令都放在输入文件里面,所以要先去读取输入文件来分别去执行指令,根据指令来执行不同的方法去在输出文件中写入信息。实现输出比赛选手信息和结果的关键就是对JSON文件数据的解析。

接口设计和实现过程

建立一个Players类,里面包含静态方法playersOutput来输出比赛选手信息。实现通过jsonObject和JSONArray来遍历JSON数据获取选手信息。
建立一个Result类,里面包含静态方法resultOutput来输出比赛结果。实现通过jsonObject和JSONArray来遍历JSON数据获取比赛结果信息,由于需要各种跳,方法包含大量的for循环和if-else,显得是否冗余。

关键代码展示

    /**
     * 输出选手信息
     * @param path 输出文件的路径
     */
    public static void playersOutput(String path) throws IOException
    {
        JSONArray playersJArr = playersJsonArr("src/data/players.json");
        File file = new File(path);
        FileWriter fileWriter = new FileWriter(file, StandardCharsets.UTF_8, true);
        for (int i = 0; i < playersJArr.size(); i++)
        {
            JSONObject playerJObj = playersJArr.getJSONObject(i);
            fileWriter.write("full_name:" + playerJObj.get("full_name").toString() + "\n");
            String gender = playerJObj.get("gender").toString().equals("M") ? "male" : "female";
            fileWriter.write("gender:" + gender + "\n");
            JSONObject nationalityJO = playerJObj.getJSONObject("nationality");
            String nationality = nationalityJO.get("name").toString();
            fileWriter.write("nationality:" + nationality + "\n");
            fileWriter.write("-----\n");

        }
        fileWriter.close();
    }
    /**
     * 输出比赛结果
     * @param date 日期
     * @param path 输出文件的路径
     */
    public static void resultOutput(String date, String path) throws IOException
    {
        if (isValidDate(date))
        {
            File file = new File(path);
            FileWriter fileWriter = new FileWriter(file, StandardCharsets.UTF_8, true);
            Path jsonPath = Paths.get("src/data/schedule/" + date + ".json");
            String jsonStr = Files.readString(jsonPath, StandardCharsets.UTF_8);
            JSONObject scheduleObj = JSONObject.parseObject(jsonStr);
            JSONArray matchesJArr = scheduleObj.getJSONArray("matches");
            for (int i = 0; i < matchesJArr.size(); i++)
            {
                JSONObject matchJObj = matchesJArr.getJSONObject(i);
                String state = matchJObj.get("match_state").toString();
                if (state.equals("Complete"))
                {
                    fileWriter.write("time:" + matchJObj.get("actual_start_time").toString() + "\n");
                    JSONArray teamsJArr = matchJObj.getJSONArray("teams");
                    String score = "";
                    JSONArray scoreJArr1 = teamsJArr.getJSONObject(0).getJSONArray("score");
                    JSONArray scoreJArr2 = teamsJArr.getJSONObject(1).getJSONArray("score");
                    for ( int j = 0; j < scoreJArr1.size(); j++)
                    {
                        score += scoreJArr1.getJSONObject(j).get("game").toString() + ":" +
                                scoreJArr2.getJSONObject(j).get("game").toString();
                        if (j < scoreJArr1.size() - 1)
                        {
                            score += " | ";
                        }
                    }
                    for (int j = 0; j < teamsJArr.size(); j++)
                    {
                        JSONObject teamJObj = teamsJArr.getJSONObject(j);
                        if (teamJObj.get("status") != null && teamJObj.get("status").toString().equals("Winner"))
                        {
                            String teamID = teamJObj.get("team_id").toString();
                            JSONArray teamsJArr2 = scheduleObj.getJSONArray("teams");
                            String[] playersID = new String[2];
                            for (int k = 0; k < teamsJArr2.size(); k++)
                            {
                                JSONObject teamJObj2 = teamsJArr2.getJSONObject(k);
                                if (teamJObj2.get("uuid").toString().equals(teamID))
                                {
                                    JSONArray playersJArr = teamJObj2.getJSONArray("players");
                                    for (int m = 0; m < playersJArr.size(); m++)
                                    {
                                        playersID[m] = playersJArr.get(m).toString();
                                    }
                                    break;
                                }
                            }
                            JSONArray playersJArr = scheduleObj.getJSONArray("players");
                            String winner1 = "";
                            String winner2 = "";
                            for (int k = 0; k < playersJArr.size(); k++)
                            {
                                JSONObject playerJObj = playersJArr.getJSONObject(k);
                                if (playerJObj.get("uuid").toString().equals(playersID[0]))
                                {
                                    winner1 = playerJObj.get("short_name").toString();
                                }
                                if (playersID[1] != null && playerJObj.get("uuid").toString().equals(playersID[1]))
                                {
                                    winner2 = playerJObj.get("short_name").toString();
                                }
                            }
                            fileWriter.write("winner:" + winner1);
                            if (!winner2.equals(""))
                            {
                                fileWriter.write(" & " + winner2);
                            }
                            fileWriter.write("\n");
                            break;
                        }
                    }
                    fileWriter.write("score:" + score + "\n");
                    fileWriter.write("-----\n");
                }
                else
                {
                    fileWriter.write("W/O\n");
                    fileWriter.write("-----\n");
                }
            }
            fileWriter.close();
        }
        else
        {
            InvalidOutput.output(path, "N/A");
        }
    }
    public static void main(String[] args)
    {
        File file = new File(args[1]);
        try
        {
            if (!file.exists()) {
                file.createNewFile();
            }
            else {
                file.delete();
                file.createNewFile();
            }
            BufferedReader reader;
            reader = new BufferedReader(new FileReader(args[0]));
            String cmd = reader.readLine();
            while (cmd != null)
            {
                cmd = cmd.strip();
                if (cmd.equals("players"))
                {
                    Players.playersOutput(args[1]);
                }
                else if (cmd.startsWith("result "))
                {
                    String date = cmd.substring(7);
                    date = date.strip();
                    Result.resultOutput(date, args[1]);
                }
                else
                {
                    InvalidOutput.output(args[1], "Error");
                }
                cmd = reader.readLine();
            }
        }
        catch (IOException ex)
        {
            System.out.println(ex.getMessage());
        }
    }

性能改进

在for循环里一旦取得所需要的数据就break跳出循环。

单元测试

    @Test
    public void main() {
        File file = new File("input.txt");

        try {
            if (!file.exists()) {
                file.createNewFile();
            } else {
                file.delete();
                file.createNewFile();
            }

            FileWriter fileWriter = new FileWriter(file, StandardCharsets.UTF_8, true);
            fileWriter.write("players\n");
            fileWriter.write(" players\n");
            fileWriter.write("player\n");
            fileWriter.write("player s\n");
            fileWriter.write("result 0116\n");
            fileWriter.write(" result 0116\n");
            fileWriter.write("result0116\n");
            fileWriter.write("result 0301\n");
            fileWriter.write("result sss\n");
            fileWriter.write("ab/s'ds;s\n");
            fileWriter.close();
        } catch (IOException var3) {
            System.out.println(var3.getMessage());
        }

        AOSearch.main(new String[]{"input.txt", "output.txt"});
    }

img

img

异常处理

有进行IOException的异常处理。

心得体会

太久没写JAVA了,有点不熟悉怎么写代码。而且这个作业说实话还挺麻烦的,既要写代码还要写文档和博客,要花费不少时间。读取解析JSON文件也是从来都没有去做过的事,需要去网上查找许多资料,而且还要去理清楚JSON的结构(特别是输出比赛结果,跳来跳去的)。这次代码也完成的不是很好,有点冗余了,一堆for循环。希望下次作业能做得更好。

...全文
141 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

688

社区成员

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

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