软件工程实践2020第二次作业
这个作业属于哪个课程 | 2020春W班(福州大学) |
---|---|
这个作业的要求在哪里 | 寒假作业(2/2) |
这个作业的目标 | 疫情统计 |
其他参考文献 | 哔哩哔哩、CSDN、菜鸟教程、博客园等 |
1. GitHub仓库地址
疫情统计
2. PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 40 | 50 |
Estimate | 估计这个任务需要多少时间 | 40 | 50 |
Development | 开发 | 1830 | 2370 |
Analysis | 需求分析 (包括学习新技术) | 900 | 1020 |
Design Spec | 生成设计文档 | 60 | 60 |
Design Review | 设计复审 | 30 | 30 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 60 | 90 |
Design | 具体设计 | 60 | 90 |
Coding | 具体编码 | 480 | 720 |
Code Review | 代码复审 | 60 | 60 |
Test | 测试(自我测试,修改代码,提交修改) | 240 | 300 |
Reporting | 报告 | 100 | 130 |
Test Repor | 测试报告 | 30 | 50 |
Size Measurement | 计算工作量 | 30 | 30 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 40 | 50 |
合计 | 1970 | 2550 |
3. 解题思路
- 根据题目需求,在解析用户输入的命令时直接判断第一个字符串是不是"list"来确定是否为list命令,不是直接结束程序并提出错误信息。
- 确定是list命令后,解析list命令的参数及其参数值是否合法,非法则将抛出异常输出错误原因结束程序。
- 前两步都通过后就读取所提供的日志目录下的合法命名的日志文件,处理文件内容并输出至指定的文件中,最后结束程序。
- 理清思路后开始根据所需要的技术在网上查找相关教程,如在廖雪峰的官方网站上学习git,哔哩哔哩上学习GitHub及GithubDesktop的使用等。
4. 设计思路
最开始打算设计一个处理list参数的基类然后派生出多个基类分别处理其不同参数所要求的功能,后来觉得不好设计处理顺序,如果先处理-log、-out再处理-date、-type、-province后面几个参数处理类需要较多的成员变量存储前面已经处理好的结果,存在较大的资源浪费所以最后改成只设计一个list命令处理类即:ListCommand,外加一个异常类:IllegalException用来当判断参数或参数值非法时利用该异常类存储错误信息,最后在主函数中输出错误信息。
5. 代码说明
- list命令处理类说明
成员变量ipMap,spMap,cureMap以及deadMap以键值对形式存储各省份不同类型的人数,利用已经排好序的数组provincesArray(全国在第一个),顺序插入最开始各省份各类型数据均为0。inDirectory及OutDirectory分别存储-log和-out参数值;date,types和provinces分别存储-date,-type和-province参数值;-dateIsExist,-typeIsExist和-provinceIsExist分别用来记录用户是否输入-date,-type和-province参数。 s1-s8为合法日志文件中每一行所需遵循的正则表达式。
成员方法dealParameter(String[])负责判断用户输入的list命令,非法则抛出异常IllegalException,合法则将初始化与参数处理有关的成员变量。sort()方法负责对-provinces的参数值排序,利用前面以及排好序的数组可降低设计算法的难度;carryOutActions()方法负责执行参数所要求的操作,它将调用handleFiles(File)方法,该方法负责读取目录日志下符合命名要求XXXX-XX-XX.log.txt的日志文件以及将处理结果输出到指定文件中。handleFiles(String)负责处理指定日志文件中内容。getAmount(String)方法负责提取出满足s1-s8正则表达式所要求的字符串中的数字(即人数);out(BufferedWriter,List)负责具体输出。
- dealParameter(String[])方法
对参数进行合法验证,-out、-log参数及其参数值要求存在且仅存在一次。如果有输入-province则会验证是否有输入其参数值同时要求参数值合法即输入为全国或为存在的省份。对于-date参数如果有输入该参数则其参数值要么不存在要么仅存在一个且符合XXXX-XX-XX形式。对于-type参数,如果有输入参数值则验证其参数值是否在ip,sp,cure,dead范围内。对于所有参数的参数值如果可以存在多个参数值则验证其参数值是否有重复如果重复则抛出异常。
- sort()方法
- handleFile(String)方法
处理日志文件,主要利用String的indexOf函数找出省份在字符串中的下标和数字所在的下标而后得出省份及人数即可更新人数。
6. 单元测试
设计三个测试函数,dealParameterTest()测试是否可以检查出各种非法命令,sortTest()测试是否可以正确对用户输入的省份进行排序,carryOutActionsTest()测试是否可以正确处理文件内容,如日志目录下有非法命名的日志文件是否能够正确忽略等。
部分截图如下:
7. 单元测试覆盖率优化和性能测试
暂无优化方案
8. 代码规范
codestyle.md
9. 心路历程与收获
第一次看到这个作业的时候还是比较懵逼的,像git,gitHub,单元测试等这些都是第一次接触到所以对于作业里面的很多要求都不知道是在要求什么。然后只能一步一步开始,先去学习github和git的基础知识对作业的实现才有了基本思路。然后便开始实现,由于Java一学期没用过所以用Java编写代码的时候不是很娴熟导致很多地方都是后面才发现这么写不合理又回去改。总的来说这次作业给我带来的收获还是很大,对于github的使用和单元测试也有了初步的掌握同时也复习了一下Java的编程,但仍有许多要改进的地方如对于性能优化还是没做到位,时间预估不合理基本上都超时了。
10. 技术路线图相关的5个仓库
-
bootstrap
最受欢迎的 HTML,CSS 和 JavaScript 框架,用于在网络上开发响应式,移动优先项目。
https://github.com/twbs/bootstrap -
freeCodeCamp
开放源码代码库和课程,可以在这里免费学习编码。
https://github.com/freeCodeCamp/freeCodeCamp -
ElemeFE/element
Element,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的组件库,提供了配套设计资源,帮助你的网站快速成型。通过基础的 24 分栏,迅速简便地创建布局。
https://github.com/ElemeFE/element -
基于Vue开发的XMall商城前台页面 PC端
https://github.com/Exrick/xmall-front -
腾讯移动Web前端知识库
https://github.com/AlloyTeam/Mars