软件工程实践第二次作业---文件读取

这篇具有很好参考价值的文章主要介绍了软件工程实践第二次作业---文件读取。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这个作业属于哪个课程 <软件工程-23年春季学期>
这个作业要求在哪里 <软件工程实践第二次作业—文件读取>
这个作业的目标 <完成对澳大利亚网球公开赛相关数据的收集,并实现一个能够对赛事数据进行统计的控制台程序>
其他参考文献 《构建之法》《源代码管理》

目录:

0.Gitcode项目地址

  1. PSP表格
  2. 解题思路描述
    1. 从相关网址获取json
    2. json解析
    3. 数据提取分析
  3. 接口设计和实现过程
    1. 接口设计
    2. 接口实现
  4. 关键代码展示
  5. 性能改进
    1. 分析
    2. 改进
  6. 单元测试
  7. 异常处理
  8. 心得体会

0.Gitcode项目地址

仓库地址

1. PSP表格

PSP Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 10 10
• Estimate • 估计这个任务需要多少时间 10 10
Development 开发 600 500
• Analysis • 需求分析(包括学习新技术) 120 100
• Design Spec • 生成设计文档 20 50
• Design Review • 设计复审 60 60
• Coding Standard • 代码规范 (为目前的开发制定合适的规范) 20 30
• Design • 具体设计 120 60
• Coding • 具体编码 360 290
• Code Review • 代码复审 120 90
• Test • 测试(自我测试,修改代码,提交修改) 120 120
Reporting 报告 210 165
• Test Repor • 测试报告 80 60
• Size Measurement • 计算工作量 60 60
• Postmortem & Process Improvement Plan • 事后总结, 并提出过程改进计划 60 60
合计 1970 1665

2. 解题思路描述

2. 1 从相关网址获取json

​ 1、编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

​ 2、编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

​ 3、编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

​ 4、编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

2.2 json数据解析

编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

用vs打开压缩过的json数据,然后点击格式化

players.json的数据可以看成上面这几个部分,而我们主要需要提取的是players这一项

点开players这一项

查看编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

发现编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui
需要的数据都在里面

构成json-》players-》full_name / nationality->name /gender的树形结构,代码即可从这里入手

接着分析result date的json数据

总体分为编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

这样的一个结构

我们需要的数据在编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

点开matchs

