这个作业属于哪个课程 | 福大软工2020春S班 |
---|---|
这个作业要求在哪里 | 寒假作业(2/2) |
这个作业的目标 | 学习使用github,完成要求的疫情统计程序 |
作业正文 | 324蔡俊 |
其他参考文献 | java、百度、CSDN、简书 |
一、github仓库地址
作业的主仓库
我的github仓库
二、《构建之法》的心得
第一章概述
解释了什么是程序、什么是软件工程、软件地特性、软件工程地组成等等,为自己的学习有了一个基本的认识。
第二章个人技术和流程
向我们讲诉的单元测试,回归测试,效能分析等,提高了自己的效率。
第三章软件工程师的成长
学到了成为软件工程师所要具备的条件,分别是:1.积累软件开发相关知识,提升技能技术。2.积累问题领域的知识和经验。3.对通用的软件设计思想和软件工程的理解。让我对软件工程师的职业发展认识到了很多。
PSP表格
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 80 |
Estimate | 估计这个任务需要多少时间 | 1500 | 1600 |
Development | 开发 | 720 | 750 |
Analysis | 需求分析 (包括学习新技术) | 120 | 130 |
Design Spec | 生成设计文档 | 60 | 60 |
Design Review | 设计复审 | 60 | 80 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 60 | 60 |
Design | 具体设计 | 60 | 80 |
Coding | 具体编码 | 720 | 750 |
Code Review | 代码复审 | 120 | 130 |
Test | 测试(自我测试,修改代码,提交修改) | 120 | 130 |
Reporting | 报告 | 120 | 120 |
Test Repor | 测试报告 | 60 | 60 |
Size Measurement | 计算工作量 | 30 | 30 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 60 | 80 |
合计 | 1620 | 1760 |
三、解题思路
如何思考?
一开始看到这题有点懵,题目有点太繁琐了,后面我提取了这次作业的关键点。
1.日志作用。
2.指令参数。
3.输出方式。
通过以上关键点,理清了解题思路:
首先,理清日志里面有哪些情况和变量(遗漏的通过后面的编写再补)。
其次,对题目要求的命令参数进行编写,通过自定义函数判断命令参数是否符合要求。
再次,通过命令传递的参数调用自定义函数对输入日志进行各种操作。
最后,通过操作改变定义的变量,输出所需参数在输出日志上。
(在每一步完成都会一些测试,确保问题不在最后一起出现)
查找资料?
对github的使用云里雾里的,查找这方面操作百度的最多;代码的编写主要查找一些自己要用到的函数和正则表达式,比如提取系统时间,字符串,读写文件等。
四、设计实现过程
实现指令参数
解析输入命令,保存输入命令,对参数进行解析,判断命令正误,实现变量的修改。
读取日志内容
读取文件内容,并进行日志内特定数据计算,根据指令参数输出所需文本内容。
五、代码说明
1、定义的变量
//日志地址
public String logaddr;
public String resultaddr;
//省份
public String[] province={"全国","安徽","北京","重庆","福建","甘肃",
"广东","广西","贵州","海南","河北","河南","黑龙江","湖北",
"湖南","吉林","江苏","江西","辽宁","内蒙古","宁夏","青海",
"山东","山西","陕西","上海","四川","天津","西藏", "新疆",
"云南","浙江","澳门","香港","台湾"};//各省名称
public int[] is_province=new int[35];//统计各省是否需要输出
public int[][] person = new int[35][4];//各省各类人群
//list命令参数
public String[] li_cmd={"-log","-out","-date","-type","-province"};
//感染类型
public String[] type={"ip","sp","cure","dead"};//感染类型
public String[] cntype={"感染患者", "疑似患者", "治愈", "死亡"};//感染类型
public int[] in_type={1,1,1,1};//0不输出,为1输出
//获取当前时间
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date d = new Date(System.currentTimeMillis());//获取当前时间
public String date_now = formatter.format(d); //转化格式
//判断是否输出其它省
public int flag=0;
2、Command类,用各种函数检测指令参数是否正确
a.get_Logaddr()//-log,检测输入日志文件地址
b.get_Resultaddr()//-out,检测输出日志地址
c.get_Date()//-data,检测日期
d.get_Type()//-type,检测指定患病类型
e.get_Province()//-province,检测省份
以下是调用个函数检测的总函数isrt_cmd()
//解析命令
public boolean isrt_cmd() {
if (!cmd[0].equals("list")) {//判断命令格式开头是否正确
System.out.println("命令开头非list,错误");
return false;
}
int i;
int istake0=0;
int istake1=0;
//-log,-out必须附带
for (i = 1; i < cmd.length; i++) {//参数验证
if (cmd[i].equals(li_cmd[0])) {
i++;//读取地址
i = get_Logaddr(i);
if(i == -1) {
System.out.println("输入日志路径参数错误");
return false;
}
else
istake0++;//检测-log是否产生
} else if (cmd[i].equals(li_cmd[1])) {
i++;//读取地址
i = get_Resultaddr(i);
if(i == -1) {
System.out.println("输出日志路径参数错误");
return false;
}
else
istake1++;//检测-log是否产生
} else if (cmd[i].equals(li_cmd[2])) {
i++;
i = get_Date(i);
if(i == -1) {
System.out.println("日期参数错误");
return false;
}
} else if (cmd[i].equals(li_cmd[3])) {
i++;
i = get_Type(i);
if(i == -1) {
System.out.println("患者参数错误");
return false;
}
} else if (cmd[i].equals(li_cmd[4])) {
i++;
i = get_Province(i);
if(i == -1) {
System.out.println("省份参数错误");
return false;
}
}else{
System.out.println("无该参数,请检查输入是否错误");
return false;
}
}
if(istake0<1){
System.out.println("请输入正确的-log指令");
return false;
}else if(istake1<1){
System.out.println("请输入正确的-out指令");
return false;
}
return true;
}
3、File_handle类,处理日志输入输出
a.get_Flist(),读取路径下的文件(a调用b,b调用c)
b.Read_txt(),读取文本内容
c.Deal_txt(),处理文本
d.Write_txt()/show(),输出文本
以下列举其中两个:
//读取路径下的文件
public void get_Flist() {
File[] flist;
String fname;
File file = new File(logaddr);//获取指定目录下文件
flist = file.listFiles();
int i;
for (i = 0; i < flist.length; i++) {
fname = flist[i].getName();//文件名
if (fname.compareTo(date_now) <= 0) {
String alladdr = logaddr + fname;
/*
用来检验是否找到符合要求的文件地址
System.out.println(alladdr);
*/
Read_txt(alladdr);
}
}
}
//读取文本内容
public void Read_txt(String address) {
try {
BufferedReader bf;
bf = new BufferedReader(new InputStreamReader(
new FileInputStream(new File(address)), "UTF-8"));
String rLine = null;
/*隔行读取了
while(br.readLine()!=null){
rLine=br.readLine();//按行读取
//if (!rLine.startsWith("//")){
System.out.println(rLine);
//}
*/
while ((rLine = bf.readLine()) != null) {
if (!rLine.startsWith("//")) {
/*
检测文档读取是否正确
System.out.println(rLine);
*/
Deal_txt(rLine);
}
}
bf.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
六、单元测试截图和描述
对list下的各个参数-log,-out,-date,-type,-province进行了单独和混合测试,包括错误参数测试。
测试实例如下:
总的测试
测试一到三
测试四到七
测试八到十
测试结果:都符合指令
七、覆盖率优化和性能测试
1、单元测试覆盖率
在覆盖率方面,由于测试的比较全面,故覆盖率较高,几乎覆盖了所有代码,还有一些未覆盖的地方即为测试用例不到位或一些异常捕捉语句,和一些没有使用错误输入参数,也便不会覆盖到那部分的代码。其他正确性的代码基本可以通过单元测试覆盖到位。
2、性能测试
部分功能可以简略减少时间,有的地方有想法但是没实现,优化程度还不够
八、代码规范
1890的代码规范
九、心路历程与收获
通过这次项目学习了部分《构建之法》,第一次接触到单元测试和学习性能测试,并且发现自己在思考问题和编写代码过程中许多不合理的地方,需要改进。学习要成为一名软件工程师所必备的一些准备:1.积累软件开发相关知识,提升技能技术。2.积累问题领域的知识和经验。3.对通用的软件设计思想和软件工程的理解。发现自己还有许多学习的地方,要在接下来的学习中更加认真,学会充分利用时间合理规划学习计划。
十、技术路线图相关的5个仓库
仓库地址 | 内容简介 |
---|---|
https://github.com/DuGuQiuBai/Java | 包含许多java知识点,一系列学习java过程 |
https://github.com/qianguyihao/Web | 详细的web前端入门和进阶学习笔记 |
https://github.com/jobbole/awesome-mysql-cn | MySQL 资源大全中文版 |
https://github.com/zhonglinlin1305/Spring | spring mvc,spring,分别与jdbctemplate等的全注解整合 |
https://github.com/wxiaoqi/Spring-Cloud-Admin | Cloud-Admin,国内首个基于Spring Cloud微服务化开发平台 |