欢迎来到陈如滨的博客

想让奇迹发生,就必须付出长久的时间和精力。
扩大
缩小

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

这个作业属于哪个课程 2020春W班
这个作业要求在哪里 寒假作业(2/2)
这个作业的目标 疫情统计
作业正文 第二次寒假作业
其他参考文献 一些github教程

一、仓库地址

我的本次作业的仓库地址:InfectStatistic-main

二、PSP表格

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

三、解题思路

  • 1、Github初使用
    • 注册Github账号,下载Git与Github Desktop。
    • 学习仓库的各项操作(fork,star,issue等)。
    • 学习基础Git命令,如:如何将本地文件提交到Github仓库中,打开某文件,删除某文件等。
      (以上学习通过观看bilibili上的教程视频与一些CSDN教程实现)
  • 2、学习用命令行编译执行java文件,两条语句:
    • javac xx.java
    • java xx …… (假设java文件名为xx)
  • 3、进行需求分析
    • 首先,要解析命令行:
      • 读取命令行。
      • 检测命令与参数的配对、格式的正确性。
      • 提取出命令行中所需要的参数,创建相应的变量用于存放。
    • 其次,要读取文件:
      • 根据命令行读取满足日期的日志文件。
      • 逐行读取每一个日志文件。
      • 对其中的数据做相应的记录。
    • 最后,要写文件:
      • 根据命令行确定需要写入文本的文件路径及名称(若文件不存在需创建)
      • 根据命令行参数将所有需要的数据逐个、逐行写入指定文件。
        (根据具体功能百度所需要的代码)

四、设计实现功能

设计

  • 首先是一个大类,即class InfectStatistic,是InfectStatistic.java文件的主类
    • 主类下有很多全局变量,用来存放各种与时间、省份还有人口有关的数据。
    • 然后是CmdArgs类,用于解析命令行:
      • 一个函数用来接收主函数传来的命令行字符串;
      • 若干个GetXX函数用来提取、检查并保存或处理正确的参数。
    • 再然后是HandleFile类,用于处理文件的读写:
      • 若干个字符串,存放日志文件中所有可能出现的句式;
      • 一个函数用于读所有对应的日志文件;
      • 若干个函数用于处理每一种句式出现时人员的变动问题;
      • 最后一个函数用于将所需的结果写入指定文件。
    • 最后是主函数,实例化类的对象。

五、代码说明

如此搭配用于检验各种参数

if(args[i].equals("-log")) {
    flag = GetLog(++i);
    if(flag == 0) {
        System.out.println("日志路径有误");
        return false;
    }
}
public int GetLog(int i) {
    if(i < args.length) {
        if(args[i].matches("^[A-z]:\\\\(.+?\\\\)*$")) {
            logPath = args[i];
            return 1;
        }
        else
            return 0;    
    }
    else
        return 0;
}

逐行处理日志文件数据,其中一种类型:

//public String condition1 = "\\S+ 新增 感染患者 \\d+人";
if(s.matches(condition1))
    DoCondition1(s);
public void DoCondition1(String str) {
    String [] arr = str.split("\\s+");
    int n = Integer.parseInt(arr[3].substring(0, arr[3].indexOf("人")));
    for(int i = 0;i < total;i++) {
    	if(arr[0].equals(provinceName[i])) {
    		numOfPeople[i][0] += n;
    		numOfPeople[0][0] += n;
    	}
    }
}

根据命令行类型输出文档

//情况一:没有指明type与province
if(typeFlag == false && provinceFlag == false) {
    for(int i = 0;i < total;i++) {
    	if(totalNum[i]>0) {
    		pw.write(provinceName[i]+" ");
    		for(int j = 0;j < 4;j++)
    		pw.write(typeName[j]+numOfPeople[i][j]+"人"+" ");
    		pw.write("\n");
    	}
    }
}

六、单元测试

class InfectStatisticTest {
	
	@Test
	void Test1() {
		 String[] str = {"list","-log"
		 ,"C:\\Users\\crb19\\Documents\\GitHub\\InfectStatistic-main\\221701202\\log\\"
		,"-out"
		,"C:\\Users\\crb19\\Documents\\GitHub\\InfectStatistic-main\\221701202\\result\\test.txt"
		,"-date","2020-01-22","-type","ip","sp","cure","dead","-province","福建"};
		InfectStatistic.main(str);
	}
	

	@Test
	void Test2() {
		String[] str = {"-log"
		,"C:\\Users\\crb19\\Documents\\GitHub\\InfectStatistic-main\\221701202\\log\\"
		,"-out"
		,"C:\\Users\\crb19\\Documents\\GitHub\\InfectStatistic-main\\221701202\\result\\test.txt"
		,"-date","2020-01-22"};
		InfectStatistic.main(str);
	}
	
	@Test
	void Test3() {
		String[] str = {"list","-log"
		,"C:\\Users\\crb19\\Documents\\GitHub\\InfectStatistic-main\\221701202\\log\\"
		,"-out"
		,"C:\\Users\\crb19\\Documents\\GitHub\\InfectStatistic-main\\221701202\\result\\test.txt"
		,"-date","2020-02-22"};
		InfectStatistic.main(str);
	}
	