看到我们需要的数据[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

2.3、数据提取分析

根据需求我们需要获得winner的名字,但是根据json文件我们只能获得team_id

如图编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

所以需要查看该文件内teams数组内的内容

如图编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

再由玩家hash值去该文件的players去查找

如图编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

代码编写也是按照如上思路去进行

3. 接口设计和实现过程

3.1接口设计

由需求可知需要将打印全部玩家与打印全部比赛结果提取出来,所以考虑使用java8的新属性,可在接口中使用静态方法,继承者可以直接调用接口中的静态方法

  • 第一步需要实现一个静态的writePlayers的方法,内部用阿里巴巴的fastjson去解析json数据,并且根据题目要求打印
  • 第二部需要实现静态的writeResults的方法,需要实现searchTeam与searchWinner的方法,去查找胜利的队伍内对应玩家的简称
  • 第三步提取输入内容的过程实现writeInfo函数,用于随时向output.txt输入内容
3.2实现过程
  • 由上述分析可知,需要先导入阿里巴巴的fastjson解析包,调用fastjson的jsonObject与jsonArray去解析对应数据

  • 然后调用内部api实现searchTeam与searchWinner的方法,去查找胜利的队伍内对应玩家的简称的关键代码

  • writePlayers函数与writeResults函数只需要调用对应api即可

4. 关键代码展示

  • 实现searchTeam与searchWinner的方法,去查找胜利的队伍内对应玩家的简称的关键代码
 //通过uuid查找队伍
     static JSONObject searchTeam(String teamUuid,JSONArray teams){
        for (int i = 0;i < teams.size();i++){
            if (teams.getJSONObject(i).getString("uuid").equals(teamUuid)){
                return teams.getJSONObject(i);
            }
        }
        return null;
    }

    //通过uuid数组查找选手
     static JSONArray searchWinners(String playerUuids,JSONArray players){
        JSONArray winners = new JSONArray();
        JSONArray uuids = JSONArray.parseArray(playerUuids);//需要查找的选手uuid
        for (int i = 0; i < uuids.size(); i++){
            String uuid = uuids.getString(i);
            for (int j = 0; j < players.size(); j++){
                if (players.getJSONObject(j).getString("uuid").equals(uuid)){
                    winners.add(players.getJSONObject(j));
                }
            }
        }
        return winners;
    }
  • 调用api实现打印全部选手的函数、
     //对应接口中的writePlayers代码如下
     static void writePlayers(String outputFile) throws Exception {
      if (cache.containsKey("players")) {
        // 重复请求
        writeInfo(cache.get("players"),outputFile);
        return;
      }
        JSONObject jsonObject = JSONObject.parseObject(getJSONStr(PLAYERS_FILES));
        JSONArray players = JSONArray.parseArray(jsonObject.getString("players"));//获取运动员json数组
        StringBuilder playersInfo = new StringBuilder();//遍历运动员数组,把相关信息加入文件输出
        for (int i = 0; i < players.size(); i++){
            JSONObject player = players.getJSONObject(i);
            playersInfo.append("full_name:" + player.getString("full_name") + "\n");
            playersInfo.append("gender:" + ("F".equals(player.getString("gender"))? "Female" : "Male") + "\n");
            playersInfo.append("nationality:" + player.getJSONObject("nationality").getString("name") + "\n");
            playersInfo.append("-----\n");
        }
        cache.put("players",playersInfo.toString());//第一次读取的时候
        writeInfo(playersInfo.toString(),outputFile);
    }

5. 性能改进

5.1 分析
  • 性能的优化主要在于I/O流的重复启动。例如如果输入的指令有重复的,则I/O流需要重复操作,不断重复代码的运行,代码运行的重复率较高
  • 输入流用FileWriter比较慢
5.2 改进
  • 使用hashMap存储key与data充当缓存机制的实现体,key对应的是players这样的命令,而data对应的是需要读取进输出文件的内容。这样每次读取指令先对hashMap中的指令进行查找,如果查找到了,则将hashMap的内容输出到输出文化,减少了代码运行的计算时间
HashMap<String,String> cache = new HashMap<>();//用于模拟缓存,反正指令重复导致的反复读写IO
 //每次读取前进行判断
if (cache.containsKey("players")) {
        // 重复请求
        writeInfo(cache.get("players"),outputFile);
        return;
}
      
cache.put("players",playersInfo.toString());//第一次读取的时候
//每次读取前进行判断
if(cache.containsKey(date)){
          writeInfo(cache.get(date),outputFile);
            return;
}
cache.put(date,resultsInfo.toString());
  • 使用BufferdWriter包装FileWriter去对输出流进行控制
//优化前
FileWriter fileWriter = new FileWriter(outputFile,true);
fileWriter.write(msg);
fileWriter.close();

//优化后
BufferedWriter bw = new BufferedWriter(new FileWriter(outputFile,true));
bw.write(msg);
bw.close();

对如图编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

这样测试之后改进前的程序运行时间为:编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

这样测试之后改进后的程序运行时间为:编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

速度快了将近500ms,速度快了将近5/7

6. 单元测试

测试采用java的Juit进行测试,在对应函数上写入@Test注释并按alt+enter进行maven依赖的导入

  • 对AOSearch.java的单元测试(主要对参数不同,与参数错误进行测试)
 @Test
  public void test1(){
    //错误的参数输入
    AOSearch.main(new String[]{"input.txt"});
  }
  @Test
  public void test1_1(){
    //错误的参数输入
    AOSearch.main(new String[]{"input"});
  }
  @Test
  public void test2(){
    //正确的参数个数输入
    AOSearch.main(new String[]{"input.txt","output.txt"});
  }
  @Test
  public void test2_1(){
    //正确的参数个数输入
    AOSearch.main(new String[]{"input.txt","put.txt"});
  }
  @Test
  public void test2_2(){
    //错误的参数输入,结果可以输出put文件,可正常写入,且可以用记事本查看
    AOSearch.main(new String[]{"input.txt","put"});
  }
  @Test
  public void test2_3(){
    //错误的参数输入结果可以输出put.p文件,可正常写入,且可以用记事本查看
    AOSearch.main(new String[]{"input.txt","put.p"});
  }
  @Test
  public void test3(){
    //不正确的参数输入,覆盖率较高,程序运行较为成功
    AOSearch.main(new String[]{"input.txt","output.txt","others.txt"});
  }
  @Test
  public void test3_1(){
    //不正确的参数输入,覆盖率较高
    AOSearch.main(new String[]{"input.txt","output","others.txt"});
  }

测试结果

1、对test1的测试编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

结果分析:class类的覆盖率50是因为,包中的测试类未实现,而方法覆盖率低是因为穿啊如的参数错误,代码执行的少,程序结束的快

2、对test1_1的测试编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

3、对test2的测试编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

4、对test2_1的测试编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

5、对test2_2的测试编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

6、对test2_3的测试编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

结果符合预期

  • 对Lib接口的测试(主要对,各种不一样参数的输入进行判断)
 @Test
  public void test1() {
    try{
      Lib.writePlayers("output.txt");
      Lib.writeInfo("aa","output.txt");
      Lib.writeResults("0116","output.txt");
      Lib.writeResults("0130","output.txt");
    }catch (Exception e){
      e.printStackTrace();
    }
  }

  @Test
  public void test1_1() {
    try{
      Lib.writePlayers("output");
      Lib.writePlayers("output.pp");
    }catch (Exception e){
      e.printStackTrace();
    }
  }

  @Test
  public void test1_2() {
    try{
      Lib.writeResults("Q55","output");
      Lib.writeResults("Q55","out.txt");
      Lib.writeResults("","out.txt");
    }catch (Exception e){
      e.printStackTrace();
    }
  }
  @Test
  public void test1_3() {
    try{
      Lib.writeResults("-11","out.txt");
      Lib.writeResults("-11","ahs");

    }catch (Exception e){
      e.printStackTrace();
    }
  }
  • 对test1的测试结果编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

  • 对test1_1的测试结果编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

  • 对test1_2的测试结果编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

  • 对test1_3的测试结果编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

总结:类覆盖率达到100%,是因为所以包中的类都对其进行了实现,方法覆盖率无法进一步提升是因为io流的限制

  • 实现自动单元测试

1、编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

2、编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

3、编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

4、挑选需要进行测试的member编写一个外部dd 文档用于描还长在工业大学图书馆里图书的基本情况,具体要求长,json,java,ui

7. 异常处理

  • 总体使用try…catch…finally对代码进行维护

public class AOSearch implements Lib{
    public static void main(String[] args) {
        //毫秒ms:
        long startTime=System.currentTimeMillis(); //获取开始时间
       ...
        try{...}
        }catch(Exception e){
            e.printStackTrace();
            System.out.println("错误");
        }finally {
            long endTime=System.currentTimeMillis(); //获取结束时间
            System.out.println("程序运行时间: "+(endTime-startTime)+"ms");
        }
    }
}
  • 还有抛出异常,返回给调用者处理
  • 例如:
