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

>软工实践寒假作业(2/2)
这个作业属于哪个课程 <2020春S班>
这个作业要求在哪里 作业要求
这个作业的目标 <掌握github的使用、PSP表格、疫情统计程序>
作业正文 ....
其他参考文献 知乎、菜鸟教程

一、Github仓库地址

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

二、PSP表格

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

解体思路描述

  • 首先是命令行参数的识别。在CSDN上学习了相关知识:、java学习之命令行参数通过命令行传递参数
  • 其次是日志的读取。学会了读取指定文件夹内所有文件的知识:JAVA基础知识之File类。
  • 之后是分析日志内容的编码。因为有些偷懒,所以没有去学习JAVA的正则表达式,写了一大堆代码。
  • 最后是txt文档的生成。就是先得到结果,在输出到文件。

四、设计实现过程

因为做作业的时候,时间也比较紧张了,所以并没有花心思设计几个类、几个函数。结果呢,就把代码塞到了main函数里,幸好代码量不是太多。下面就是一些示意图:

此处输入链接的描述

五、代码说明

  1. 处理命令行参数

//得到存放各类型命令行参数的ArrayList具体值
for (int i=0;i<args.length;i++)
{
   if (args[i].equals("-log")) {
     logList=args[++i];
     logList=logList.replace('/', '');
   }
   else if (args[i].equals("-out")) {
     outList=args[++i];
     outList=outList.replace('/', '');
   }
   else if (args[i].equals("-date")) {
     dateList=args[++i];
   }
   else if (args[i].equals("-type")) {
     for (int j=i+1;j<args.length;j++)
     {
       if (!args[j].equals("-out")&&!args[j].equals("-date")&&...)
       {
         typeList.add(args[j]);
       }
       else
       {
         i=j-1;
         break;
       }
     }
   }
   else if (args[i].equals("-province")) {
   ...
}
}//获取ArrayList循环结束

  1. 处理日志文件

//处理日志中的数据
for(String s:arr)
{
   if (s.compareTo(dateList+".log")>0) continue;
   try
   {
     File afile = new File(logList+s);
     Scanner sc = new Scanner(afile);
     while (sc.hasNext())
     {
       String first=sc.next();
       if (first.equals("//"))
       sc.nextLine();
       else
       {
         int index=0;
         for (int i=0;i<32;i++)
         {
           if (first.equals(province[i]))
           {
             index=i;
             break;
           }
         }
         number0=1;
         numberindex=1;
         String second=sc.next();
         if (second.equals("新增"))
         {
           String third=sc.next();
           String four=sc.next();
           four=four.replace("人", "");
           int member=Integer.parseInt(four);
           if (third.equals("感染患者")) {
             number[0][0]+=member;
             number[index][0]+=member;
           }
           else {
             number0+=member;
             numberindex+=member;
           }
         }
         else if (second.equals("感染患者"))
         ...
       }
     }
     sc.close();
   }
}

  1. 将从日志文件得到的数据转化为所需数据

//得到输出结果
ArrayList result=new ArrayList();
if (provinceInt.size()0)
   ...
else
{
   for (int i=0;i<32;i++)
   numberi=0;
   for (int i=0;i<provinceInt.size();i++)
   numberprovinceInt.get(i)=1;
   if(typeInt.size()
0)
   {
     for (int i=0;i<32;i++)
     {
       if (numberi==0)
       {
         continue;
       }
       String mid=province[i]+" 感染患者"+""+number[i][0]+""+"人"+" 疑似患者"+""+numberi+""+"人"
       +" 治愈"+""+numberi+""+"人"+" 死亡"+""+numberi+""+"人\n";
       result.add(mid);
       }
     }
   else
   ...
   }
}

六、单元测试截图和描述

由于我写代码之前没有仔细看单元测试的内容,所以把所有的代码都写到了main函数里,这就很难测试每一个代码片段了。所以写完以后,我只能修改了一下自己的代码,这样起码main函数可以得到测试结果,。
测试代码
import static org.junit.Assert.*;

