软工实践寒假作业(2/2)

软工实践寒假作业(2/2)

这个作业属于哪个课程 2020春s班
这个作业要求在哪里 软工实践寒假作业要求
这个作业的目标 开发一个简易疫情统计程序,熟悉GitHub使用
作业正文 软工实践寒假作业(2/2)
其他参考文献 知乎、博客园、CSDN

一、GitHub仓库地址

https://github.com/ZhangJiaWeiDEV/InfectStatistic-main

二、构建之法&PSP

2.1学习《构建之法》

2.2PSP表格

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

三、解题思路

3.1理清文档结构

2217001118
  \--src
    \--InfectStatistic.java
    \--Lib.java
src下源代码【仅】允许包括这两个文件,Lib可以为空但必须存在
  \--README.md
描述项目,包括如何运行、功能简介、作业链接、博客链接等
  \--codestyle.md
描述代码风格

3.2使用GitHub与GitHubDesktop

  • 下载git与Github Desktop,fork主仓库到自己的仓库
  • 学习git命令和Github Desktop基本操作,了解commit,.gitignore,push,pr等

3.3需求整理

  命令行(win+r cmd)cd到项目src下,之后输入命令java InfectStatistic list
后面的参数可以为:

  • -log 指定日志目录的位置,该项必会附带,请直接使用传入的路径,而不是自己设置路径。
  • -out 指定输出文件路径和文件名,该项必会附带,请直接使用传入的路径,而不是自己设置路径。
  • -date 指定日期,不设置则默认为所提供日志最新的一天。你需要确保你处理了指定日期以及之前的所有log文件。
  • -type 可选择[ip: infection patients 感染患者,sp: suspected patients 疑似患者,cure:治愈 ,dead:死亡患者],使用缩写选择,如 -type ip 表示只列出感染患者的情况,-type sp cure则会按顺序【sp, cure】列出疑似患者和治愈患者的情况,不指定该项默认会列出所有情况。
  • -province 指定列出的省,如-province 福建,则只列出福建,-province 全国 浙江则只会列出全国、浙江。
      命令中必须包含-log和-out,其余参数没有则取默认值。

样例:java InfectStatistic list -date 2020-01-22 -log D:/log/ -out D:/output.txt

  通过观察分析样例发现,命令行命令除去首部的运行命令“java InfectStatistic”,剩余的部分会保存在args[]中,而参数为固定的-log、-out、-date...,因此可以通过判断args中的字符串是否与这些参数相等,并提取后方的所需数据。
  命令中没有出现的参数则取默认值,题目中没有表面参数的顺序是否固定,所以当参数顺序不一样时也要能够进行处理,比如

java InfectStatistic list -out D:/output.txt -date 2020-01-22 -log D:/log/

3.4日志样本分析

日志文件的命名遵守对应的规范: 年-月-日.log.txt ,如

2020-01-22.log.txt

  由于日志文件命名格式固定,所以直接删除掉尾部的".log.txt"便可获取该日志文件的日期。
该日志中出现以下几种情况:
1、<省> 新增 感染患者 n人
2、<省> 新增 疑似患者 n人
3、<省1> 感染患者 流入 <省2> n人
4、<省1> 疑似患者 流入 <省2> n人
5、<省> 死亡 n人
6、<省> 治愈 n人
7、<省> 疑似患者 确诊感染 n人
8、<省> 排除 疑似患者 n人
  分析上述情况,可发现谓语包括“新增”、“流入”、“死亡”、“治愈”、“确诊感染”以及“排除”,其中的“新增”以及“流入”又有“感染患者”和“疑似患者”两种处理对象。
  所以对于文件里的每行记录,可以通过判断字符串中含有的谓语类别来进行分类,分开处理增加或减少的人数。

3.5创建数据结构

  分析需要输出的内容容易发现,省份名称必须输出,还要根据参数来选择输出该省的感染人数、疑似患者人数、治愈人数以及死亡人数。所以可以创建一个Province类:

public class Province{
  private String name; //省份名称
  private int infectNumber; //感染人数
  private int suspectNumber; //疑似人数
  private int cure; //治愈人数
  private int dead; //死亡人数
  //构造等其他方法
  ...
}

四、设计实现过程

开始.png

五、代码说明

Province类:
  Province对象通过add(String object, int number)和minus(String object, int number)来直接控制属性的增多和减少,比如
  新增疑似患者5人就是只需调用add("疑似患者",5)
  治愈10人就是调用minus("感染患者",10)和add("治愈",10)

public class Province{
  private String name; //省份名称
  private int infectNumber; //感染人数
  private int suspectNumber; //疑似人数
  private int cure; //治愈人数
  private int dead; //死亡人数
  //add函数参数为增加的对象object和增加的人数number
  public void add(String object, int number)
  {
    switch(object)
    {
      case "感染患者":
      this.infectNumber += number;
      break;
      case "疑似患者":
      this.suspectNumber += number;
      break;
      case "治愈":
      this.cure += number;
      break;
      case "死亡":
      this.dead += number;
      default:
      break;
    }
  }
  //构造函数和get函数此处不做说明,minus函数和add函数类似,也不作说明
}

获取cmd命令的参数和值:
  比如输入以下cmd命令

java InfectStatistic list -date 2020-01-22 -log D:/log/ -out D:/output.txt

后,args[]的值如下
args[0]为"list"
args[1]为"-date"
args[2]为"2020-01-22"
args[3]为"-log"
args[4]为"D:/log/"
args[5]为"-out"
args[6]为"D:/output.txt"
  程序通过直接对args进行处理来获得参数和值

