一、Github地址:https://github.com/734635746/WC


二、PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 30
· Estimate · 估计这个任务需要多少时间 30 30
Development 开发 1130 970
· Analysis · 需求分析  100 80
· Design Spec · 生成设计文档 40 50
· Design Review · 设计复审  40 60
· Coding Standard · 代码规范 20 30
· Design · 具体设计 80 60
· Coding · 具体编码 700 600
· Code Review · 代码复审 30 30
· Test · 测试(自我测试,修改代码,提交修改) 120 60
Reporting 报告 120 130
· Test Report · 测试报告 60 50
· Size Measurement · 计算工作量 20 30
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 40 40
合计   1280 1130

三、解题思路

  在仔细阅读完项目的需求后,我发现了整个项目的流程主要就是接收具体的参数对指定的文件进行具体的操作。

  1.文件操作对象的设计

    由于对文件的处理是通过不同的参数来实现不同的处理、而且这些不同的操作基本是只依赖于处理参数和文件路径。我首先想到的是采用多态的思想,将这些不同的操作封装成不同的处理类并且让这些处理类实现同一个接口(FileProcessor)、这样做可以通过接口调用公共方法而实现不同的处理行为、提高了代码的可扩展性

  2.简单工厂模式

    如果直接通过new的方式来创建文件处理对象那么将会使代码冗余、不易浏览与维护。所以我采用了简单工厂模式,通过具体的操作参数(-a、-l、-w、-c)去工厂获取对应的文件处理对象进行处理。由于采用了简单工厂设计模式了,所以外界只管通过参数来获取对象,而不用关心对象的具体创建,利于整个软件体系结构的优化

  3. 处理结果的返回

   一开始我想直接将处理的结果通过字符串的方式返回。但感觉有些违反了对修改开放-对扩展开放的原则,如果以后的返回的信息多样化了之后,代码将会很难修改。所以我将处理返回结果设计成一个类(FileResult).将需要返回的内容作为属性封装在对象中返回。再之后,我考虑到文件的处理并不一定成功还需要返回错误对象。所以我设计一个错误返回类(ErrorResult),同时让处理结果类和错误返回类实现接口(result)。便于结果的统一处理。

  4. 错误类型的枚举

   考虑到程序的可读性以及后期的扩展性,设计了一个错误类型的枚举(ErrorTypeEnum),用于枚举程序中有可能出现的错误,并且在错误返回类中支持了错误类型枚举。提高的程序的可读性

   5. 递归处理的实现

   到这里实现的还是对于当个指定文件的处理。对于实现处理多个文件的功能来说、递归是个好的思想。将“-s”作为第一个参数可以开启递归处理。对于用户输入的目录/文件,首先将会根据处理参数(-a、-l、-w、-c)去工厂获取对应的文件处理对象,然后调用递归处理器(RecursiveProcessor)来递归地获取目录下的所有文件路径,再通过刚才获取的文件处理对象进行批量处理,返回一个处理结果的列表。

  6.通配符的支持

    程序可以通过“-s”参数配合实现通配符匹配文件的功能。具体实现思路是判断用于输入的文件url是否含有“*”、"?",如果有将进行通配符匹配。

     首先截取url的目录部分通过递归处理获取目录下的所有文件类型的url,  然后通过一个工具函数将含有通配符的文件名转成一个正则表达式。最后采用Pattern类进行模式匹配,将匹配的文件路径进行处理放回处理结果集。

  8. 图形界面

    图形界面的设计比较简单,就是通过设计一个JFrame通过jFileChooser控件选择文件进行处理,再将处理结果显示在TextArea控件上,底层还是调用工厂来获取处理对象进行处理。

   8. 主类

    主类主要是负责接收处理参数调用不同的文件处理对象进行处理然后接收处理结果进行显示。

   

  总体来说这次项目的完成还是比较顺利,但是代码还是有一定的冗余性可以继续进行优化。最主要就是在开始编码之前要先设计好大概的处理流程以及模块划分。使用学过的知识来优化代码,尽量降低代码的耦合性,提高代码的可读性、可扩展性和易修改性。


