一、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. swarm 集群

    1.创建manage节点 $docker swarm init --advertise-addr=192.168.0.38(主机ip) To add a worker to this swarm, r ...

  2. zz——Recent Advances on Object Detection in MSRA

    本文由DataFun社区根据微软亚洲研究院视觉组Lead Researcher Jifeng Dai老师在2018 AI先行者大会中分享的<Recent Advances on Object D ...

  3. maven warnning 'build.plugins.plugin.version' is missing

    裝完maven后,package或clean时出错:[WARN] [WARN] Some problems were encountered while building the effective ...

  4. [LeetCode] 926. Flip String to Monotone Increasing 翻转字符串到单调递增

    A string of '0's and '1's is monotone increasing if it consists of some number of '0's (possibly 0), ...

  5. hunter-冲刺合集

    冲刺合集 一·项目相关 作业相关 具体描述 所属班级 2019秋福大软件工程实践Z班 作业要求 团队作业第五次-项目冲刺 作业正文 hunter--冲刺集合 团队名称 hunter小组 作业目标 最终 ...

  6. Python-lambda使用

    什么是lambda 匿名函数,不需要命名的函数: 语法 lambda 参数 : 返回值 g = lambda x: 2*x+1 g(2) >5

  7. 推荐一款手机清理工具App悟空清理

    推荐一款手机清理工具App悟空清理 1 介绍 悟空清理是一款完全免费的手机加速与存储空间清理工具软件,强力去除顽固垃圾,使手机运行更畅快. 2 特色功能介绍 悟空在手,清理无忧!悟空清理,人人都在用的 ...

  8. .NET Core:Token认证

    现在是WebAPI的时代,你所需要面对的不止是浏览器了,通常会使用Web, WebApp, NativeApp等多种呈现方式.其中诸如Ember,Angular,Backbone之类的前端框架类库正随 ...

  9. 【spring boot】【idea】100.idea新建一个spring boot项目

    1.idea新创建一个项目 2.setting进入,选择自己的Maven 3.简单补充一下pom.xml <?xml version="1.0" encoding=" ...

  10. .net持续集成cake篇之常见文件及路径操作

    系列目录 Cake常见文件和路径操作 在自动化构建任务里,很多操作都是跟文件打交道,比如文件打包,文件压缩,文件归档,文件传输,目录清理等.本节介绍一些cake里常见的文件操作方法 Cake相对路径问 ...