欢迎来到1890的博客

你站在桥上看风景,看风景人在楼上看你。明月装饰了你的窗子,你装饰了别人的梦。

软工实践寒假作业(2/2)-疫情统计

这个作业属于哪个课程 福大软工2020春S班
这个作业要求在哪里 寒假作业(2/2)
这个作业的目标 学习使用github,完成要求的疫情统计程序
作业正文 324蔡俊
其他参考文献 java、百度、CSDN、简书

一、github仓库地址

作业的主仓库
我的github仓库

二、《构建之法》的心得

第一章概述
解释了什么是程序、什么是软件工程、软件地特性、软件工程地组成等等,为自己的学习有了一个基本的认识。
第二章个人技术和流程
向我们讲诉的单元测试,回归测试,效能分析等,提高了自己的效率。
第三章软件工程师的成长
学到了成为软件工程师所要具备的条件,分别是:1.积累软件开发相关知识,提升技能技术。2.积累问题领域的知识和经验。3.对通用的软件设计思想和软件工程的理解。让我对软件工程师的职业发展认识到了很多。

PSP表格

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

三、解题思路

如何思考?

一开始看到这题有点懵,题目有点太繁琐了,后面我提取了这次作业的关键点。
1.日志作用。
2.指令参数。
3.输出方式。
通过以上关键点,理清了解题思路:
首先,理清日志里面有哪些情况和变量(遗漏的通过后面的编写再补)。
其次,对题目要求的命令参数进行编写,通过自定义函数判断命令参数是否符合要求。
再次,通过命令传递的参数调用自定义函数对输入日志进行各种操作。
最后,通过操作改变定义的变量,输出所需参数在输出日志上。
(在每一步完成都会一些测试,确保问题不在最后一起出现)

查找资料?

对github的使用云里雾里的,查找这方面操作百度的最多;代码的编写主要查找一些自己要用到的函数和正则表达式,比如提取系统时间,字符串,读写文件等。

四、设计实现过程

实现指令参数

解析输入命令,保存输入命令,对参数进行解析,判断命令正误,实现变量的修改。
command

读取日志内容

读取文件内容,并进行日志内特定数据计算,根据指令参数输出所需文本内容。
File_handle

五、代码说明

1、定义的变量

//日志地址
public String logaddr;
public String resultaddr;

//省份
public String[] province={"全国","安徽","北京","重庆","福建","甘肃",
        "广东","广西","贵州","海南","河北","河南","黑龙江","湖北",
        "湖南","吉林","江苏","江西","辽宁","内蒙古","宁夏","青海",
        "山东","山西","陕西","上海","四川","天津","西藏", "新疆",
        "云南","浙江","澳门","香港","台湾"};//各省名称
public int[] is_province=new int[35];//统计各省是否需要输出
public int[][] person = new int[35][4];//各省各类人群

//list命令参数
public String[] li_cmd={"-log","-out","-date","-type","-province"};

//感染类型
public String[] type={"ip","sp","cure","dead"};//感染类型
public String[] cntype={"感染患者", "疑似患者", "治愈", "死亡"};//感染类型
public int[] in_type={1,1,1,1};//0不输出,为1输出

//获取当前时间
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date d = new Date(System.currentTimeMillis());//获取当前时间
public String date_now = formatter.format(d); //转化格式

//判断是否输出其它省
public int flag=0;

2、Command类,用各种函数检测指令参数是否正确
a.get_Logaddr()//-log,检测输入日志文件地址
b.get_Resultaddr()//-out,检测输出日志地址
c.get_Date()//-data,检测日期
d.get_Type()//-type,检测指定患病类型
e.get_Province()//-province,检测省份
以下是调用个函数检测的总函数isrt_cmd()

 //解析命令
    public boolean isrt_cmd() {
        if (!cmd[0].equals("list")) {//判断命令格式开头是否正确
            System.out.println("命令开头非list,错误");
            return false;
        }
        int i;
        int istake0=0;
        int istake1=0;
        //-log,-out必须附带
        for (i = 1; i < cmd.length; i++) {//参数验证
            if (cmd[i].equals(li_cmd[0])) {
                i++;//读取地址
                i = get_Logaddr(i);
                if(i == -1) {
                    System.out.println("输入日志路径参数错误");
                    return false;
                }
                else
                    istake0++;//检测-log是否产生

            } else if (cmd[i].equals(li_cmd[1])) {
                i++;//读取地址
                i = get_Resultaddr(i);
                if(i == -1) {
                    System.out.println("输出日志路径参数错误");
                    return false;
                }
                else
                    istake1++;//检测-log是否产生

            } else if (cmd[i].equals(li_cmd[2])) {
                i++;
                i = get_Date(i);
                if(i == -1) {
                    System.out.println("日期参数错误");
                    return false;
                }


            } else if (cmd[i].equals(li_cmd[3])) {
                i++;
                i = get_Type(i);
                if(i == -1) {
                    System.out.println("患者参数错误");
                    return false;
                }

            } else if (cmd[i].equals(li_cmd[4])) {
                i++;
                i = get_Province(i);
                if(i == -1) {
                    System.out.println("省份参数错误");
                    return false;
                }

            }else{
                System.out.println("无该参数,请检查输入是否错误");
                return false;
            }
        }
        if(istake0<1){
            System.out.println("请输入正确的-log指令");
            return false;
        }else if(istake1<1){
            System.out.println("请输入正确的-out指令");
            return false;
        }
        return true;

    }

