软工实践寒假作业(2/2)
|这个作业属于哪个课程|2020春丨S班 (福州大学)|
:---😐:---😐:---:
|这个作业要求在哪里|软工实践寒假作业(2/2)作业要求|
|这个作业的目标|开发一个疫情统计程序|
|作业正文|我的博客|
|其他参考文献|CSDN和作业参考教材|
1.Github仓库地址
2.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 30 |
Estimate | 估计这个任务需要多少时间 | 30 | 30 |
Development | 开发 | 1380 | 1745 |
Analysis | 需求分析 (包括学习新技术) | 180 | 360 |
Design Spec | 生成设计文档 | 60 | 80 |
Design Review | 设计复审 | 30 | 30 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 60 | 45 |
Design | 具体设计 | 300 | 150 |
Coding | 具体编码 | 600 | 780 |
Code Review | 代码复审 | 30 | 60 |
Test | 测试(自我测试,修改代码,提交修改) | 120 | 240 |
Reporting | 报告 | 90 | 155 |
Test Repor | 测试报告 | 40 | 100 |
Size Measurement | 计算工作量 | 30 | 35 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 20 | 20 |
合计 | 1500 | 1930 |
3.解题思路
刚看到题目时,大致将解题分为以下三个步骤。
1.命令行处理
首先要正确处理输入的命令,才能有后续。
2.日志文件处理
- 对如下日志文件进行检测,符合要求就提取。
福建 新增 感染患者 23人
福建 新增 疑似患者 2人
浙江 感染患者 流入 福建 12人
湖北 疑似患者 流入 福建 2人
安徽 死亡 2人
新疆 治愈 3人
福建 疑似患者 确诊感染 2人
新疆 排除 疑似患者 5人
// 该文档并非真实数据,仅供测试
3.输出
- 输出如下日志文件。
全国 感染患者22人 疑似患者25人 治愈10人 死亡2人
福建 感染患者2人 疑似患者5人 治愈0人 死亡0人
浙江 感染患者3人 疑似患者5人 治愈2人 死亡1人
// 该文档并非真实数据,仅供测试使用
4.设计实现过程
设计总流程如下:
其中又按思路分为三个步骤
1.命令行解析
2.读取日志文件
3.输出
5.代码说明
(这里只展示贴代码)
func函数是用来处理命令参数的对应情况的,log和date管理读取,province筛选,type和out输出。
public static void func(HashMap<String, String[]> parseArgs,String[] args) throws ParseException {
ArrayList<province> list = new ArrayList<>();//完整的省份列表
ArrayList<province> list1 = new ArrayList<>();//经过-province筛选后的列表
String temp = null;//用来存放-type后的语句段
if(parseArgs.isEmpty()){
return;
}
if (parseArgs.containsKey("-log") && parseArgs.get("-log").length == 1){...
else{...
if (parseArgs.containsKey("-province")){...
else{...
if (parseArgs.containsKey("-out") && parseArgs.get("-out").length == 1){...
else{...
}
match函数将从文件中读取的行分为8种模式,正则匹配成功就执行对应的操作,最后再加上全国的数据,返回省份类数组。
public static ArrayList<province> match(String[] allContent){
ArrayList<province> list = new ArrayList<>();
try{
for(int i = 0; i<allContent.length; i++){
BufferedReader br = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(allContent[i].getBytes())));
String s;
while((s = br.readLine()) != null){
Pattern p1 = Pattern.compile("(.*) 新增 感染患者 (\\d*)人");
Pattern p2 = Pattern.compile("(.*) 新增 疑似患者 (\\d*)人");
Pattern p3 = Pattern.compile("(.*) 感染患者 流入 (.*) (\\d*)人");
Pattern p4 = Pattern.compile("(.*) 疑似患者 流入 (.*) (\\d*)人");
Pattern p5 = Pattern.compile("(.*) 死亡 (\\d*)人");
Pattern p6 = Pattern.compile("(.*) 治愈 (\\d*)人");
Pattern p7 = Pattern.compile("(.*) 疑似患者 确诊感染 (\\d*)人");
Pattern p8 = Pattern.compile("(.*) 排除 疑似患者 (\\d*)人");
Matcher m1 = p1.matcher(s);
Matcher m2 = p2.matcher(s);
Matcher m3 = p3.matcher(s);
Matcher m4 = p4.matcher(s);
Matcher m5 = p5.matcher(s);
Matcher m6 = p6.matcher(s);
Matcher m7 = p7.matcher(s);
Matcher m8 = p8.matcher(s);
...
}
6.单元测试截图和描述
单元测试一(输出指定日期的信息)
单元测试二(输出指定日期省份的信息)
单元测试三(输出指定日期省份的指定type信息)
单元测试四(输出累计的type信息)
单元测试七(输出指定日期省份的信息)
因其余测试重复度较大,主要用于测试日期判断,故没有贴上。
7.单元测试覆盖率优化和性能测试
单元测试覆盖率
性能测试
8.代码规范
详见仓库中的codestyle
9.心路历程与收获
事实证明,计划永远赶不上变化。当我按部就班照着计划执行时,深刻体会到能力的不足和惰性的危害,使得我的作业时间远远超出计划。
好的方面是,这次作业让我有机会重温java,有了查缺补漏的机会,对java的认知更加深刻。
了解与熟悉了git及github的简单使用方法,初步的认识了Java的单元测试与性能测试,这也是本次作业的最大收获。
学习了《构建之法》后,我也意识到了做好规划的重要性,它能避免在编写程序时匆忙添加很多不必要的属性方法,减少了工作量,提高效率。
10.技术路线图相关的5个仓库
- java教程
详细的java教程,能够大幅度提升编程能力
- 前端开发者手册
学习前端的实践手册。
- 大前端工具集——程序猿的百宝箱
大前端的瑞士军刀,只记录有用的工具。
- vue教程
基于 vue2 + vuex 构建一个具有 45 个页面的大型单页面应用
- jQuery
前端JQuery系列