软件工程实践2020_寒假作业(2/2)—— 疫情统计

这个作业属于哪个课程 <2020春W班 (福州大学)>
这个作业要求在哪里 <作业要求>
这个作业的目标 <建立博客、回顾、简历、绘制学习路线>
作业正文 <作业正文>
其他参考文献 <csdn,github,《码出高效_阿里巴巴Java开发手册》,《W3CSchool Junit使用教程》>

Part.01 我的Github仓库地址

在文章开头给出Github仓库地址


Part.02 PSP表格

阅读《构建之法》第一章至第三章的内容,并在下方作业里体现出阅读后的成果。特别是第2章中的效能分析及个人软件开发流程(PSP)。之后给出此次作业的PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 40
Estimate 估计这个任务需要多少时间 30 40
Development 开发 960 1415
Analysis 需求分析 (包括学习新技术) 60 60
Design Spec 生成设计文档 30 45
Design Review 设计复审 30 60
Coding Standard 代码规范 (为目前的开发制定合适的规范) 60 90
Design 具体设计 240 300
Coding 具体编码 480 720
Code Review 代码复审 60 60
Test 测试(自我测试,修改代码,提交修改) 80 80
Reporting 报告 120 165
Test Report 测试报告 60 60
Size Measurement 计算工作量 30 45
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 30 60
合计 1110 1620

Part.03 思路描述

解题思路描述。即刚开始拿到题目后,如何思考,如何找资料的过程

  • 关于思考

流程图

其实一拿到本次作业基本思路就有了,脑袋里第一浮现的思路就是这是个命令行(因为以前有用向jvm这么玩过,大一学的c也对命令行有将过一些),要解析它,文件读写,然后有八种类型的文本,因为自己也写过好几个爬虫了,所以第一反应便是用正则表达式匹配+提取参数,于是在作业当天就fork了仓库,后来定睛一看,“这次作业重点考察需求的分析”、“请在正式编写程序之前先理清需求文档”、“请在理清需求文档后先设计好程序模块、类图、数据结构、算法流程等部分”,原来这次不是仅仅要求只实现功能什么的,把首先要做的代码规范制定也看漏了,ok,乖乖关了编译器,github启动乖乖读文档。在后来的开发阶段,我觉得把本次作业分为五个内部类,在对需求文档进行分析后分为五个内部类完成本次作业(在后续实际开发中分为六个内部类):

        class CommandLine//命令行对应的实体类、  
        class CommandLineAnalytic//命令行解析类、  
        class RegexUtil//正则表达式工具类、    
        class LogUtil//Log文件工具类、   
        class LogDao//Log文件控制类、   
        class CommandLineApplication//启动类,

毕竟咱java程序员还是要面向对象一点点的,这样分模块开发自己觉得也更适合维护和后续拓展,然后对于怎么开发,自己是按class CommandLine->class CommandLineAnalytic->class RegexUtil //正则工具类(在后续开发中独立封装出来的)->class LogUti->class LogDao->class CommandLineApplication的顺序开发,包括GitHub的commit也是按照这个来的。

Commit记录

  • 关于找资料

    • 资料的话首先参考了《码出高效_阿里巴巴Java开发手册》,学到了不少东西还是,在一边学习大厂的代码规范的同时,也慢慢的把自己代码的coolstyle制定了,学着在每个方法和类添加了自动的注解方便阅读,在开发中重新看了正则表达式的教程。

Part.04 设计实现过程

