WC个人项目(JAVA)
一、github地址
https://github.com/Mexinz/WC/tree/master
二、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 46 |
· Estimate | · 估计这个任务需要多少时间 | 30 | 46 |
Development | 开发 | 1100 | 1177 |
· Analysis | · 需求分析 | 30 | 30 |
· Design Spec | · 生成设计文档 | 30 | 45 |
· Design Review | · 设计复审 | 30 | 40 |
· Coding Standard | · 代码规范 | 20 | 20 |
· Design | · 具体设计 | 60 | 60 |
· Coding | · 具体编码 | 720 | 752 |
· Code Review | · 代码复审 | 30 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 180 | 200 |
Reporting | 报告 | 90 | 85 |
· Test Report | · 测试报告 | 30 | 35 |
· Size Measurement | · 计算工作量 | 20 | 15 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 40 | 35 |
合计 | 1220 | 1308 |
三、解题思路
-
文件IO操作
这是一个处理文本的程序,需要用到Java的IO流和正则表达式,IO流分为字节流和字符流,我用到了FileInputStream和BufferedReader两个输入流(该程序不涉及写操作不需要输出流),因为解析的是代码文件,其中都是字符,所以用BufferedReader字符流进行操作会更加简单便捷
-
设计模式
输入不同的参数需要对文件进行不同的解析,而这些文件解析对象都是相似的,因此使用简单工厂模式,当以后有改变时,修改工厂类方法即可。并且文件解析对象没有实例变量,在全局中每种文件解析对象也只需要一个,因此也使用了单例模式,减少内存的占用。
-
结果的封装
无论是处理成功的结果还是处理失败的结果,为了便于上层统一处理,成功和失败的结果对象实现了一个统一的接口。将具体实现和业务逻辑分离开,增加程序的可扩展性。
-
错误类型
因为用户总会有奇怪的输入,因此会出现不同的错误,为了程序的可读性和可维护性,将错误定义成枚举类
-
通配符?和*
在递归处理中,将通配符转换成相应的正则表达式进行匹配。将上层的目录部分截取出来获取该目录下的所有文件,再通过正则表达式进行匹配筛选出正确的文件。
-
图形界面
使用idea中的GUI Former拉出一个简单的界面,添加listener到按钮上,再将处理后的结果呈现在textArea上。
-
测试
以前对待测试没有特别认真,就是简单用Junit测一下,这次上网查了下如何检测测试分支覆盖率,发现idea自带的插件结合Junit就可以,十分方便快捷。
四、设计实现过程
代码组成:
运行流程:
五、测试运行
测试文件包括空文件、只有一个{的文件、只有一对{}的文件、单个字符、一个单词、一对{}括住一个单词、一行代码、正常的java源代码、正常的源代码txt文件
-
测试非递归功能
/**
* 非递归
*/空文件:
单个字符:
单个单词:
单独一行:
正常的源代码文件:
参数错误:
文件不存在:
-
测试递归功能
/**
* 递归
*/路径下有多个文件:
配合通配符(url为 testFiles/?ord*.java):
图形化界面:
经检查,运行结果均与预期结果一致
测试分支覆盖率:
六、项目总结
本次WC项目使用Java编程,Maven作项目依赖管理,Junit框架作测试,idea自带插件作测试分支覆盖率检测插件。在项目的开发过程中,我意识到一个好的项目架构对于后期开发的重要性。前期的准备,需求分析,项目框架的搭建,都比真正写业务代码重要的多。在前期多运用面向对象的方法去写出可维护性和可拓展性高的代码,意义更为重大。
原文地址:https://www.cnblogs.com/mexinz/p/11587863.html
- centos下部署NTP时间服务器同步环境记录
- ASP.NET MVC扩展库
- centos7.2部署vnc服务记录
- nginx访问报错:Too many open files accept:
- iptables之NAT端口转发设置
- 使用Combres 库 ASP.NET 网站优化
- jQuery和asp.net mvc相关资源链接
- JavaScriptSerializer 序列化json 时间格式
- Nginx反向代理+负载均衡简单实现(https方式)
- 在网页中给Flash加上超级链接
- ASP.NET MVC HandleErrorAttribute 和 远程链接
- javascript实现数字转大写金额的函数
- 如何在GridView的Footer内显示总计?
- 自定义WCF的配置文件
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Android平台RTMP推流或轻量级RTSP服务(同屏或摄像头)编码前数据接入类型总结
- 接口测试框架实战(二) | 搞定多环境下的接口测试
- MySQL 案例:“丢失数据”的谜题
- 接口测试框架实战(三) | APIObject 模式、原则与应用
- 接口测试框架实战(四) | 通用 API 封装实战
- 面试字节两轮后被完虐,一份字节跳动面试官给你的Android技术面试指南,请查收!
- 3分钟短文:说说Laravel模型中还算常用的2个“关系”
- iOS音视频接入 - TRTC实时屏幕分享
- 如何维护爬虫代理
- LoRaWAN 帧计数机制及典型问题分析
- ffmpeg mp4解码管道输出的问题
- 机器人运动控制仿真:Matlab机器人工具箱和Simmechanics
- 使用HTMLTestRunner实现HTML测试报告
- Jmeter五步实现性能测试
- 测试工程师必须要掌握的linux命令