疫情分析0.00.01
| 这个作业属于哪个课程 | 软件工程实践 |
|---|---|
| 这个作业要求在哪里 | 作业要求在这里 |
| 这个作业的目标 | 读取日志,按命令输出 |
| 作业正文 | 如下 |
| 其他参考文献 | 无 |
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | ||
| Estimate | 估计这个任务需要多少时间 | 10 | 10 |
| Development | 开发 | ||
| Analysis | 需求分析 (包括学习新技术) | 420 | 110 |
| Design Spec | 生成设计文档 | 60 | 10 |
| Design Review | 设计复审 | 20 | 0 |
| Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 50 |
| Design | 具体设计 | 120 | 20 |
| Coding | 具体编码 | 120 | 500 |
| Code Review | 代码复审 | 30 | 120 |
| Test | 测试(自我测试,修改代码,提交修改) | 360 | 180 |
| Reporting | 报告 | 60 | 120 |
| Test Repor | 测试报告 | 45 | 0 |
| Size Measurement | 计算工作量 | 10 | 20 |
| Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 25 | 30 |
| 合计 | 1250 | 1170 |
-
解题思路
看到题目后,发现需求大概是根据传入的命令读取日志文件,在输出到指定文件。问题主要是如何解析输入的命令(检验并存储“正则表达式匹配”)
;根据命令实体对象读取文件("多文件的IO"和文件日期的判断,对文件数据的解析并计算);计算出需要的结果并输出到文件(文件IO) -
具体设计
-
程序中的类
- Command存储输入的命令,包括检验,解析命令等功能;
- File 来进行文件的IO,包括根据命令判断数据是否需要,计算数据的功能
- Date 存储日期,用于比较日期的早晚
-
具体功能实现
- Command类,在利用字符串数组参数进行初始化的过程中进行检验格式,利用正则表达式匹配"-\w+"来定位选项,读入参数。
- File类,来进行文件的IO,文件的成员包括一个命令对象和一个int[35][4]的结果数组(用来存取所有省的所有种类的数量)。
对文件日期的判断通过定义一个日期类,将字符串转化为3个int值,并定义了一个比较大小的函数。
对文件数据的解析动过判断文件的每一行数据是否存在关键字"新增""流入"死亡""治愈""确诊""排除"来决定处理的函数,每个处理函数通过将每一行的字符串
以空格截断转化为字符串数组,此外定义了一个常量字符串数组按拼音存储全国和34个省的中文来定位每一个数据字符串数组涉及省在结果数组的索引,
处理函数通过对结果数组的数据进行修改得到最终结果
最后结果数组的数据加工一下写入文件
-
-
关键代码
/初步判断命令的格式是否正确/private boolean isCommand(String[] commandStr) { StringBuffer com = new StringBuffer(); for(int i = 0; i < commandStr.length;i ++) { com.append(commandStr[i]+" "); } String regex = "list(\\s+-\\w+\\s+\\S+)*\\s+-log\\s+\\S+(\\s+-\\w+\\s+\\S+)*\\s+-out\\s+\\S+(\\s+-\\w+\\s+\\S+)*\\s*"; if(!com.toString().matches(regex)) { System.out.println("01");//******************* return false; } return true; }/* 读入文件*/
public void fileIn() { String encoding = "UTF-8"; String dir = command.getLogFile(); File[] files = new File(dir).listFiles(); for(File file : files) { if(file.isFile() && file.exists()) { String fileDateStr = file.getName().substring(0, 10); Date fileDate =new Date(fileDateStr); if(fileDate.earlier(command.getDate())) { //System.out.println("判断日期成功!"); parseData(file , encoding); } //System.out.println("读入文件成功!"); } } } //对每一个文件的数据进行读取 private void parseData(File file , String encoding) { InputStreamReader read = null; try { read =new InputStreamReader(new FileInputStream(file), encoding); BufferedReader br = new BufferedReader(read); String text = null; //按行读取文件 while((text = br.readLine()) != null ) { String[] lineData = text.split("\\s+"); if(lineData[0].equals("//")) { break; } int proNum = 0; //匹配省名 for(int i = 0;i < 35;i ++) { if(PROVINCE[i].equals(lineData[0])) { proNum = i ; break; } } if(text.indexOf("新增") != -1) { newPatient(lineData , proNum); } if(text.indexOf("流入") !=-1){ patientFlow(lineData , proNum); } if(text.indexOf("死亡") != -1) { patientDie(lineData , proNum); } if(text.indexOf("治愈") != -1) { patientCure(lineData , proNum); } if(text.indexOf("确诊感染") != -1) { confirmIfection(lineData , proNum); } if(text.indexOf("排除") != -1) { excludeIfection(lineData , proNum); } } nationCount(); read.close(); ......思路:循环读取日志文件夹下文件,判断日期是否合格,合格则按行读取文件,解析每一行的数据
按照关键字进行分类处理,将字符串转化为字符串数组读取省份,人数信息,修改结果数组, -
单元测试截图和描述。

设计的单元测试用例,设计了一个测试文件,在主类中定义一个测试函数读取测试文件的命令循环测试。
单元测试用例的覆盖率
-
单元测试覆盖率优化和性能测试,性能优化截图和描述
由于技术的欠缺与时间的缺乏,未能将单元测试所暴露出的问题一一解决
-
心路历程与收获
本次代码由于我的经验不足,打代码的技术不够,在正式开始打代码前未能作出具体的设计,走一步看一步,面临问题才临时想解决的方法
,花在代码的时间有500分钟,而提前的需求分析与具体设计的时间不足60分钟,而正式前期的分析与设计的不足导致了具体编码的困难
,回想起来,这次作业的需求并不难,用到的新知识也几乎没有,可是设计与基础功的不足导致了我的困难,这都是我需要改进的。单元测试
的使用是一个新的方面,我在阅读了邹欣老师的博客后,感到单元测试是十分有必要的,能够系统的检查出自己的程序的bug,但由于时间的不足
与能力的有限,我未能使单元测试获得应有的效果,覆盖率未能达到100%,各种命令也不能全部解析,反应,这是我的问题,希望能在以后的编码
中改正。 -
五个仓库
Github仓库|
---|---
Tensorflow|采用数据流图(data flow graphs)用于数值计算的开源软件库。架构灵活让你可以在多种平台上展开计算
awesome-python|Python框架精选大集合
Httpie|HTTPie是一个命令行的HTTP客户端,这款神器使得命令行下调用web服务非常方便人性化.而且是彩色的输出,很漂亮,内置了测试,分析功能非常强大。
Thefuck|当你输入命令的出错的时候,直接敲一个fuck,会自动帮你修正上一条命令, 牛逼的啊!内置了自动匹配算法.
Flask|一个微型的web开发框架,轻巧而强大

浙公网安备 33010602011771号