寒假作业(2/2)

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

Github仓库地址: 疫情统计
代码规范 : https://github.com/koananan/InfectStatistic-main/blob/release/221701232/codestyle.md

2.PSP表格

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

3.解题思路

需求分析
1.读取指定路径下所有格式为YYYY-MM-dd.log.txt的日志文件,统计日志文件的信息并输出到指定的文件
2.支持处理命令行参数.

日志文件可能出现的几种情况
1、<省> 新增 感染患者 n人
2、<省> 新增 疑似患者 n人
3、<省1> 感染患者 流入 <省2> n人
4、<省1> 疑似患者 流入 <省2> n人
5、<省> 死亡 n人
6、<省> 治愈 n人
7、<省> 疑似患者 确诊感染 n人
8、<省> 排除 疑似患者 n人
PS:日志中各种情况的出现顺序不定,省出现的顺序不定,出现哪些省不定,省出现几次不定。
输出文件样例
全国 感染患者22人 疑似患者25人 治愈10人 死亡2人
福建 感染患者2人 疑似患者5人 治愈0人 死亡0人
浙江 感染患者3人 疑似患者5人 治愈2人 死亡1人
// 该文档并非真实数据,仅供测试使用
PS : 每一行记录的输出顺序规则如下
1.先输出全国,其他省份按汉字拼音排序,且只输出日志文件中出现过的省份
2.如果命令行指定了-province,则应该输出所有指定的项没有指定就不必输出,顺序同规则1
命令行样例:java InfectStatistic list -date 2020-01-22 -log D:/log/ -out D:/output.txt
list命令 支持以下命令参数:
 -log 指定日志目录的位置,该项必会附带,请直接使用传入的路径,而不是自己设置路径
 -out 指定输出文件路径和文件名,该项必会附带,请直接使用传入的路径,而不是自己设置路径
 -date 指定日期,不设置则默认为所提供日志最新的一天。你需要确保你处理了指定日期之前的所有log文件
 -type 可选择[ip: infection patients 感染患者,sp: suspected patients 疑似患者,cure:治愈 ,dead:死亡患者],使用缩写选择,
 如 -type ip 表示只列出感染患者的情况,-type sp cure则会按顺序【sp, cure】列出疑似患者和治愈患者的情况,不指定该项默认会列出所有情况。
 -province 指定列出的省,如-province 福建,则只列出福建,-province 全国 浙江则只会列出全国、浙江
 PS:java InfectStatistic表示执行主类InfectStatistic,list为命令,-date代表该命令附带的参数,-date后边跟着具体的参数值,
 如2020-01-22。-type 的多个参数值会用空格分离,每个命令参数都在上方给出了描述,每个命令都会携带一到多个命令参数

类图设计
1.Record类用来存储一个省份的统计信息
2.Container类是多个Record的聚合,方便对所有记录的排序输出等操作
3.CmdArgs类用来处理命令行参数
4.CommonUtil类是一个工具类包含的都是公共静态方法,用来整合与业务逻辑无关的重复代码
5.Lib类用来存储全局的参数方便修改
6.InfectedStatistic是程序的主类
1.主类为InfectedStatistic

寒假作业(2/2)_第1张图片

时序图设计
程序流程如下
1.InfectedStatistic类调用CmdArgs类处理命令行参数
2.根据CmdArgs处理的结果调用CommonUtil类获得待读入的文件
3.读入文件信息后指定type, provinces参数调用Container类将信息输出
4.container类指定type参数调用record类将信息输出
寒假作业(2/2)_第2张图片

4.代码说明

处理日志信息
将一行字符串按空格拆分为字符串数组。将所有可能出现的日志信息分为3类,在每个分类中再去匹配不同类型的信息。因为一开始没有想到用正则表达式判断,再则数据类型比较少所有逻辑上还算简单,如果数据类型多的话感觉还是用正则比较合适,强行解释

寒假作业(2/2)_第3张图片

处理中文排序用和文件按日期排序
主要是用TreeMap来实现对省份的排序,而我实现的Comparator类内部还是用JAVA库的java.util.Local.CHINA.但是这个方法不能解决多音字的问题,但是话说只有重庆是多音字所有我就强行把重换成其他C开头的字,这里的修改只是对排序的键值修改记录内部没有变动。就算自己实现一个中文排序但是要解决多音字的问题自我感觉困难,所以就用此下策,强行解释。文件排序则是将文件路径截取日期部分后转化为Date来比较。

寒假作业(2/2)_第4张图片
寒假作业(2/2)_第5张图片

5.单元测试

单元测试思路

1.测试CmdArgs类处理合理的命令行参数,对于不合理的命令行参数可以正确报错并安全退出。
寒假作业(2/2)_第6张图片
2.测试省份排序的正确性
寒假作业(2/2)_第7张图片
3.测试工具类中的方法正确性,例如测试getFiles方法保证fileMap中文件是按时间顺序排序好的,且文件的时间不能超过当前日期,因为这是不合理的。

寒假作业(2/2)_第8张图片
4.指定多个命令行参数测试并将输出结果与正确结果对比
寒假作业(2/2)_第9张图片

单元测试覆盖率

寒假作业(2/2)_第10张图片

6.性能优化

性能测试, 测试数据为作业提供, 命令行参数为
java InfectStatistic list -log XXX -out XXX -date 2020-01-23 -type cure dead ip -province 全国 浙江 福建 重庆 安徽 河南 湖北 北京 上海 四川 贵州 江苏 陕西 山东 宁夏 海南 黑龙江
测试显示对省份的排序耗时比较大,目前没有想到优化方法。

寒假作业(2/2)_第11张图片

7.心路历程与收获

   **这一次作业最大的收获就是学到了就算是开发一个很小的程序也需要有完备的程序开发流程,而不是随便没有规划的编码然后不断地修复。
《构建之法》中也提到了程序开发的几个阶段。如果我们只是为了一时的乐趣写一段代码大可不必关心软件的可维护性和可扩展性。但是当我们的
开发的程序要变成一个产品,就必须遵循软件工程开发的流程才能有条理地进行开发。之前开发程序都没有写测试的经历,经过这次作业我感觉测
试真的很重要,测试写的好就可以不断回归测试代码的正确性,这样在改动代码之后也能确认是否写出了bug。当然测试代码也不是万能的。之前
开发都没有先认真设计再去开发,而是匆忙开始,经常推翻修改。所以设计的重要性就不言而喻了。
  最后总结就是学到很多新的技术,还要继续努力学。**

8 Springboot相关Github仓库

  1. Mall

    基于 SpringBoot+MyBatis 实现的一套电商系统,包括前台商城系统及后台管理系统。
    前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务、帮助中心等模块。
    后台管理系统包含商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等模块。

  2. V 部落

    使用 Vue + SpringBoot 实现的多用户博客管理平台。

  3. Springboot-plus

    基于 SpringBoot 2 的管理后台系统,包含了用户管理,组织机构管理,角色管理,功能点管理,菜单管理,权限分配,数据权限分配,代码生成等功能。

  4. spring-boot-pay

    这是一个支付案例,提供了包括支付宝、微信、银联在内的详细支付代码案例,对于有支付需求的小伙伴来说,这个项目再合适不过了。

  5. spring-boot-examples

    这是一个专注帮助初学者学习 Spring Boot 的开源项目,里面分享了各种场景下 Spring Boot 使用示例,此开源项目下都是一个一个独立的小项目,以最小依赖、最简单的方式呈现出来,非常方便初始者学习。

你可能感兴趣的:(寒假作业(2/2))