static String getJSONStr(String fileName) throws IOException{
        File file = new File(fileName);
        if (file.exists()){
            //检查json文件是否存在
            FileInputStream fileInputStream = new FileInputStream(file);
            int length = fileInputStream.available();
            byte[] bytes = new byte[length];
            fileInputStream.read(bytes);
            String JSONStr = new String(bytes);//从文件中获取json字符串
            fileInputStream.close();
            return JSONStr;
        }else{
            throw new FileNotFoundException("未找到" + fileName);
        }
    }

8. 心得体会

这次作业主要的难点在于对于json数据的解析、单元测试的编写、性能的提升、还有打包文件的过程。打包文件为jar包每次都会碰到奇怪的问题,要花大量时间去处理。分析题目不难,难在对于输入各种异常结果的输出测试,文件结构相对简单,但是编写过程会遇到杂七杂八的问题需要查找与解决。文章来源地址https://www.toymoban.com/news/detail-840284.html

到了这里,关于软件工程实践第二次作业---文件读取的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 编程之道:【软件工程实践】构建成功项目的最佳实践

    在现代软件开发中,采用最佳实践是确保项目成功的关键之一。软件工程实践涵盖了项目的各个阶段,从需求分析到设计、实现和测试。本文将介绍这些阶段的最佳实践,以帮助确保您的软件项目按计划成功完成。 1. 需求分析阶段 需求分析是软件开发的基石,因为它为整个

    2024年02月10日
    浏览(47)
  • java 企业工程管理系统软件源码+Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis

      工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理    工程项目各模块及其功能点清单 一、系统管理     1、数据字典:实现对数据字典

    2024年02月10日
    浏览(56)
  • 构建之法 - 软件工程实践教学:一线教师的13问

    福州大学单红老师的软工课程总结 单红⽼师在总结中,提出了13条疑惑,《构建之法》的作者邹欣⽼师就单红⽼师提出的每⼀条疑惑,给出了⾃⼰的思考,与他进⾏探讨交流。欢迎你也来参与⼀起讨论。 1. 关于软件工程和软件工程实践课,安排时机的问题?目前是大三下,对

    2024年02月13日
    浏览(46)
  • java 企业工程管理系统软件源码+Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis em

     工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理    工程项目各模块及其功能点清单 一、系统管理     1、数据字典:实现对数据字典标

    2024年02月14日
    浏览(63)
  • 【IEEE会议】第二届IEEE云计算、大数据应用与软件工程国际学术会议 (CBASE2023)

    第二届IEEE云计算、大数据应用与软件工程国际学术会议 (CBASE2023) 随着大数据时代的到来,对数据获取的随时性和对计算的需求也在逐渐增长。为推动大数据时代的云计算与软件工程的发展,促进该领域学术交流,在CBASE 2022成功举办的基础上,由四川师范大学主办,四川师

    2024年02月12日
    浏览(44)
  • 构建之法 - 软件工程实践教学:每天都向前推进一点点

    作者:福州⼤学 汪璟玢⽼师 汪老师:每次都向前推进一点点,哪怕只有一点点,也好过什么都不做。 ​邹老师:对,几个学期下来,就已经超过那些“空想”的团队很远了。坚持下去! 汪老师:团队Git现场编程实战。 邹老师:这个效果很好,建议在更早的时间让学生实践

    2024年02月13日
    浏览(48)
  • STM32CubeMX软件介绍及工程文件生成

        STM32CubeMX 是用于 32 位 ARM Cortex STM32 微控制器的图形工具。它通过分步过程可以非常轻松地配置STM32微控制器和微处理器,以及为Arm® Cortex®-M内核或面向Arm® Cortex®-A内核的特定Linux®设备树生成相应的初始化C代码。 STM32CubeMX 是 ST 意法半导体近几年来大力推荐的STM3

    2024年02月12日
    浏览(60)
  • 软件工程开发文档写作教程(07)—招投标文件写作规范

    本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 本文参考资料:电子工业出版社《软件文档写作教程》 马平,黄冬梅编著 国内的软件项目招投标文件的写作规则并不存在行业标准。许多大型企业的信息化主管在他们的工作中,总是相互传递着一种或多种招标

    2024年02月03日
    浏览(69)
  • 在软件工程实践中,决定是否使用显式的 else 分支取决于几个因素,包括代码的清晰度、可维护性以及个人或团队的编码风格。

    在软件工程实践中,决定是否使用显式的 else 分支取决于几个因素,包括代码的清晰度、可维护性以及个人或团队的编码风格。不使用显式 else 分支的做法有一些潜在的优点: 减少嵌套层次 : 如果在每个 if 语句后都使用 else ,代码可能会变得过于嵌套,从而难以阅读和理解

    2024年01月17日
    浏览(52)
  • 第二次博客作业

    这是第二次博客作业,总结了近三次PTA大作业的完成情况,这三次的大作业难度逐渐增大,完全理不清逻辑,真的越想越混乱,代码写的也是很乱,没有一个整体的框架结构,读起来很困难,没有学到java程序编写的真谛,总之对于我,一个逻辑很差很差的人来说,越来越复杂

    2024年02月05日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包