3、File_handle类,处理日志输入输出
a.get_Flist(),读取路径下的文件(a调用b,b调用c)
b.Read_txt(),读取文本内容
c.Deal_txt(),处理文本
d.Write_txt()/show(),输出文本
以下列举其中两个:

 //读取路径下的文件
    public void get_Flist() {
        File[] flist;
        String fname;
        File file = new File(logaddr);//获取指定目录下文件
        flist = file.listFiles();
        int i;
        for (i = 0; i < flist.length; i++) {
            fname = flist[i].getName();//文件名
            if (fname.compareTo(date_now) <= 0) {
                String alladdr = logaddr + fname;
                /*
                用来检验是否找到符合要求的文件地址
                System.out.println(alladdr);
                */
                Read_txt(alladdr);
            }
        }
    }

    //读取文本内容
    public void Read_txt(String address) {
        try {
            BufferedReader bf;
            bf = new BufferedReader(new InputStreamReader(
                    new FileInputStream(new File(address)), "UTF-8"));
            String rLine = null;
            /*隔行读取了
            while(br.readLine()!=null){
                rLine=br.readLine();//按行读取
                //if (!rLine.startsWith("//")){
                    System.out.println(rLine);
                //}

             */
            while ((rLine = bf.readLine()) != null) {
                if (!rLine.startsWith("//")) {
                    /*
                    检测文档读取是否正确
                    System.out.println(rLine);
                    */
                    Deal_txt(rLine);
                }
            }
            bf.close();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

六、单元测试截图和描述

对list下的各个参数-log,-out,-date,-type,-province进行了单独和混合测试,包括错误参数测试。
测试实例如下:
总的测试
all
测试一到三
1
测试四到七
2
测试八到十
3
测试结果:都符合指令
0

1

2

3

4

5

6

7

8

9

七、覆盖率优化和性能测试

1、单元测试覆盖率
  在覆盖率方面,由于测试的比较全面,故覆盖率较高,几乎覆盖了所有代码,还有一些未覆盖的地方即为测试用例不到位或一些异常捕捉语句,和一些没有使用错误输入参数,也便不会覆盖到那部分的代码。其他正确性的代码基本可以通过单元测试覆盖到位。
10
2、性能测试
部分功能可以简略减少时间,有的地方有想法但是没实现,优化程度还不够
11

八、代码规范

1890的代码规范

九、心路历程与收获

通过这次项目学习了部分《构建之法》,第一次接触到单元测试和学习性能测试,并且发现自己在思考问题和编写代码过程中许多不合理的地方,需要改进。学习要成为一名软件工程师所必备的一些准备:1.积累软件开发相关知识,提升技能技术。2.积累问题领域的知识和经验。3.对通用的软件设计思想和软件工程的理解。发现自己还有许多学习的地方,要在接下来的学习中更加认真,学会充分利用时间合理规划学习计划。

十、技术路线图相关的5个仓库

仓库地址 |内容简介
--|:--😐--😐--:
https://github.com/DuGuQiuBai/Java|包含许多java知识点,一系列学习java过程
https://github.com/qianguyihao/Web|详细的web前端入门和进阶学习笔记
https://github.com/jobbole/awesome-mysql-cn|MySQL 资源大全中文版
https://github.com/zhonglinlin1305/Spring|spring mvc,spring,分别与jdbctemplate等的全注解整合
https://github.com/wxiaoqi/Spring-Cloud-Admin|Cloud-Admin,国内首个基于Spring Cloud微服务化开发平台

posted @ 2020-02-20 18:10  1890  阅读(211)  评论(0编辑  收藏  举报