张钰婷的软工实践寒假作业(2/2)
这个作业属于哪个课程 | 2020春S班(福州大学) |
---|---|
这个作业要求在哪里 | 软工实践寒假作业(2/2) |
这个作业的目标 | github初使用;代码规范制定;疫情统计程序 |
作业正文 | 张钰婷的软工实践寒假作业(2/2) |
其他参考文献 | 《构建之法》(邹欣)、百度 |
一、Git仓库地址
二、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 45 | 60 |
Estimate | 估计这个任务需要多少时间 | 45 | 60 |
Development | 开发 | 1800 | 1900 |
Analysis | 需求分析 (包括学习新技术) | 120 | 180 |
Design Spec | 生成设计文档 | 60 | 90 |
Design Review | 设计复审 | 30 | 30 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 120 | 135 |
Design | 具体设计 | 90 | 100 |
Coding | 具体编码 | 1000 | 900 |
Code Review | 代码复审 | 60 | 60 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 120 |
Reporting | 报告 | 150 | 180 |
Test Report | 测试报告 | 40 | 40 |
Size Measurement | 计算工作量 | 10 | 10 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 40 |
合计 | 1845 | 1960 |
三、解题思路描述
- 学渣日常
刚看到这次作业的时候,根本看不进去,就是一种每个字我都看得懂,但是组合起来就看不懂了的感觉。后来心静下来,又仔细看了几遍,发现还是有很多东西触及了知识盲区。于是就先将作业中的附录链接先浏览学习过一遍,从最简单的代码规范开始。
- 解题思考
- 分析需求
开始研究最难啃的代码!在多次研究题目过后,大概清楚了题目是要我们做什么,也有了大概思路,并就各阶段提出一些该深入思考的问题。
(1)首先,是对从cmd窗口传入的命令行进行处理,分析list命令的各选项。对-type,-province选项的参数该如何正确存储?
(2)其次,根据传入的路径,到指定目录下读取文件。思考该如何解析文件中出现不同情况的数据?
(3)接下来,是处理从文件中读取的各项数据。该以什么方式来存储数据呢?
(4)处理完数据,就是按照传入的参数要求输出指定内容到指定文件了。指定输出省份或者指定类型输出的该如何处理?- 深入思考
迈出了学习的第一步,然后就卡住了···还是太菜了。懒惰心理开始发作。随着deadline一天天逼近,我开始良心不安了,开始抓住舍友问东问西。
“什么?ArrayList?”“什么?HashMap?”我好像都不太熟···再次被击垮。最后还是选了最亲民的数组,用以存储各项数据。
对于日志文件的处理,也是从舍友那得知可使用split()函数进行分析处理,于是开始研究split()函数。在写代码的过程中也是,遇到不会的就百度,和舍友探讨探讨。
四、设计实现过程
代码主要分为三个模块
1、命令行参数读取分析
- 相关函数:resolveCmd(); resolveType(); resolveProvince();
- 读取传入的命令行参数,存储于args[]数组中,对数组元素进行分析判断,判断是否为-log,-out,-date,-type,-province选项,并分别对相应参数进行存储。关键在于对-type,-province相关参数的处理。
2、日志文件读取分析
- 相关函数:getFiles(); readFile(); handleFile();及其他数据存储处理函数
- 运用解析出来的命令行参数-date,-log对文件进行读取处理。对日志文件按行读取,利用split()函数对每行的数据按空格划分,再做相应分析。
- 将读取出来的数据存储到二维数组allStatistic[32][4]中,一维表示相应省份,二维表示四个相应患者类型。
3、文件输出
- 相关函数:outputFile();
- 根据-type,-province参数对数据进行输出。
五、代码说明
- 关键代码一
- 参数分析中的-type和-province参数分析存储
- 说明:设置type[]、province[]数组用于记录-type和-province的参数情况,若有相应参数,则将相应数组元素置为true,便于后面的文件输出时对-type,-province参数做相应输出。
- 关键代码二
- 日志文件分析读取中的文件处理函数
- 说明:将读取进来的一行日志文件数据用split()函数存入array[]数组。根据数组元素分别匹配相应模式并进行相应数据处理,如下:
<省> 新增 感染患者 n人(数据处理:ip+=n;)
<省> 新增 疑似患者 n人(数据处理:sp+=n;)
<省1> 感染患者 流入 <省2> n人(数据处理:省1 ip-=n;省2 ip+=n;)
<省1> 疑似患者 流入 <省2> n人(数据处理:省1 sp-=n;省2 sp+=n;)
<省> 疑似患者 确诊感染 n人(数据处理:ip+=n;sp-=n;)
<省> 死亡 n人(数据处理:dead+=n;ip-=n;)
<省> 治愈 n人(数据处理:cure+=n;ip-=n;)
<省> 排除 疑似患者 n人(数据处理:sp-=n;)
- 关键代码三
- 数据输出函数
- 说明:利用处理命令行参数时设置的相应标记来判断是否需要匹配相应要求输出。在没有-type,-province约束输出时,利用在数据处理时标记的省份存在与否标志,对没有任何疫情数据的省份不予输出。
六、单元测试截图和描述
由于对单元测试还没完全理解,故只在mainTest函数中对程序进行简单测试。
-
单元测试一
不带-type,-province参数
带-type,-province参数测试
-
单元测试二
缺少list命令
缺少-log选项
-
单元测试三
-date参数有误:
日期晚于最后更新日志时间
日期早于最早出现疫情时间
日期格式错误
-
单元测试四
-type参数输入错误
七、单元测试覆盖率优化和性能测试,性能优化截图和描述。
-
覆盖率
覆盖率较低的代码大都是由于使用大量的if-else或者switch-case结构,所以代码性能优化的话,可以从这部分下手。但是我目前还没有想到什么其他更好的方法进行改进。
-
性能测试
八、代码规范链接
九、心路历程和收获
- 心路历程
在完成本次作业的过程中,心情可谓相当复杂。从刚开始连作业要求都没看懂到摸索出了点门道开始有信心学习,再到放弃挣扎直到deadline到来才慢慢醒悟。过程中有看不懂作业的绝望,也有完成代码一个个功能时的喜悦,但更多的好像是无尽的后悔。后悔拖延症发作,没有早点完成作业;后悔当初没有好好学习多加练习敲代码,使得代码完成过程艰难,也没有很好的算法和好的架构···
- 收获
学习的开头总是难受的,但收获知识并将之付诸实践的过程不得不说是很有成就感的。借着这次作业,学会了GitHub的使用,也在GitHub中发现了很多不错的学习资料。而对于编程,不仅仅就是敲敲代码这么简单,在开始代码之前以及结束代码之后还是有很多工作要做的。通过PSP表格,将编程的过程流程化,有计划地去做一件事情,能让事情更有效率地完成。也了解了代码完成后如何有效地利用单元测试进行代码优化,虽然这次没有能够很好地应用,但来日方长嘛~~
十、技术路线图相关的5个仓库
在github上寻找你在第一次作业中技术路线图相关的5个仓库,star并fork,在博客中提供名称、链接、简介(简介30字左右)
- Python-100-Days<点击进入>
Python学习教程。
- PythonSpiderNotes<点击进入>
Python入门网络爬虫,分三大板块:抓取、分析、存储介绍Python学习网络爬虫的主要内容。详细介绍了较常用的爬虫框架Scrapy。
- awesome-python-cn<点击进入>
Python资源大全中文版,包括:Web框架、网络爬虫、模板引擎、数据库、数据可视化、图片处理等。
- pydata-notebook<点击进入>
利用Python进行数据分析 2017 第二版(Python for Data Analysis, 2nd Edition)中文翻译笔记。
- pyDataScienceToolkits_Base<点击进入>
使用Python进行数据分析实验工具NumPy、Pandas、Matplotlib、Scikit-learn的入门介绍,使用IPython Notebook格式。