for(int i = 0; i < args.length; i++)
{
  switch(args[i])
  {
    case "-log":
      log = args[i + 1];
      break;
    case "-out":
      out = args[i + 1];
      break;
    case "-date":
      date = args[i + 1];
      break;
    case "ip":
      type[typeNumber] = "ip";
      typeNumber++;
      break;
    case "sp":
      type[typeNumber] = "sp";
      typeNumber++;
      break;
    case "cure":
      type[typeNumber] = "cure";
      typeNumber++;
      break;
    case "dead":
      type[typeNumber] = "dead";
      typeNumber++;
      break;
    case "-province":
      while(i < args.length - 1)
      {
        if(!args[i + 1].contains("-"))
        {
          outputProvince[outputNumber] = args[i + 1];
          outputNumber++;
        }
        else
        {
          break;
        }
        i++;
      }
    default:
      break;
  }
}

将需要输出的省份按拼音排序:
  使用 CHINA 的 Collator 来对汉字进行排序

public static void provinceSort()
{
  //数据交换防止Array.sort因存在空指针的报错
  String string[] = new String[outputNumber];
  for(int i = 0; i < outputNumber; i++)
  {
    string[i] = outputProvince[i];
  }
  Comparator< Object > cmp = Collator.getInstance(java.util.Locale.CHINA);
  Arrays.sort(string, cmp);
  for(int i = 0; i < outputNumber; i++)
  {
    outputProvince[i] = string[i];
  }
}

六、单元测试

Text1 先对给出的第一个样例进行测试

命令:java InfectStatistic list -date 2020-01-22 -log C:/Users/张嘉伟的电脑/Documents/GitHub/InfectStatistic-main/example/log/ -out C:/Users/张嘉伟的电脑/Desktop/demo.txt
text1.png
运行成功!

Text2 对给出的第二个样例进行测试

命令:java InfectStatistic list -date 2020-01-22 -log C:/Users/张嘉伟的电脑/Documents/GitHub/InfectStatistic-main/example/log/ -out C:/Users/张嘉伟的电脑/Desktop/demo.txt -province 福建 河北
text2.png
运行成功!

Text3 对给出的第三个样例进行测试

命令:java InfectStatistic list -date 2020-01-22 -type cure dead ip -log C:/Users/张嘉伟的电脑/Documents/GitHub/InfectStatistic-main/example/log/ -out C:/Users/张嘉伟的电脑/Desktop/demo.txt -province 全国 浙江 福建
text3.png
运行成功!

Text4 对自己编写的较为复杂的命令进行测试

命令:java InfectStatistic list -province 四川 浙江 北京 全国 湖北 福建 -type dead ip cure -out C:/Users/张嘉伟的电脑/Desktop/demo.txt -log C:/Users/张嘉伟的电脑/Documents/GitHub/InfectStatistic-main/example/log/ -date 2020-01-25
text4.png
运行成功!

七、单元测试覆盖率优化

覆盖率:覆盖率.png

八、代码规范链接

https://github.com/ZhangJiaWeiDEV/InfectStatistic-main/blob/master/221701118/codestyle.md

九、心路历程及收获

  该次作业相较于上次作业增添了很多需要新学的东西,这次的需求刚开始看的时候觉得很复杂,但开始上手码代码后发现还是挺简单,都是些对于以前所学知识的灵活运用。在这次作业中,编程方面遇到的最大的问题就是汉字的拼音排序,查询了很多资料试了很多方法要么是不能完全正确地排序、要么是直接报错,最后还是重审代码时发现被排序的数组里含有空指针而Arrays的排序里并不允许。。。。
  之前我也稍微使用过github,下载了GitHubDesktop也有自己的账号,虽然并不怎么使用也不熟悉,但这次作业里github方面进行得还是很顺利的.
  这次作业对我而言最困难的是后面的单元测试,PSP、单元测试什么的以前从来没有接触过,刚开始做这次作业时对此也不怎么重视。后来阅读了《构建之法》后,发现里面提到了许多问题都是自己目前存在的,即使自己以前有意无意的一些开发风格和习惯,都会影响着一个软件的成功与否。今后,做软件开发不仅仅要学新技术,提高技术水平,还要不断学习如何开发、如何规范、如何管理,不断练习实践,把解决常遇到的问题变成习惯,才能更好地去开发软件。

十、JAVA学习的五个仓库

  1. JavaGuide
    链接:https://github.com/ZhangJiaWeiDEV/JavaGuide
    简介: 涵盖大部分Java程序员所需要掌握的核心知识。

  2. technology-talk
    链接:https://github.com/ZhangJiaWeiDEV/technology-talk
    简介:汇总java生态圈常用技术框架、开源中间件,系统架构、项目管理、经典架构案例、数据库、常用三方库、线上运维等知识。

  3. fullstack-tutorial
    链接:https://github.com/ZhangJiaWeiDEV/fullstack-tutorial
    简介:后台技术栈/全栈开发/架构师之路,秋招/春招/校招/面试。

  4. advanced-java
    链接:https://github.com/ZhangJiaWeiDEV/advanced-java
    简介:Java 工程师进阶知识完全扫盲:涵盖高并发、分布式、高可用、微服务等领域知识,后端同学必看,前端同学也可学习。

  5. JCSprout
    链接:https://github.com/ZhangJiaWeiDEV/JCSprout
    简介:处于萌芽阶段的 Java 核心知识库。

作者:zhang_jw
链接:https://www.cnblogs.com/zjwblogs/p/SoftwareVacationWork2.html

posted @ 2020-02-21 21:21  zhang_jw  阅读(178)  评论(3编辑  收藏  举报