import org.junit.Test;
public class InfectStatisticTest
{
   @Test
   public void testMain()
   {
     String[] test1=("list -log D:/log/ -out D:/ListOut1.txt -date 2020-01-22").split(" ");
     //for(int i=0;i<test1.length;i++)
     //System.out.println(test1[i]);
     InfectStatistic.main(test1);
     assertEquals("全国 感染患者15人 疑似患者22人 治愈2人 死亡1人\n", InfectStatistic.result.get(0));
     assertEquals("福建 感染患者5人 疑似患者7人 治愈0人 死亡0人\n", InfectStatistic.result.get(1));
     assertEquals("湖北 感染患者10人 疑似患者15人 治愈2人 死亡1人\n", InfectStatistic.result.get(2));

// String[] test2=("list -log D:/log/ -out D:/ListOut2.txt -date 2020-01-22 -province 福建 河北").split(" ");
    // InfectStatistic.main(test2);
    // assertEquals("福建 感染患者5人 疑似患者7人 治愈0人 死亡0人\n", InfectStatistic.result.get(0));
    // assertEquals("河北 感染患者0人 疑似患者0人 治愈0人 死亡0人\n", InfectStatistic.result.get(1));

// String[] test3=("list -log D:/log/ -out D:/ListOut7.txt -date 2020-01-23 -type cure dead ip -province 全国 浙江 福建").split(" ");
    // InfectStatistic.main(test3);
    // assertEquals("全国 治愈4人 死亡3人 感染患者42人\n", InfectStatistic.result.get(0));
    // assertEquals("福建 治愈1人 死亡0人 感染患者9人\n", InfectStatistic.result.get(1));
    // assertEquals("浙江 治愈0人 死亡0人 感染患者0人\n", InfectStatistic.result.get(2));
   }
}
三个测试结果截图
此处输入链接的描述

七、单元测试覆盖率优化和性能测试,性能优化截图和描述

单元测试覆盖率
我是直接测试main函数,所以命令行要么带province要么不带province,要么带type要么不带type,就不能一次测试把所有情况都覆盖。
此处输入图片的描述

八、代码规范的链接

https://github.com/zjwoyingle/InfectStatistic-main/blob/master/221701137/codestyle.md

九、心路历程与收获

第一次做这么复杂的项目,真正的感觉特别难,也发现了自己很多很多不懂的地方。以后一定需要多加学习。一开始看题目,感觉一点头绪都没有,完全不知道如何下手。所幸经过许多人和资料文献的帮忙,让自己一步步的做了出来。现在感觉很喜悦,对自己的成果很满意。

十、第一次作业中技术路线图相关的5个仓库

1.SpringAll:https://github.com/zjwoyingle/SpringAll
简介:循序渐进,学习Spring Boot、Spring Boot & Shiro、Spring Cloud、Spring Security & Spring Security OAuth2,博客Spring系列源码,帮助初学者学习Spring。
2.hibernate-orm:https://github.com/zjwoyingle/hibernate-orm
简介:Hibernate的核心对象/关系映射功能,适合进一步学习Hibernate框架。
3.Java:https://github.com/zjwoyingle/Java
简介:Java的学习之路,学习JavaEE以及框架时候的一些项目,结合博客和源码,让你受益匪浅,适合Java初学者和刚入门开始学框架者。
4.Heart-First-JavaWeb:https://github.com/zjwoyingle/Heart-First-JavaWeb
简介:一个走心的 Java Web 入门开发教程,面向新手友好,容易上手,同时没有废话,有很多实用的例子适合入门者学习。
5.JavaGuide:https://github.com/zjwoyingle/JavaGuide
简介:Java学习+面试指南,一份涵盖大部分Java程序员所需要掌握的核心知识。适合各个阶段的同学阅读学习。

posted @ 2020-02-20 22:27  修省  阅读(174)  评论(0编辑  收藏  举报