寒假作业(2/2)——疫情统计
这个作业属于哪个课程 | 2020春W班 |
---|---|
这个作业要求在哪里 | 寒假作业(2/2)——疫情统计 |
这个作业的目标 | 初学习GitHub的使用,指定代码规范,开发一个疫情统计程序 |
作业正文 | 寒假作业(2/2)——疫情统计 |
其他参考文献 | 《码出高效_阿里巴巴Java开发手册》等 |
1.Github仓库地址
作业的主仓库:https://github.com/numb-men/InfectStatistic-main
我的仓库:https://github.com/hyh990511/InfectStatistic-main
2.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 30 |
Estimate | 估计这个任务需要多少时间 | 20 | 30 |
Development | 开发 | 1000 | 1230 |
Analysis | 需求分析 (包括学习新技术) | 120 | 150 |
Design Spec | 生成设计文档 | 30 | 40 |
Design Review | 设计复审 | 30 | 40 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 20 |
Design | 具体设计 | 60 | 80 |
Coding | 具体编码 | 550 | 660 |
Code Review | 代码复审 | 60 | 90 |
Test | 测试(自我测试,修改代码,提交修改) | 120 | 150 |
Reporting | 报告 | 90 | 70 |
Test Report | 测试报告 | 30 | 30 |
Size Measurement | 计算工作量 | 20 | 10 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 60 | 40 |
合计 | 1240 | 1460 |
3.解题思路描述
当我从头到尾到作业要求看完,尤其是把疫情程序统计的需求文档看了好几遍。我大致了解了这次作业的核心是叫我们开发一个用命令行输入命令来读取对应日志文件然后根据对应要求来输出文件的疫情统计程序。很快,我就想到可以解析命令行的每一个参数,然后进行文件处理来完成我的程序(见下图)。但是由于我对字符串的应用不够好,加上Git,GitHub以及单元测试,单元测试和覆盖率这些东西平时虽有耳闻,却没有自己尝试过,所以我准备通过上网查资料来解决我的这些问题。
4.设计实现过程
通过设计,我把代码主要分为一个主类InfectStatistic和他的两个内部类CmdAgrsParse(命令行参数解析类)和FileDispose(文件处理类),主类主要有一些属性和主函数,CmdAgrsParse类负责命令行参数解析,FileDispose类负责文件处理。CmdAgrsParse类主要是解析命令行参数的函数,FileDispose类有读取日志文件,处理日志文件,根据要求输出文件这三个主要函数。(下图为解析命令行函数的简略流程图)
5.代码说明
主要展示一下解析读取日志文件,处理日志文件以及根据要求输出文件的函数(代码说明在注释里基本可以看明白)
public void readLogTxt(String filePath){ //读取日志文件内容
try {
BufferedReader bfr = new BufferedReader
(new InputStreamReader(new FileInputStream(new File(filePath)),"UTF-8")); //通过普通的缓存方式文本读取,编码为UTF-8
String readLine = null;
while ((readLine = bfr.readLine()) != null) { //按行读取文本内容
if(! readLine.startsWith("//")) //遇到“//”不读取
handleReadLine(readLine); //开始进行文本内容的处理
}
bfr.close(); //关闭文件
} catch (Exception e) { //异常处理
e.printStackTrace();
}
}
public void handleReadLine(String readLine){ //处理文本内容的信息
//总共有以下八种可能出现的文本信息,运用正则表达式来表示,并且用正则表达式判断是哪种出现的情况
String readLine1 = "(\\S+) 新增 感染患者 (\\d+)人";
String readLine2 = "(\\S+) 新增 疑似患者 (\\d+)人";
String readLine3 = "(\\S+) 治愈 (\\d+)人";
String readLine4 = "(\\S+) 死亡 (\\d+)人";
String readLine5 = "(\\S+) 感染患者 流入 (\\S+) (\\d+)人";
String readLine6 = "(\\S+) 疑似患者 流入 (\\S+) (\\d+)人";
String readLine7 = "(\\S+) 疑似患者 确诊感染 (\\d+)人";
String readLine8 = "(\\S+) 排除 疑似患者 (\\d+)人";
if(Pattern.matches(readLine1, readLine)) //判断正则表达式是否一致,下同
addToIP(readLine);
if(Pattern.matches(readLine2, readLine))
addToSP(readLine);
if(Pattern.matches(readLine3, readLine))
addToCure(readLine);
if(Pattern.matches(readLine4, readLine))
addToDead(readLine);
if(Pattern.matches(readLine5, readLine))
flowIntoIP(readLine);
if(Pattern.matches(readLine6, readLine))
flowIntoSP(readLine);
if(Pattern.matches(readLine7, readLine))
makeSPtoIP(readLine);
if(Pattern.matches(readLine8, readLine))
excludeSP(readLine);
}
public void writeOutTxt() { //输出文件内容
FileWriter fwriter = null;
int i, j;
provinceExist[0] = 1;
try {
fwriter = new FileWriter(outPath);
if(isProvinceExist == 0){ //若-province未指定
for(i = 0; i < 35; i++){
if(provinceExist[i] == 1){
fwriter.write(provinceStr[i] + " ");
if(isTypeExist == 0){ //若-type未指定
for( j = 0; j < 4; j++)
fwriter.write(typeStr[j] + peopleNumber[i][j] + "人 ");}
else{ //若-type指定
for( j = 0; j < 4; j++)
if(type[j] != 0)
fwriter.write(typeStr[type[j]-1] + peopleNumber[i][type[j]-1] + "人 ");
}
fwriter.write("\n");
}
}
}
else { //若-province有指定
for(i = 0; i < 35; i++){
if(province[i] == 1){
fwriter.write(provinceStr[i] + " ");
if(isTypeExist == 0){ //若-type未指定
for( j = 0; j < 4; j++)
fwriter.write(typeStr[j] + peopleNumber[i][j] + "人 ");
}
else{ //若-type指定
for( j = 0; j < 4; j++)
if(type[j] != 0)
fwriter.write(typeStr[type[j]-1] + peopleNumber[i][type[j]-1] + "人 ");
}
fwriter.write("\n");
}
}
}
fwriter.write("// 该文档并非真实数据,仅供测试使用");
}
catch (Exception e) {
e.printStackTrace();
} finally {
try {
fwriter.flush();
fwriter.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
6.单元测试截图和描述
单元测试主要采用了Eclipse的Junit测试,测试了十个样本,测试时间以及样本输入输出见下图。
7.单元测试覆盖率优化和性能测试
覆盖率测试采用了Eclipse的插件Eclemma来测试,性能测试采用任务管理器上的性能测试,展示CPU和磁盘的性能。
优化分析:单元测试覆盖率和性能测试应该还是不错,但是由于我算法能力比较薄弱,在代码里很少用到复杂度低,效率高的算法,所以可能用时较高。比如我用for循环比较多,for循环里面的判断比较好时这样。希望以后多注意,然后增强自己的算法能力。
8.代码规范链接
代码规范:https://github.com/hyh990511/InfectStatistic-main/blob/master/221701226/codestyle.md
9.心路历程和收获
通过这次作业,我学到了很多方法来帮助我以后的学习,比如PSP表格,Git,Github,Junit以及Eclemma的学习应用等等。这些都能在以后帮助我更有效率的开发程序,让我受益匪浅。这次开发程序比PSP表格上的预计时间多了四个小时,我觉得主要还是编程能力不足导致,出现bug容易卡壳,刚开始设计思路时候走了弯路,这些都值得我好好反思。Git和Github的学习使用使得我以后开发程序有了很好的工具。而我以前是不怎么重视优化以及单元测试的,只觉得程序在运行在编译的时候不出错,能完成需求就行,而这次单元测试以及覆盖率测试以及Junit和Eclemma的学习应用则让我以后要对这块重视起来。以后我会按照更好的方向,更高的目标来要求自己开发程序。
10.Github技术相关的五个仓库
名称 | 链接 | 简介 |
---|---|---|
java-design-patterns | https://github.com/iluwatar/java-design-patterns | 设计模式可以通过提供经过验证的经过验证的开发范例来加速开发过程。 |
spring-boot | https://github.com/spring-projects/spring-boot | Spring Boot可以轻松创建独立的生产级基于Spring的应用程序 |
incubator-dubbo | https://github.com/apache/incubator-dubbo | Apache Dubbo(孵化)是阿里开源的一个基于Java的高性能开源RPC框架 |
java8-tutorial | https://github.com/winterbe/java8-tutorial | 绝对值得一看的Java8指南、教程 |
weixin-java-tools | https://github.com/Wechat-Group/weixin-java-tools | 可能是目前最好最全的微信Java开发工具包,支持包括微信支付、开放平台、小程序、企业号和公众号等的开发 |