寒假作业(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是程序的主类
7.主类为InfectedStatistic
时序图设计
程序流程如下
1.InfectedStatistic类调用CmdArgs类处理命令行参数
2.根据CmdArgs处理的结果调用CommonUtil类获得待读入的文件
3.读入文件信息后指定type, provinces参数调用Container类将信息输出
4.container类指定type参数调用record类将信息输出
4.代码说明
处理日志信息
将一行字符串按空格拆分为字符串数组。将所有可能出现的日志信息分为3类,在每个分类中再去匹配不同类型的信息。因为一开始没有想到用正则表达式判断,再则数据类型比较少所有逻辑上还算简单,如果数据类型多的话感觉还是用正则比较合适,强行解释。
处理中文排序用和文件按日期排序
主要是用TreeMap来实现对省份的排序,根据助教的建议比较器类内部实现是建立一个省份与Integer的映射按正确排序的顺序进行比较。文件排序则是将文件路径截取日期部分后转化为Date来比较。
5.单元测试
单元测试思路
1.测试CmdArgs类处理合理的命令行参数,对于不合理的命令行参数可以正确报错并安全退出。
2.测试省份排序的正确性
3.测试工具类中的方法正确性,例如测试getFiles方法保证fileMap中文件是按时间顺序排序好的,且文件的时间不能超过当前日期,因为这是不合理的。
4.指定多个命令行参数测试并将输出结果与正确结果对比
单元测试覆盖率
6.性能优化
性能测试, 测试数据为作业提供, 命令行参数为
java InfectStatistic list -log XXX -out XXX -date 2020-01-23 -type cure dead ip -province 全国 浙江 福建 重庆 安徽 河南 湖北 北京 上海 四川 贵州 江苏 陕西 山东 宁夏 海南 黑龙江
测试显示对省份的排序耗时比较大,目前没有想到优化方法。
7.心路历程与收获
**这一次作业最大的收获就是学到了就算是开发一个很小的程序也需要有完备的程序开发流程,而不是随便没有规划的编码然后不断地修复。
《构建之法》中也提到了程序开发的几个阶段。如果我们只是为了一时的乐趣写一段代码大可不必关心软件的可维护性和可扩展性。但是当我们的
开发的程序要变成一个产品,就必须遵循软件工程开发的流程才能有条理地进行开发。之前开发程序都没有写测试的经历,经过这次作业我感觉测
试真的很重要,测试写的好就可以不断回归测试代码的正确性,这样在改动代码之后也能确认是否写出了bug。当然测试代码也不是万能的。之前
开发都没有先认真设计再去开发,而是匆忙开始,经常推翻修改。所以设计的重要性就不言而喻了。
最后总结就是学到很多新的技术,还要继续努力学。**
8 Springboot相关Github仓库
基于 SpringBoot+MyBatis 实现的一套电商系统,包括前台商城系统及后台管理系统。
前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务、帮助中心等模块。
后台管理系统包含商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等模块。
使用 Vue + SpringBoot 实现的多用户博客管理平台。
基于 SpringBoot 2 的管理后台系统,包含了用户管理,组织机构管理,角色管理,功能点管理,菜单管理,权限分配,数据权限分配,代码生成等功能。
这是一个支付案例,提供了包括支付宝、微信、银联在内的详细支付代码案例,对于有支付需求的小伙伴来说,这个项目再合适不过了。
这是一个专注帮助初学者学习 Spring Boot 的开源项目,里面分享了各种场景下 Spring Boot 使用示例,此开源项目下都是一个一个独立的小项目,以最小依赖、最简单的方式呈现出来,非常方便初始者学习。