个人项目(java实现)

一、github地址:https://github.com/Moyjing/Moy

二、psp表格

 

PSP2.1

Personal Software Process Stages

预估耗时(分钟)

实际耗时(分钟)

Planning

计划

 30  30

   · Estimate

   · 估计这个任务需要多少时间

 30  20

Development

开发

2010 1985

   · Analysis

   · 需求分析 (包括学习新技术)

 90  110

   · Design Spec

   · 生成设计文档

 60  75

   · Design Review

   · 设计复审 (和同事审核设计文档)

 30  30

   · Coding Standard

   · 代码规范 (为目前的开发制定合适的规范)

 30  20

   · Design

   · 具体设计

 120  100

   · Coding

   · 具体编码

 1500  1440

   · Code Review

   · 代码复审

 60  80

   · Test

   · 测试(自我测试,修改代码,提交修改)

 120  130

Reporting

报告

120   140

   · Test Report

   · 测试报告

 60  50

   · Size Measurement

   · 计算工作量

 30  40

   · Postmortem & Process Improvement Plan

   · 事后总结, 并提出过程改进计划

 30  50

合计

   2160  2155

 

三、解题思路分析

首先说明代码运行的环境:eclipse,JRE System Library[J2SE-1.5]

看到题目,先把三个功能的每一点要求弄清楚,其次就是有疑问:这三个功能之间是否有依赖关系,如果要实现图形界面,各个功能之间应该如何调用?

1)基本功能:

-c统计程序代码的字符数,一个可行方法是利用缓冲流来一行一行读取(readLine)文件内容,字符串有求长度的方法;

-w统计词数,词,何为一个词,汉字算,英文单词算,还有其他?参考了网上一篇博客对词的定义:汉字+不以数字开头(允许以下划线开头)的连续的词字符组成的词,具体实现则利用java的正则表达式进行匹配,其中汉字([\u4e00-\u9fa5]),其他词([a-zA-Z_][\\w]{0,});

-l统计行数,这里行数的定义是光标所移动到的最大的行所在的行号,实现起来也比较简单:readLine方法可以统计所有的行包括空格行。

2)扩展功能:

-s递归处理多个文件,只要得到用户要求的目录下的所有文件路径就好办了,所以思路就是递归得到一个目录下的所有子目录的所有文件,首先定义一个装文件路径的List容器,再写一个递归函数(List容器和指定目录路径作为参数传进)自己调用自己,有了指定目录下所有的文件路径,就可以从中挑选符合指定后缀的文件,我这里分了三种情况:*.java(用户没有指定目录只指定了文件后缀,此时目录设为当前目录);C:\java\test\*.java(用户既指定了目录又指定了文件后缀);C:\java(用户只指定了目录),采用substring和lastIndexOf这两个方法,可以分别得到文件所在的目录和文件的后缀,能够灵活处理*和?等通配符,挑选出符合条件的路径后就将其作为其他功能的参数传进,输出相应的统计数据;

-a处理更加程序代码中更加复杂的行,这里的空行,注释行,代码行,我自己定义为互斥的三种不同类型的行(加起来为总的行数),也就是即使注释行中有空行,也不当作空行了,只统计为注释行,空行按照项目要求的定义,要求中的可显示字符我理解为任意的一个能打印出来的字符。由于代码行的注释不被当作注释行,因而也无需考虑双引号里面出现// , /* , */的情况,这里仍是用正则表达式来统计。

3)高级功能:

-x图形界面我直接布局了五个按钮和一个文本输出框,在选择了文件后,文本输出框可以将代码显示出来,点击按钮就有消息窗显示对应统计信息。

4)总体的框架就是Counter类(计数器),继承了JFrame,类里面定义图形界面需要的各种组件,以及分别写-c,-w,-l,-a,-s的函数来实现统计功能,-x命令则将已经创建好的Counter实例可视化,函数与函数之间互相调用,输出各自的统计结果。

 

四、设计实现

一个Counter类,函数有countchar,countword,countline,countcomplex_line,dealwith_multifile,multi_file,一个构造方法(初始化图形界面的组件)以及事件监听函数,main函数用Scanner从命令行接收用户输入的命令,-c,-w,-l,-a,-s分别调用countchar,countword,countline,countcomplex_line,dealwith_multifile函数,-x命令使Counter的一个实例可视化,以-s开头的命令处理多个文件,这个命令的第二个参数可以是-c,-w,-l,-a,也能调用其他函数输出统计结果,multi_file是一个递归函数,dealwith_multifile调用multi_file获得文件路径,事件监听函数里面也可以根据用户点击图形界面的相应的button显示结果。

 

 

 

五、运行测试

用户输入命令的格式:命令参数(-c,-w,-l,-s,-a,-x)     文件路径

测试文件目录

1、空文件(-c,-w,-l,-a)

  

2、只有一个字符的文件(-c,-w,-l,-a)

 

 

3、只有一个词的文件(-c,-w,-l,-a)

 

4、只有一行的文件(-c,-w,-l,-a)

 

5、一个典型的文件

 

 6、处理多个文件(支持通配符)

 

 

 

 

7、图形界面

      

六、项目总结

这次写软工作业有几点不足之处,其一:java基础不扎实,分析完需求之后,差不多是边查资料边打代码,降低了开发的效率,所以这次的项目我在开发阶段用的时间最多;其二:并没有以一种锻炼个人能力的态度去做这次的项目,特别是测试方面没有做到单元测试,回归测试,效能测试等要求,这也是我后期的其他项目需要改进的地方。总体来说收获是蛮大的,从软件开发的一个比较全面的流程中学到了如何用PSP表记录开发各阶段的花费时间,以及如何细致全面的分析需求,还有如何用各种测试来保证代码的质量。

 

posted @ 2019-09-26 00:01  Alienz  阅读(2005)  评论(0编辑  收藏  举报