设计实现过程。设计包括代码如何组织,关键函数的流程图

  • 在设计本次疫情统计系统时,为了提高程序的可维护性与拓展性,在程序的内部划分了六个内部类:

    • class CommandLine 命令行对应的实体类:因命令行组成为 命令 + 命令行参数,具体分为了两部分,class Command 命令对应的实体类、class Arguments 命令行参数对应的实体类(其中type类型因固定四种,故使用枚举类型),有对应的get、set方法,成员变量使用布尔型,表示命令行的激活状态,如命令$ java InfectStatistic list -date 2020-01-22 -log D:/log/ -out D:/output.txt对应的命令行对象即为new Commandline{list: true; date: true; date_content: 2020-01-22; log: true; log_content:D:/log/; out: true; out_content: D:/output.txt; type: false; province: false}.

    • class CommandLineAnalytic 命令行解析类: 获得main函数的命令行args拼成的List进行解析,构造对应解析结果的命令行的对象。

    命令行解析

    • class RegexUtil 正则表达式工具类:存入了对应八种类型的正则表达式,eg:String type1 = "\W+ 新增 感染患者 \d+人";先匹配对应类型,再提取参数。

    正则

    • class LogUtil Log文件工具类:首先构建了文件结构对应的实体类class InfectResult,有对应的get、set方法,覆写了toString方法 -> 以* province + " " + ip + " " + sp + " " + cure + " " + dead的格式方便按行存入结果文件;有一个处理list的class ListUtil list工具类,在解析文件时采用先列后合并的方法如文件2020-01-22.log.txt中“福建 新增 感染患者 2人”与“湖北 感染患者 流入 福建 2人“这两行就构造为“福建 2 0 0”、“湖北 -2 0 0”、“福建 2 0 0”最后再合并同类项,这样效率更高;class ResultUtil 结果工具类:封装了正则匹配后的结果。

    • class LogDao 文件控制类:initLog初始化方法为本类所有方法的起点,读入文件解析返回List<LogUtil.InfectResult>,当路径为文件时进行解析,当路径为一个目录时递归调用自身读入整个目录;outLog写入结果文件outLog(String fileName, String out_path, String commandline, List province, List type, String date)传入多个参数控制写入;sortResultByProvince方法调用Comparator接口进行中文排序。

    init

    • class CommandLineApplication 启动类:程序的起点,Application方法实例化前几个类,进行命令行解析、文件正则匹配读写。

Part.05 代码说明

代码说明。展示出项目关键代码,并解释思路


  • 项目总结构

all


  • class CommandLine//命令行对应的实体类