	@Test
	void Test4() {	
		String[] str = {"list","-log"
		,"C:\\Users\\crb19\\Documents\\GitHub\\InfectStatistic-main\\221701202\\log\\"
		,"-out"
		,"C:\\Users\\crb19\\Documents\\GitHub\\InfectStatistic-main\\221701202\\result\\test.txt"
		,"-date","2020-02-31"};
		InfectStatistic.main(str);
	}
	
	@Test
	void Test5() {	
		String[] str = {"list","-log"
		,"C:\\Users\\crb19\\Documents\\GitHub\\InfectStatistic-main\\221701202\\log\\"
		,"-out"
		,"C:\\Users\\crb19\\Documents\\GitHub\\InfectStatistic-main\\221701202\\result\\test.txt"
		,"-date","2020-01-22","-type","ip","sp","dead","cure"};
		InfectStatistic.main(str);
	}
	
	@Test
	void Test6() {
		String[] str = {"list","-log"
		,"C:\\Users\\crb19\\Documents\\GitHub\\InfectStatistic-main\\221701202\\log\\"
		,"-out"
		,"C:\\Users\\crb19\\Documents\\GitHub\\InfectStatistic-main\\221701202\\result\\test.txt"
		,"-date","2020-01-22","-type"};
		InfectStatistic.main(str);
	}
	
	@Test
	void Test7() {
		String[] str = {"list","-log"
		,"C:\\Users\\crb19\\Documents\\GitHub\\InfectStatistic-main\\221701202\\log\\"
		,"-out"
		,"C:\\Users\\crb19\\Documents\\GitHub\\InfectStatistic-main\\221701202\\result\\test.txt"
		,"-date","2020-01-22","-province","福建"};
		InfectStatistic.main(str);
	}
	
	@Test
	void Test8() {	
		String[] str = {"list","-log"
		,"C:\\Users\\crb19\\Documents\\GitHub\\InfectStatistic-main\\221701202\\log\\"
		,"-out"
		,"C:\\Users\\crb19\\Documents\\GitHub\\InfectStatistic-main\\221701202\\result\\test.txt"
		,"-date","2020-01-22","-province",};
		InfectStatistic.main(str);
	}
	
	@Test
	void Test9() {	
		String[] str = {"list","-log"
		,"C:\\Users\\crb19\\Documents\\GitHub\\InfectStatistic-main\\221701202\\log\\a"
		,"-out"
		,"C:\\Users\\crb19\\Documents\\GitHub\\InfectStatistic-main\\221701202\\result\\test.txt"
		,"-date","2020-01-22"};
		InfectStatistic.main(str);
	}
	
	@Test
	void Test10() {
		String[] str = {"list","-log"
		,"C:\\Users\\crb19\\Documents\\GitHub\\InfectStatistic-main\\221701202\\log\\"
		,"-out"
		,"C:\\Users\\crb19\\Documents\\GitHub\\InfectStatistic-main\\221701202\\result\\test"
		,"-date","2020-01-22"};
		InfectStatistic.main(str);
	}
	

}

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

覆盖率与性能
要提高覆盖率,还是要把函数功能分的再仔细一点。

八、代码规范

我的代码规范文件:codestyle.md

九、心路历程与收获

  这次的作业在我看来的话,可以用十二个字总结,就是:艰难开始、顺利继续、匆忙收尾。俗话说的好,万事开头难。无独有偶,这次作业我也是蹉跎了好几天才下手。一开始的日子每次我打开作业要求时,都感到焦虑、难熬。面对扑面而来的新鲜知识的气息,退缩的冲动来的是那么的轻易。只能硬着头皮一边百度,一边操作,但总怕自己做的是错的,还没有回头路可走。学习了这么多天Github的使用,我发现还是视频教学对我比较有用。看着博客里的图片、文字,我总是看着看着就犯迷糊。后来我搜寻了一些教学视频,跟着老师一步一步的操作,感觉成就来的比较快。
  学习了仓库的知识后就开始编写代码了,看了助教的作业引导博客,我才有了做作业的条理。在使用cmd编译java文件时,突然想起以前老师好像和我们说过javac的使用,果然还是要温故才能知新呐。代码编写一旦入了道,感觉就来了,越写越顺手,所有需要的功能网上搜索一下就出来了。
  但是由于我太晚开始写作业,所以作业的总结、优化之类的做的比较粗糙。通过这次作业,我学到了很多知识,确实都是很有用的知识。也领悟到很多,每次作业都要早早开始,越是困难就越是要克服。不会的知识就是找资料,新知识的学习总是很费时间的,但是当你学会了以后再回头看,会发现当初困住你的障碍其实也没什么大不了。世上无难事,只怕有心人。
加油

十、相关仓库

  • 1、front-dev-bookmarks
    • 一个巨大的前端开发资源清单,star:26.8k,fork:4.3k
  • 2、csscss
    • css代码冗余分析仪,用于分析冗余。star:2.9k,fork:148
  • 3、jshint
    • js静态代码分析工具,可以帮你检测js语法错误和潜在的问题。star:8.3k,fork:1.7k
  • 4、slick
    • 一款完全响应式的 jQuery 图片滚动插件,能够根据容器自动适应宽度。star:25.3k,fork:5.1k
  • 5、amazeui
    • 移动优先的跨屏前端框架。面向HTML5开发,使用css3做动画和交互。star:13.4k,fork:2.6k

posted on 2020-02-18 22:27  ANDTENET  阅读(174)  评论(2编辑  收藏  举报

导航