四、设计实现过程    

  代码主要分成个 主类、错误枚举、 处理结果类 、处理工厂及其处理类 、工具类、图形界面类 六个部分

主要调用流程:


五、测试运行

测试文件包括:一个空文件、一个只有一个字符的文件、一个只有一个单词的文件、一个标准的java源文件、一个多目录嵌套的文件

5.1 测试非递归的功能(-l、-a、-w 、-c)

@org.junit.Test
public void testFunction_2() throws IOException {
String url = "F:\\file\\k.txt";
String[] params= new String[]{"-a","-l","-w","c"};
for (String param : params) {
testOneProcessor(url,param);
} } private void testOneProcessor(String url, String param) throws IOException {
FileProcessor processor = FileProcessorFactory.getFileProcessorOf(param);
result result = processor.disposeFileOf(url);
result.showResult();
}

5.1.1 测试空文件

5.1.2 测试一个只有一个字符的文件

5.1.3 测试一个只有一个单词的文件

5.1.4 测试标准java源文件

5.1.5 测试不存在的文件

5.2 测试非递归的功能(-s -a/-w/-l/-c)

 5.2.1 测试多目录嵌套的文件

@org.junit.Test
public void test() throws IOException {
String url = "F:\\file\\k.txt";
String[] params= new String[]{"-a","-l","-w","c"};
for (String param : params) {
testRecursive(url,param);
}
} private void testRecursive(String url, String param) throws IOException {
FileProcessor processor = FileProcessorFactory.getFileProcessorOf(param);
RecursiveProcessor processor1 = new RecursiveProcessor(processor, url);
List<result> result = processor1.getDisposeResult();
for (com.lyb.bean.result result1 : result) {
result1.showResult();
}
}

 5.2.2 测试多目录嵌套的文件配合通配符?

@org.junit.Test
public void testFunction2() throws IOException {
String url = "F:\\file\\?.txt";
FileProcessor processor = FileProcessorFactory.getFileProcessorOf("-a");
RecursiveProcessor processor1 = new RecursiveProcessor(processor, url);
List<result> result = processor1.getDisposeResult();
for (com.lyb.bean.result result1 : result) {
result1.showResult();
}
}

5.3 测试图形化功能(-x)

经过验证所有处理结果与预期结果一致

代码覆盖率:

由于图形化界面的测试是单独测试而不是在单测中进行,所以代码覆盖率中图形界面的代码覆盖率为0。也由于这样,所以一些在图形界面中使用的api没有覆盖到。


 六、项目总结

  本次项目选用java作为开发语言、maven作为构建工具、junit做单元测试、jacoco做代码覆盖率检查插件。

  遵循一定的代码开发规范、努力使用面向对象的思想解决问题。运用软件工程的方法努力写出较为规范的代码、尽量降低模块的耦合度。但是还是存在不足,代码的冗余度还是比较高。总体来说这是一个比较好的练手项目,即复习了java中的IO流使用,也学着运用软件工程的思想来规范开发。

