这个作业属于哪个课程 | |
---|---|
这个作业要求在哪里 | |
这个作业的目标 | |
作业正文 | |
其他参考文献 |
1.GitHub仓库地址
2.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 40 | 40 |
Estimate | 估计这个任务需要多少时间 | 30 | 30 |
Development | 开发 | 2000 | 2400 |
Analysis | 需求分析 (包括学习新技术) | 200 | 300 |
Design Spec | 生成设计文档 | 60 | 80 |
Design Review | 设计复审 | 30 | 45 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 60 | 45 |
Design | 具体设计 | 240 | 200 |
Coding | 具体编码 | 600 | 600 |
Code Review | 代码复审 | 60 | 60 |
Test | 测试(自我测试,修改代码,提交修改) | 90 | 100 |
Reporting | 报告 | 45 | 60 |
Test Report | 测试报告 | 45 | 60 |
Size Measurement | 计算工作量 | 30 | 30 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 45 | 45 |
合计 | 3575 | 4095 |
3.解题思路描述
看完需求之后,我想到要用提取命令行的args来解析出各个参数,然后根据log参数和date参数来读取相应txt文件的内容,type参数确定输出的语句,province参数选择需要输出的省份,最后输出到out参数指定的位置。其中读取txt文件内容还需要用正则表达式来匹配和提取“省份”和“感染患者”、“疑似患者”、“治愈”、“死亡”的人数,将其存放到一个内部类里,方便后续的输出。
至于查找资料的部分,因为对HashMap使用的不熟练,我还去找寻HashMap的原理和使用方法的资料,以及同学发的这次作业相关的博文,还有一些细节上的思路问题没法查找的,就去问同学。在这里也非常感谢帮助我的几位同学。
4.设计实现过程
[查看原图](https://images.cnblogs.com/cnblogs_com/hxd1017/1646187/o_200212110009%E6%A8%A1%E5%9D%97%E7%BB%93%E6%9E%84%E5%9B%BE.png) * 首先命令行的输入,把args提取到hashmap里存放,把参数和参数值以键值对形式存储,后面把输入的参数(值)和提供的参数(值)进行正则表达式匹配和提取,进入对应的行为中。 * 因为考虑到文档中的关键数据:省份、ip、sp、cure、dead人数会反复用到,所以将这些内容放入一个province类中存储,省份为String类型,其余四种为int型,province类中含有多种返回参数的方法和构造函数。 * 接下来是对命令参数的分析,-log和-date都是输入的,-province是对province类的数据选择输出的,-type是改变输出格式的,-out是选择输出文件的,故将date涵盖在log里,完成输入,province是中间过程,自为一体,type和out化为一体,控制输出的格式。 * -date是要求选择输入指定日期前的txt文件,把txt文件的日期部分提取出来(这部分应该用正则表达式匹配,当时没想到),转化为日期格式,与输入的-date参数值用isBefore方法比较先后,然后通过输入输出流提取文档中的关键字,将8种行为分别计算结果后,将结果存放回province类中,不同省份的类用ArrayList链接起来,至此完成了输入部分。 * -province比较简单,只需要选取name属性符合要求的province类即可,将选取后的ArrayList返回,这个参数的功能也就实现了。 * -type将选择类的指定属性以一定格式输出,从输入的命令中提取-type参数的键值,对比属性名,配对则输出属性加上格式。 * -out则是接-type,将字符串写到指定文件中。 **流程如下:** [查看原图](https://images.cnblogs.com/cnblogs_com/hxd1017/1646187/o_200212115636%E6%B5%81%E7%A8%8B%E5%9B%BE.jpg)5.代码说明
将省份定义为类,省份的名称、患病人数设为属性,创建构造函数以及各属性的get、set方法。 用hashmap建立命令参数和参数值的对应关系,以“-”开头的字符串判断为命令存为key,到下一个“-”开头的字符串之前都判断为这个命令参数的参数值,以字符串数组的形式存储,这样就可以通过索引的方式获取到参数值。 这个函数是用来处理命令参数的对应情况的,log和date管理读取,province筛选,type和out输出。 优先判断date输入的参数值是否合理,isVaildDate方法判断是否为日期格式,将文件名中的时间部分转为时间格式和和date参数值对比前后,在date前的以行为单位读取文件,将结果传到list里,正则表达式匹配提取其中的关键字分类8种,每种分别计算省份各种人数的增减,然后将省份类加入arraylist,用sortProvince方法将list中的省份按name属性排序。 提取参数为province的参数值,与list中的类的name属性对比,成功则把该类加入新list中。 将type的参数值的数组按顺序与ip、sp、cure、dead对比,选择出要输出的属性及其格式,out指定输出的文件位置。 match函数将从文件中读取的行分为8种模式,正则匹配成功就执行对应的操作,最后再加上全国的数据,返回省份类数组。 readFile、txt2String、getFile方法组合起来对读入文件的文件名进行筛选,完成文件读入的功能。 ##6.单元测试截图和描述 例如测试sortProvince方法,先建一个province类的ArrayList,然后运行sortProvince方法后对表的类顺序检查是否和预期顺序相符。 这是测试isBefore方法的,先定义几个日期的字符串,然后检查isBefore的返回值是否正确,临界值(日期相等)、年不同、月不同、日不同的日期都进行了测试,返回值都如预期。 上面的是测试isListName方法,该方法要求输入的字符串在list中时返回true,不在时返回false,先简单建立一个list,可以看到,“福建”、“湖北”是在list中的,而“江苏”不在list,返回值也都正确。 **由于测试的类过多且相似度高,参考价值不大,故没有放上来。单元测试覆盖率见下一模块内容。**7.单元测试覆盖率优化和性能测试
单元测试覆盖率:
由于测试的都是正确数据,所以没有覆盖到报错的代码部分。
暂未优化......
性能测试:
8.代码规范
代码规范的GitHub地址
点击进入
9.心路历程和收获
这次作业让我有了查缺补漏的机会,以前没好好学的内容,现在都需要补上,所以花费时间有些长,特别是正则表达式和哈希表,相当于重新学习了一遍。这次作业也顺便完成了学习计划中的Git的使用,还有其他的,如PSP表格,单元测试等对我来说的新概念的学习。因为基础较差,所以这次实践对我来说有一定难度,这也证明了学到的东西也非常多。读万卷书行万里路,在学习中实践,在实践中学习,让我对理论以及应用有了更深的理解(虽然理解还是不深刻)。
总的来说,这是一次痛并快乐着的学习过程。
10.技术路线图相关的5个仓库
-
SpringAll
- 链接: https://github.com/wuyouzhuguli/SpringAll
- 简介: 循序渐进,学习Spring Boot、Spring Boot & Shiro、Spring Cloud、Spring Security & Spring Security OAuth2,博客Spring系列源码。
-
spring-boot
- 链接: https://github.com/spring-projects/spring-boot
- 简介: 虽然Spring的组件代码是轻量级的,但它的配置却是重量级的(需要大量XML配置),不过Spring Boot 让这一切成为了过去。
-
spring-boot-api-project-seed
- 链接: https://github.com/lihengming/spring-boot-api-project-seed
- 简介: Spring Boot API Project Seed 是一个基于Spring Boot & MyBatis的种子项目,用于快速构建中小型API、RESTful API项目,该种子项目已经有过多个真实项目的实践,稳定、简单、快速。
-
vjtools
- 链接: https://github.com/vipshop/vjtools
- 简介: 唯品会Java开发手册,结合唯品会的内部经验,参考《阿里巴巴Java开发手册》《Clean Code》、《Effective Java》等重磅资料进行了大幅定制,包含核心基础类库VJKit ,问题排查工具VJMap 和 VJTop 三部分。
-
Java
- 链接: https://github.com/TheAlgorithms/Java
- 简介: 该项目用Java实现的所有算法。