疫情分析0.00.01

  1. 我的Github仓库:https://github.com/fzu-hhj/InfectStatistic-main

  2. PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
    Planning 计划
    Estimate 估计这个任务需要多少时间 10 10
    Development 开发
    Analysis 需求分析 (包括学习新技术) 420 110
    Design Spec 生成设计文档 60 10
    Design Review 设计复审 20 0
    Coding Standard 代码规范 (为目前的开发制定合适的规范) 30 50
    Design 具体设计 120 20
    Coding 具体编码 120 500
    Code Review 代码复审 30 120
    Test 测试(自我测试,修改代码,提交修改) 360 180
    Reporting 报告 60 120
    Test Repor 测试报告 45 0
    Size Measurement 计算工作量 10 20
    Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 25 30
    合计 1250 1170
  3. 解题思路
    看到题目后,发现需求大概是根据传入的命令读取日志文件,在输出到指定文件。问题主要是如何解析输入的命令(检验并存储“正则表达式匹配”)
    ;根据命令实体对象读取文件("多文件的IO"和文件日期的判断,对文件数据的解析并计算);计算出需要的结果并输出到文件(文件IO)
  4. 具体设计
    • 程序中的类
      • Command存储输入的命令,包括检验,解析命令等功能;
      • File 来进行文件的IO,包括根据命令判断数据是否需要,计算数据的功能
      • Date 存储日期,用于比较日期的早晚
    • 具体功能实现
      • Command类,在利用字符串数组参数进行初始化的过程中进行检验格式,利用正则表达式匹配"-\w+"来定位选项,读入参数。
      • File类,来进行文件的IO,文件的成员包括一个命令对象和一个int[35][4]的结果数组(用来存取所有省的所有种类的数量)。
        对文件日期的判断通过定义一个日期类,将字符串转化为3个int值,并定义了一个比较大小的函数。
        对文件数据的解析动过判断文件的每一行数据是否存在关键字"新增""流入"死亡""治愈""确诊""排除"来决定处理的函数,每个处理函数通过将每一行的字符串
        以空格截断转化为字符串数组,此外定义了一个常量字符串数组按拼音存储全国和34个省的中文来定位每一个数据字符串数组涉及省在结果数组的索引,
        处理函数通过对结果数组的数据进行修改得到最终结果
        最后结果数组的数据加工一下写入文件
    • fileIn函数
      疫情分析0.00.01_第1张图片
  5. 关键代码
    /初步判断命令的格式是否正确/

     private boolean isCommand(String[] commandStr) {
         StringBuffer com = new StringBuffer();
         for(int i = 0; i < commandStr.length;i ++) {
             com.append(commandStr[i]+" ");
         }
         String regex = "list(\\s+-\\w+\\s+\\S+)*\\s+-log\\s+\\S+(\\s+-\\w+\\s+\\S+)*\\s+-out\\s+\\S+(\\s+-\\w+\\s+\\S+)*\\s*";
         if(!com.toString().matches(regex)) {
             System.out.println("01");//*******************
             return false;
         }
         return true;
     }

    /* 读入文件*/

     public void fileIn() {
         String encoding = "UTF-8";
         String dir = command.getLogFile();
         File[] files = new File(dir).listFiles();
         for(File file : files) {
             if(file.isFile() && file.exists()) {
                 String fileDateStr = file.getName().substring(0, 10);
                 Date fileDate =new Date(fileDateStr);
                 if(fileDate.earlier(command.getDate())) {
                     //System.out.println("判断日期成功!");
                     parseData(file , encoding);
                 }
                 //System.out.println("读入文件成功!");
             }
         }
    
     }
    
     //对每一个文件的数据进行读取
     private void parseData(File file , String encoding) {
         InputStreamReader read = null;
         try {
             read =new InputStreamReader(new FileInputStream(file), encoding);
             BufferedReader br = new BufferedReader(read);
             String text = null;
             //按行读取文件
             while((text = br.readLine()) != null ) {
                 String[] lineData = text.split("\\s+");
                 if(lineData[0].equals("//")) {
                     break;
                 }
                 int proNum = 0;
                 //匹配省名
                 for(int i = 0;i < 35;i ++) {
                     if(PROVINCE[i].equals(lineData[0])) {
                         proNum = i ;
                         break;
                     }       
                 }
                 if(text.indexOf("新增") != -1) {
                     newPatient(lineData , proNum);
                 }
                 if(text.indexOf("流入") !=-1){
                     patientFlow(lineData , proNum);
                 }
                 if(text.indexOf("死亡") != -1) {
                     patientDie(lineData , proNum);
                 }
                 if(text.indexOf("治愈") != -1) {
                     patientCure(lineData , proNum);
                 }
                 if(text.indexOf("确诊感染") != -1) {
                     confirmIfection(lineData , proNum);
                 }
                 if(text.indexOf("排除") != -1) {
                     excludeIfection(lineData , proNum);
                 }
             }
             nationCount();
             read.close();
             ......
    思路:循环读取日志文件夹下文件,判断日期是否合格,合格则按行读取文件,解析每一行的数据
    按照关键字进行分类处理,将字符串转化为字符串数组读取省份,人数信息,修改结果数组,
  6. 单元测试截图和描述。

    设计的单元测试用例,设计了一个测试文件,在主类中定义一个测试函数读取测试文件的命令循环测试。

    疫情分析0.00.01_第2张图片

    单元测试用例的覆盖率
  7. 单元测试覆盖率优化和性能测试,性能优化截图和描述

    疫情分析0.00.01_第3张图片

    由于技术的欠缺与时间的缺乏,未能将单元测试所暴露出的问题一一解决
  8. 代码规范
  9. 心路历程与收获
    本次代码由于我的经验不足,打代码的技术不够,在正式开始打代码前未能作出具体的设计,走一步看一步,面临问题才临时想解决的方法
    ,花在代码的时间有500分钟,而提前的需求分析与具体设计的时间不足60分钟,而正式前期的分析与设计的不足导致了具体编码的困难
    ,回想起来,这次作业的需求并不难,用到的新知识也几乎没有,可是设计与基础功的不足导致了我的困难,这都是我需要改进的。单元测试
    的使用是一个新的方面,我在阅读了邹欣老师的博客后,感到单元测试是十分有必要的,能够系统的检查出自己的程序的bug,但由于时间的不足
    与能力的有限,我未能使单元测试获得应有的效果,覆盖率未能达到100%,各种命令也不能全部解析,反应,这是我的问题,希望能在以后的编码
    中改正。
  10. 五个仓库

Github仓库
Tensorflow 采用数据流图(data flow graphs)用于数值计算的开源软件库。架构灵活让你可以在多种平台上展开计算
awesome-python Python框架精选大集合
Httpie HTTPie是一个命令行的HTTP客户端,这款神器使得命令行下调用web服务非常方便人性化.而且是彩色的输出,很漂亮,内置了测试,分析功能非常强大。
Thefuck 当你输入命令的出错的时候,直接敲一个fuck,会自动帮你修正上一条命令, 牛逼的啊!内置了自动匹配算法.
Flask 一个微型的web开发框架,轻巧而强大

你可能感兴趣的:(疫情分析0.00.01)