个人项目-WC (java实现)的更多相关文章

  1. 个人项目 wc(java实现)

    一.Github网址: https://github.com/Clarazhangbw/Wc.exe 二.PSP表 PSP2.1 Personal Software Process Stages 预估 ...

  2. 个人项目:Java实现WC

    Java实现WC Github项目地址:https://github.com/auxshaw/WC 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个 ...

  3. 个人项目wc(Java)

                                                      个人项目(Java) 一丶Github地址:https://github.com/SAH2019/S ...

  4. 个人项目-wc

    个人项目-WC   (C语言) 一.Github地址:https://github.com/Lin-J-F/WC 二.PSP表格 PSP2.1 Personal Software Process St ...

  5. [转载]将别人的项目或JAVA文件导入到自己的Eclipse中时,常常会出现JAVA文件的中文注释变成乱码的情况,解决办法

    eclipse 代码中文注释乱码 求解决 将别人的项目或JAVA文件导入到自己的Eclipse中时,常常会出现JAVA文件的中文注释变成乱码的情况,主要原因就是别人的IDE编码格式和自己的Eclips ...

  6. Java web项目引用java项目,类型找不到

    Java web项目引用java项目,类型找不到 错误信息: java.lang.ClassNotFoundException: org.codehaus.jackson.map.ObjectMapp ...

  7. ubuntu下eclipse新建项目没有java project的解决办法

    装好了eclipse之后却发现新建项目没有java project的选项,大致搜索了一下,并没有发现很好的解决方案(大都是让你重新安装什么的),于是开始瞎鼓捣,并且找到了一个方案: 在终端切换到roo ...

  8. Maven项目中java类报错-Cannot resolve symbol

    电脑蓝屏了,强制重启之后再打开IDEA里面的项目,所有Java类文件都在报Cannot resolve symbo错误,可以确定所有依赖的包都有引用且jar包没有冲突. 经查询找到这个解决方法: 在I ...

  9. 【MyEcplise】导入项目报错:Errors running builder 'JavaScript Validator' on project '项目名'. java.lang.ClassCastException

    导入项目报错:Errors running builder 'JavaScript Validator' on project '项目名'. java.lang.ClassCastException ...

随机推荐

  1. 解决IIS7、IIS7.5 应用程序池回收假死的方法

    最近iis网站一直假死状态,都懵了,查看程序有没有关闭数据库,反复捣鼓,还一直测试是否是程序应用池自动回收问题依然没有效果.经过老师提醒,找到了解决办法,在此做个笔记! 原因在于:应用程序池超时配置被 ...

  2. IDEA中的模板文件设置

    idea中的设置 Settings>Editor>File and code Templates>Includes>File Header 中粘贴下面的表达格式 /** * @ ...

  3. SSH使用ProxyCommand通过代理服务器远程连接其他服务器

    当前环境拓扑图:   用户管理海外服务器,通过公网SSH远程时,由于网络质量原因公网丢包严重,这就导致管理员在对海外云主机进行管理时体验较差,表现形式可能是由于公网丢包严重执行命令卡顿,或者SSH进程 ...

  4. Linux基于FPM制作RPM包(以Nginx为例)

    1.搭建Epel  Yum源  安装在线yum源 [root@localhost ~]# rpm -ivh epel-release-latest-.noarch.rpm //安装扩展源 [root@ ...

  5. [LeetCode] 834. Sum of Distances in Tree 树中距离之和

    An undirected, connected tree with N nodes labelled 0...N-1 and N-1 edges are given. The ith edge co ...

  6. Maven使用第三方Jar文件

    本例中,需要在Maven项目里添加uiautomator.jar文件.以下介绍两种方法: 方法一:在pom.xml里指定jar文件目录 <dependency> <groupId&g ...

  7. 用Python搞定九宫格式的朋友圈。内附“马云”朋友圈

    PIL(Python Imaging Library)是一个非常强大的Python库,但是它支持Python2.X, 在Python3中则使用的是Pillow库,它是从PIL中fork出来的一个分支. ...

  8. BizTalk增强型RosettaNet跟踪报告

      BizTalk 的数据报表能力一直是比较弱的,好在Rosettanet 支持使用BAM 跟踪功能来跟踪各PIP消息状态.增强的跟踪功能能跟踪流程为消息.错误和事件.不可否认性的数据.可以根据跟踪的 ...

  9. Qt Quick 常用元素:RadioButton(单选框),CheckBox(复选框) 与 GroupBox(分组框)

    先介绍一下 ExclusiveGroup. ExclusiveGroup (互斥分组)本身是不可见元素,用于将若干个可选择元素组合在一起, 供用户选择其中的一个选项.你可以在 ExclusiveGro ...

  10. Navicat Premium 12 安装与激活

    一.Navicat Premium 12下载 官方下载地址:https://www.navicat.com.cn/download/navicat-premium 百度云盘:https://pan.b ...