软件工程实践2020第二次寒假作业

这个作业属于哪个课程
这个作业要求在哪里
这个作业的目标 疫情统计
作业正文
其他参考文献 ...

1.Github仓库地址。

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

2.PSP表格。

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

3.解题思路描述

一开始拿到题目的的时候想到的是命令行参数会传递到JAVA的main函数中的String[] args,后面的工作应该以解析命令行参数为基础。
接下来是读取日志中的log文件,最后以txt的形式输出文件,读写的过程要根据命令行参数改变。由此得到一个初步的设计思路

4.设计实现过程

5.代码说明

读取Log文件后保存省份信息变动
判断输入内容以后更新省份信息

    String strLine;
    FileInputStream fstream;
    BufferedReader br;
    try {
        fstream = new FileInputStream(new File(log));
        InputStreamReader isr = new InputStreamReader(fstream,"UTF-8");
        br = new BufferedReader(isr);
        while((strLine = br.readLine()) != null){
            String str[] = strLine.split(" ");//用空格分隔每一行中的记录
            if(!str[0].substring(0,2).equals("//")){//忽略以"//"开头的记录行
                int num = 0;//记录变动人数
                int i = 1;//记录变动省份
                int length = str.length;
                str[length - 1] = str[length - 1].trim();
                if(str[length - 1] != null && !"".equals(str[length - 1])){
                    for(int k = 0;k < str[length - 1].length();k++){
                        if(str[length - 1].charAt(k) >= 48 && str[length - 1].charAt(k) <= 57){
                            num = 10*num+str[length - 1].charAt(k) - 48;
                        }
                    }
                }
                
                while(!str[0].equals(province[i].name) && i < PROVINCE_NUM){
                    i++;
                }
                
                if(length == 3){
                    if(str[1].equals(TYPE[2])){//xx省份患者治愈
                        province[i].ip -= num;
                        province[i].cure += num;
                    }
                    else if(str[1].equals(TYPE[3])){//xx省份患者死亡
                        province[i].ip -= num;
                        province[i].dead += num;
                    }   
                }
                else if(length == 4){
                    if(str[1].equals("新增")){
                        if(str[2].equals(TYPE[0])){//xx省份新增感染患者
                            province[i].ip += num;
                        }
                        else if(str[2].equals(TYPE[1])){//xx省份新增疑似患者
                            province[i].sp += num;
                        }
                    }
                    else if(str[1].equals(TYPE[1])){////xx省份疑似患者确诊
                        province[i].sp -= num;
                        province[i].ip += num;
                    }
                    else if(str[1].equals("排除")){//xx省份疑似患者排除
                        province[i].sp -= num;
                    }
                }
                else if(length == 5){
                    int j = 1;
                    while(!str[3].equals(province[j].name) && j < PROVINCE_NUM){
                        j++;
                    }
                    if(str[1].equals(TYPE[1])){//a省疑似患者流入b省
                        province[i].sp -= num;
                        province[j].sp += num;
                    }
                    else if(str[1].equals(TYPE[0])){//a省感染患者流入b省
                        province[i].ip -= num;
                        province[j].ip += num;
                    }
                }
            }
        }
    }
    catch (FileNotFoundException e){
        e.printStackTrace();
    }
    catch (UnsupportedEncodingException e){
        e.printStackTrace();
    }
    catch (IOException e){
        e.printStackTrace();
    }

解析命令行代码
逐个读取"-"开头的命令行后做比对

if(args.length > 0 && args[0].equals("list")){
            for(int i = 1;i+1 < args.length;i++){
                if(args[i].substring(0,1).equals("-")){
                    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 "-type" :praseType(args,i,type);break;
                        case "-province" :
                            prov = true;//确认province参数输入
                            praseProvince(args,i,province);
                            break;
                        default :
                            System.out.println("输入了错误的参数"+args[i]+",请重新输入");
                            System.exit(0);
                    }
                }
            }

6.单元测试截图和描述。



对能想到的合法命令进行了测试

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


单元测试中因为测试格式不正确的参数的时候会中断程序,例如输入了不正确的文件地址时会中断。暂时没有找的好的测试方法
优化上读取文件信息的时候会储存没有必要输出的省份信息,这部分信息可以在读取的时候舍弃

8.代码规范的链接

https://github.com/RETORETO/InfectStatistic-main/blob/master/041701602/example/codestyle.md

9.结合在构建之法中学习到的相关内容,撰写解决项目的心路历程与收获。

花费的时间其实比想象中的多不少,第一次尝试这么系统的去完成一个项目,通过《构建之法》能了解到自己以前很多做法上的错误
学到了单元测试的使用,很大程度上简化了代码测试

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

前端开发者手册,它概述并讨论了前端工程的实践,该如何学习以及实践时该使用什么工具
https://github.com/helloqingfeng/Awsome-Front-End-learning-resource/tree/master/02-fedHandlebook-master

前端开发规范手册,在开发中积累下来的经验和参考其它规范,起指导作用
https://github.com/helloqingfeng/Awsome-Front-End-learning-resource/tree/master/27-front-end-style-guide

腾讯alloteam前端代码规范
https://alloyteam.github.io/CodeGuide/

百度ecomfe前端代码规范
https://github.com/ecomfe/spec

iView管理是一个前端管理后台集成解决方案。它基于Vue.js并使用UI工具包iView。
https://github.com/iview/iview-admin

你可能感兴趣的:(软件工程实践2020第二次寒假作业)