软工实践寒假作业(2/2)
这个作业属于哪个课程 | 2020春s班 |
---|---|
这个作业要求在哪里 | 软工实践寒假作业要求 |
这个作业的目标 | 开发一个简易疫情统计程序,熟悉GitHub使用 |
作业正文 | 软工实践寒假作业(2/2) |
其他参考文献 | 知乎、博客园、CSDN |
一、GitHub仓库地址
https://github.com/ZhangJiaWeiDEV/InfectStatistic-main
二、构建之法&PSP
2.1学习《构建之法》
2.2PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 90 | 60 |
Estimate | 估计这个任务需要多少时间 | 30 | 10 |
Development | 开发 | 1200 | 840 |
Analysis | 需求分析 (包括学习新技术) | 180 | 200 |
Design Spec | 生成设计文档 | 60 | 30 |
Design Review | 设计复审 | 60 | 30 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 60 | 40 |
Design | 具体设计 | 120 | 150 |
Coding | 具体编码 | 540 | 240 |
Code Review | 代码复审 | 120 | 60 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 90 |
Reporting | 报告 | 300 | 200 |
Test Repor | 测试报告 | 200 | 120 |
Size Measurement | 计算工作量 | 20 | 10 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 80 | 70 |
合计 | 1620 | 1110 |
三、解题思路
3.1理清文档结构
2217001118
--src
--InfectStatistic.java
--Lib.java
src下源代码【仅】允许包括这两个文件,Lib可以为空但必须存在
--README.md
描述项目,包括如何运行、功能简介、作业链接、博客链接等
--codestyle.md
描述代码风格
3.2使用GitHub与GitHubDesktop
- 下载git与Github Desktop,fork主仓库到自己的仓库
- 学习git命令和Github Desktop基本操作,了解commit,.gitignore,push,pr等
3.3需求整理
命令行(win+r cmd)cd到项目src下,之后输入命令java InfectStatistic list
后面的参数可以为:
- -log 指定日志目录的位置,该项必会附带,请直接使用传入的路径,而不是自己设置路径。
- -out 指定输出文件路径和文件名,该项必会附带,请直接使用传入的路径,而不是自己设置路径。
- -date 指定日期,不设置则默认为所提供日志最新的一天。你需要确保你处理了指定日期以及之前的所有log文件。
- -type 可选择[ip: infection patients 感染患者,sp: suspected patients 疑似患者,cure:治愈 ,dead:死亡患者],使用缩写选择,如 -type ip 表示只列出感染患者的情况,-type sp cure则会按顺序【sp, cure】列出疑似患者和治愈患者的情况,不指定该项默认会列出所有情况。
- -province 指定列出的省,如-province 福建,则只列出福建,-province 全国 浙江则只会列出全国、浙江。
命令中必须包含-log和-out,其余参数没有则取默认值。
样例:java InfectStatistic list -date 2020-01-22 -log D:/log/ -out D:/output.txt
通过观察分析样例发现,命令行命令除去首部的运行命令“java InfectStatistic”,剩余的部分会保存在args[]中,而参数为固定的-log、-out、-date...,因此可以通过判断args中的字符串是否与这些参数相等,并提取后方的所需数据。
命令中没有出现的参数则取默认值,题目中没有表面参数的顺序是否固定,所以当参数顺序不一样时也要能够进行处理,比如
java InfectStatistic list -out D:/output.txt -date 2020-01-22 -log D:/log/
3.4日志样本分析
日志文件的命名遵守对应的规范: 年-月-日.log.txt ,如
2020-01-22.log.txt
由于日志文件命名格式固定,所以直接删除掉尾部的".log.txt"便可获取该日志文件的日期。
该日志中出现以下几种情况:
1、<省> 新增 感染患者 n人
2、<省> 新增 疑似患者 n人
3、<省1> 感染患者 流入 <省2> n人
4、<省1> 疑似患者 流入 <省2> n人
5、<省> 死亡 n人
6、<省> 治愈 n人
7、<省> 疑似患者 确诊感染 n人
8、<省> 排除 疑似患者 n人
分析上述情况,可发现谓语包括“新增”、“流入”、“死亡”、“治愈”、“确诊感染”以及“排除”,其中的“新增”以及“流入”又有“感染患者”和“疑似患者”两种处理对象。
所以对于文件里的每行记录,可以通过判断字符串中含有的谓语类别来进行分类,分开处理增加或减少的人数。
3.5创建数据结构
分析需要输出的内容容易发现,省份名称必须输出,还要根据参数来选择输出该省的感染人数、疑似患者人数、治愈人数以及死亡人数。所以可以创建一个Province类:
public class Province{
private String name; //省份名称
private int infectNumber; //感染人数
private int suspectNumber; //疑似人数
private int cure; //治愈人数
private int dead; //死亡人数
//构造等其他方法
...
}
四、设计实现过程
五、代码说明
Province类:
Province对象通过add(String object, int number)和minus(String object, int number)来直接控制属性的增多和减少,比如
新增疑似患者5人就是只需调用add("疑似患者",5)
治愈10人就是调用minus("感染患者",10)和add("治愈",10)
public class Province{
private String name; //省份名称
private int infectNumber; //感染人数
private int suspectNumber; //疑似人数
private int cure; //治愈人数
private int dead; //死亡人数
//add函数参数为增加的对象object和增加的人数number
public void add(String object, int number)
{
switch(object)
{
case "感染患者":
this.infectNumber += number;
break;
case "疑似患者":
this.suspectNumber += number;
break;
case "治愈":
this.cure += number;
break;
case "死亡":
this.dead += number;
default:
break;
}
}
//构造函数和get函数此处不做说明,minus函数和add函数类似,也不作说明
}
获取cmd命令的参数和值:
比如输入以下cmd命令
java InfectStatistic list -date 2020-01-22 -log D:/log/ -out D:/output.txt
后,args[]的值如下
args[0]为"list"
args[1]为"-date"
args[2]为"2020-01-22"
args[3]为"-log"
args[4]为"D:/log/"
args[5]为"-out"
args[6]为"D:/output.txt"
程序通过直接对args进行处理来获得参数和值
for(int i = 0; i < args.length; i++)
{
switch(args[i])
{
case "-log":
log = args[i + 1];
break;
case "-out":
out = args[i + 1];
break;
case "-date":
date = args[i + 1];
break;
case "ip":
type[typeNumber] = "ip";
typeNumber++;
break;
case "sp":
type[typeNumber] = "sp";
typeNumber++;
break;
case "cure":
type[typeNumber] = "cure";
typeNumber++;
break;
case "dead":
type[typeNumber] = "dead";
typeNumber++;
break;
case "-province":
while(i < args.length - 1)
{
if(!args[i + 1].contains("-"))
{
outputProvince[outputNumber] = args[i + 1];
outputNumber++;
}
else
{
break;
}
i++;
}
default:
break;
}
}
将需要输出的省份按拼音排序:
使用 CHINA 的 Collator 来对汉字进行排序
public static void provinceSort()
{
//数据交换防止Array.sort因存在空指针的报错
String string[] = new String[outputNumber];
for(int i = 0; i < outputNumber; i++)
{
string[i] = outputProvince[i];
}
Comparator< Object > cmp = Collator.getInstance(java.util.Locale.CHINA);
Arrays.sort(string, cmp);
for(int i = 0; i < outputNumber; i++)
{
outputProvince[i] = string[i];
}
}
六、单元测试
Text1 先对给出的第一个样例进行测试
命令:java InfectStatistic list -date 2020-01-22 -log C:/Users/张嘉伟的电脑/Documents/GitHub/InfectStatistic-main/example/log/ -out C:/Users/张嘉伟的电脑/Desktop/demo.txt
运行成功!
Text2 对给出的第二个样例进行测试
命令:java InfectStatistic list -date 2020-01-22 -log C:/Users/张嘉伟的电脑/Documents/GitHub/InfectStatistic-main/example/log/ -out C:/Users/张嘉伟的电脑/Desktop/demo.txt -province 福建 河北
运行成功!
Text3 对给出的第三个样例进行测试
命令:java InfectStatistic list -date 2020-01-22 -type cure dead ip -log C:/Users/张嘉伟的电脑/Documents/GitHub/InfectStatistic-main/example/log/ -out C:/Users/张嘉伟的电脑/Desktop/demo.txt -province 全国 浙江 福建
运行成功!
Text4 对自己编写的较为复杂的命令进行测试
命令:java InfectStatistic list -province 四川 浙江 北京 全国 湖北 福建 -type dead ip cure -out C:/Users/张嘉伟的电脑/Desktop/demo.txt -log C:/Users/张嘉伟的电脑/Documents/GitHub/InfectStatistic-main/example/log/ -date 2020-01-25
运行成功!
七、单元测试覆盖率优化
覆盖率:
八、代码规范链接
https://github.com/ZhangJiaWeiDEV/InfectStatistic-main/blob/master/221701118/codestyle.md
九、心路历程及收获
该次作业相较于上次作业增添了很多需要新学的东西,这次的需求刚开始看的时候觉得很复杂,但开始上手码代码后发现还是挺简单,都是些对于以前所学知识的灵活运用。在这次作业中,编程方面遇到的最大的问题就是汉字的拼音排序,查询了很多资料试了很多方法要么是不能完全正确地排序、要么是直接报错,最后还是重审代码时发现被排序的数组里含有空指针而Arrays的排序里并不允许。。。。
之前我也稍微使用过github,下载了GitHubDesktop也有自己的账号,虽然并不怎么使用也不熟悉,但这次作业里github方面进行得还是很顺利的.
这次作业对我而言最困难的是后面的单元测试,PSP、单元测试什么的以前从来没有接触过,刚开始做这次作业时对此也不怎么重视。后来阅读了《构建之法》后,发现里面提到了许多问题都是自己目前存在的,即使自己以前有意无意的一些开发风格和习惯,都会影响着一个软件的成功与否。今后,做软件开发不仅仅要学新技术,提高技术水平,还要不断学习如何开发、如何规范、如何管理,不断练习实践,把解决常遇到的问题变成习惯,才能更好地去开发软件。
十、JAVA学习的五个仓库
-
JavaGuide
链接:https://github.com/ZhangJiaWeiDEV/JavaGuide
简介: 涵盖大部分Java程序员所需要掌握的核心知识。 -
technology-talk
链接:https://github.com/ZhangJiaWeiDEV/technology-talk
简介:汇总java生态圈常用技术框架、开源中间件,系统架构、项目管理、经典架构案例、数据库、常用三方库、线上运维等知识。 -
fullstack-tutorial
链接:https://github.com/ZhangJiaWeiDEV/fullstack-tutorial
简介:后台技术栈/全栈开发/架构师之路,秋招/春招/校招/面试。 -
advanced-java
链接:https://github.com/ZhangJiaWeiDEV/advanced-java
简介:Java 工程师进阶知识完全扫盲:涵盖高并发、分布式、高可用、微服务等领域知识,后端同学必看,前端同学也可学习。 -
JCSprout
链接:https://github.com/ZhangJiaWeiDEV/JCSprout
简介:处于萌芽阶段的 Java 核心知识库。
作者:zhang_jw
链接:https://www.cnblogs.com/zjwblogs/p/SoftwareVacationWork2.html