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

这个作业属于哪个课程 软件工程实践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 = 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();
        }


性能改进

优化了缓存,将已经输入过的文件存起来,减少了多次重复输入的时间。


单元测试

覆盖率测试
软件工程实践第二次作业——个人实战_第1张图片
测试用例
软件工程实践第二次作业——个人实战_第2张图片
软件工程实践第二次作业——个人实战_第3张图片


异常处理

参数错误

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

心得体会

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

你可能感兴趣的:(经验分享)