感觉注释描述都写的差不多,就不过多描述了(.😀

命令行对应的实体类:因命令行组成为 命令 + 命令行参数
成员变量使用布尔型,表示命令行的激活状态,如命令$ java InfectStatistic list -date 2020-01-22 -log D:/log/ -out D:/output.txt对应的命令行对象即为new Commandline{list: true; date: true; date_content: 2020-01-22; log: true; log_content:D:/log/; out: true; out_content: D:/output.txt; type: false; province: false}.

Cmdline


命令对应的实体类

Cmd


命令行参数对应的实体类(其中type类型因固定四种,故使用枚举类型)

Arg


枚举type的四种类型

Enum


封装枚举的类

Dto


实例化的枚举选项

Option


  • class CommandLineAnalytic//命令行解析类

Option


  • class CommandLineAnalytic//命令行解析类

解析命令行生成对应实例
Analytic


  • class RegexUtil//正则表达式工具类

定义了对应八种类型的正则表达式以进行匹配
Reg


正则提取参数
Reg


  • class LogUtil//Log文件工具类

文件结构对应的实体类class InfectResult,有对应的get、set方法,覆写了toString方法 -> 以* province + " " + ip + " " + sp + " " + cure + " " + dead的格式方便按行存入结果文件
Util


处理list的class ListUtil list工具类,在解析文件时采用先列后合并的方法如文件2020-01-22.log.txt中“福建 新增 感染患者 2人”与“湖北 感染患者 流入 福建 2人“这两行就构造为“福建 2 0 0”、“湖北 -2 0 0”、“福建 2 0 0”最后再合并同类项,这样效率更高
Util


结果工具类:封装了正则匹配后的结果
Util


  • class LogDao//Log文件控制类

initLog初始化方法为本类所有方法的起点,读入文件解析返回List<LogUtil.InfectResult>,当路径为文件时进行解析,当路径为一个目录时递归调用自身读入整个目录
Init


outLog写入结果文件outLog(String fileName, String out_path, String commandline, List province, List type, String date)传入多个参数控制写入
out


sortResultByProvince方法调用Comparator接口进行中文排序
sort


  • class CommandLineApplication//启动类

启动类:程序的起点,Application方法实例化前几个类,进行命令行解析、文件正则匹配读写
Application


Part.06 单元测试截图和描述

单元测试截图和描述

因有六个大的内部类,于是分为五部分进行单元测试(启动类都是实例化前几个类没啥好测的),使用maven仓库管理插件junit
pom


  • 命令行类单元测试

命令行类单元测试
TestCMDL

测试构造函数:测试了构造命令行中每个成员的状态情况,着重测试对于type:ArrayList typeOption测试 与 province:ArrayList province_content测试
TestCMDL

测试结果
TestCMDL


  • 命令行解析类单元测试

命令行解析类单元测试
TestCMDL

测试解析函数:构建测试(测试命令行:$ java InfectStatistic list -log D:\log\ -out D:\ListOut2.txt -date 2020-01-22 -province 福建 河北),测试返回的布尔型及内容是否解析正确
TestCMDL

测试结果
TestCMDL


  • 正则工具类单元测试

正则工具类单元测试
TestRegex

测试正则提取参数:构建测试(测试了四种类型的正则提取),测试返回的封装的参数是否正确
TestRegex
TestRegex

测试结果
TestRegex


  • Log工具类单元测试

Log工具类单元测试
TestLog

测试合并list:测试合并list中的同省项
TestLog

测试结果
TestRegex


  • Log控制类单元测试

Log控制类单元测试
TestLog

测试合并log文件的读入初始化、排序、写入
TestLog

测试结果
TestRegex


Part.07 单元测试覆盖率优化和性能测试

单元测试覆盖率优化和性能测试,性能优化截图和描述

  • 代码覆盖率

TestRegex


TestRegex

  • 性能测试
    使用Jprofiler 11.0进行性能分析

TestRegex

TestRegex

优化策略

  • 字符串的String调用次数最多,可能不少图方便被写到了循环体中的定义的局部变量,导致多次不必要调用,把能提的提出来

  • I/O流操作时,在使用完毕后,没有及时关闭以释放资源,对这些大对象的操作会造成系统大的开销

  • 采用懒加载的策略,即在需要的时候才创建

  • 不要在循环中使用try…catch…,应该把其放在最外层

  • 本次的文件处理,使用带缓冲的输入输出流进行I/O操作

  • 减少类型强转的使用,尤其是向下的强转

  • 不要让public方法中有太多的形参

  • 字符串变量和字符串常量equals的时候将字符串常量写在前面


Part.08 代码规范

给出你的代码规范的链接,即你的仓库中的codestyle.md


Part.09 心路历程与收获

结合在构建之法中学习到的相关内容,撰写解决项目的心路历程与收获

在这次的作业里学到了不少东西,在代码的开发阶段主要还是相当于把java的一些基础的知识温习了一遍,正则表达式还需要不断学习,还不算精通。反而在开发之外的东西学到了不少,比如PSP表格这是自己第一次给自己定一个开发标准进行开发,由于是第一次这样制定,也有很多不合理的地方,导致比预期多了500min,在下次的开发中会适当增加编码和设计的时间;受益匪浅的是单元测试,肤浅的学习了一点点Junit框架的使用,发现以前自己觉得单元测试在浪费时间的想法大错特错,(以前觉得测试就是随便实例一下方法分块跑一下,没报错就好了),也有助于debug不少,不然自己以前觉得一手断点打天下;使用了Jprofiler进行了性能分析,说实话自己对代码的性能优化还不是很懂,就凭自己的理解胡诌了一点。


Part.10 5个仓库

在github上寻找你在第一次作业中技术路线图相关的5个仓库,star并fork,在博客中提供名称、链接、简介(简介30字左右)

spring cloud + vue + oAuth2.0全家桶实战,前后端分离模拟商城,完整的购物流程、后端运营平台,可以实现快速搭建企业级微服务项目,支持微信登录等三方登录。

Netty是一个广泛使用Java网络编程框架,Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。

这是一份Java学习指南,涵盖大部分Java程序员所需要掌握的核心知识。

Design patterns是程序员在设计应用程序或系统时可用来解决常见问题的最佳实践手册。它可以帮助你加快开发进程,有效防止一些可能导致重大失误的细节问题,不过深入了解java-design-patterns之前,你应提前熟悉各种编程/软件设计原则。

该项目基于 Spring Boot 2.1.0 、 Jpa、 Spring Security、redis、Vue的前后端分离的后台管理系统,项目采用分模块开发方式, 权限控制采用RBAC,支持数据字典与数据权限管理,支持一键生成前后端代码,支持动态路由。


posted @ 2020-02-06 02:39  221701412_theTuring  阅读(1120)  评论(4编辑  收藏  举报