个人项目(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)


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

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

5、一个典型的文件

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




7、图形界面



六、项目总结
这次写软工作业有几点不足之处,其一:java基础不扎实,分析完需求之后,差不多是边查资料边打代码,降低了开发的效率,所以这次的项目我在开发阶段用的时间最多;其二:并没有以一种锻炼个人能力的态度去做这次的项目,特别是测试方面没有做到单元测试,回归测试,效能测试等要求,这也是我后期的其他项目需要改进的地方。总体来说收获是蛮大的,从软件开发的一个比较全面的流程中学到了如何用PSP表记录开发各阶段的花费时间,以及如何细致全面的分析需求,还有如何用各种测试来保证代码的质量。
个人项目(java实现)的更多相关文章
- maven项目Java resources 上面有个红叉但是代码里面并没有什么报错
maven项目Java resources 上面有个红叉但是代码里面并没有什么报错 解决办法: 1.通过: windows菜单 -> show view/other 菜单 -> o ...
- 在IDEA中关于项目java版本问题
在IDEA中关于项目java版本问题 当出现错误如:java无效的源发行版11或IDEA Error:java:Compliation failed:internal java complier er ...
- Eclipse导入项目java文件中文乱码
感谢大佬:https://blog.csdn.net/ordinaryprogrammerc/article/details/83013710 本文链接:https://blog.csdn.net/o ...
- 异常处理_Maven之web项目java.lang.LinkageError
浏览器运行项目异常如下: HTTP Status 500 - type Exception report message description The server encountered an i ...
- ssh项目java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoade错误
错误: 导入别人的ssh项目后出现java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoade错误, 错 ...
- Maven项目java.lang.NoClassDefFoundError: Lorg/apache/log4j/Logger报错
本文转载自:http://www.javaweb1024.com/info/894.jspx maven管理的项目,里面已经引入了log4j的包 maven引入如下: <dependency&g ...
- maven项目 Java compiler level does not match the version of the installed Java project facet
因工作的关系,Eclipse开发的Java项目拷来拷去,有时候会报一个很奇怪的错误.明明源码一模一样,为什么项目复制到另一台机器上,就会报“java compiler level does not m ...
- eclipse中的项目Java build path (Java创建路径)详解
1.Source标签页,指定本工程的源码目录和输出目录.Projects标签页,指定本工程所依赖的其他工程.Libraries标签页,指定本工程所需的jar包和class目录等.Order And E ...
- MyEclipse导入ant项目——Java编程思想
北门煎饼东门串儿: <JAVA编程思想(Think in Java)>一书中提供了大量源代码,可是项目是用ant构建的.对于用惯了eclipse,netbeans等IDE的同学们可能有些手 ...
- vscode + gradle 创建 java 项目 - java language server无法启动
1.在系统上安装一个版本的gradle,用`gradle init --type java-application`创建一个默认的java项目,假设项目目录是hellojava 2.vscode写ja ...
随机推荐
- KMS服务器激活
https://blog.csdn.net/weixin_42588262/article/details/81120403 http://kms.cangshui.net/ https://kms. ...
- javascript – Node.js请求CERT_HAS_EXPIRED
javascript – Node.js请求CERT_HAS_EXPIRED 转 http://www.voidcn.com/article/p-ssctwovd-bsy.html 原文 htt ...
- 解决bootstrap-table表头filter-control select控件被遮挡显示不全的问题
[本文出自天外归云的博客园] 在使用bootstrap-table的extension——filter-control时(对应表格的data-filter-control="true&quo ...
- git 本地删除修改文件后从远程拉取
单个文件 git checkout a.php 当前目录 git checkout .
- 5中I/O模型
输入操作包括两个阶段1.等待网络数据到达,被复制到内核中的缓冲区2.从内核缓冲区复制到进程缓冲区5种I/O模型1.阻塞式I/O:包含数据被复制到内核缓冲区和应用进程缓冲区两个过程,调用recvfrom ...
- OSI七层与TCP/IP四层(小结)
OSI 七层模型 我们一般使用的网络数据传输由下而上共有七层,分别为物理层.数据链路层.网络层.传输层.会话层.表示层.应用层,也被依次称为 OSI 第一层.第二层.⋯⋯. 第七层. 各层功能简介 1 ...
- 二级C语言模拟试题(第1套)
1. 选择题. 1-1,判断各种变量所占的字节数. #include<stdio.h> int main() { char p[] = {'6','2','3'}, *q = p; int ...
- 安卓学习日记第二天——Fragment
一.基本概念 Fragment是依赖于Activity的,不能独立存在的. 一个Activity里可以有多个Fragment. 一个Fragment可以被多个Activity重用. Fragment有 ...
- c++11多线程记录4:死锁
简单示例 举个例子,桌上有一支笔和一张纸,小A和小B都要拿到纸笔写字 小A拿了笔,小B拿了纸,这时就形成了死锁(两人都不愿意让出纸笔). 其实只要稍加控制就可以避免这种情况:规定必须先拿到纸再能去尝试 ...
- zbar android sdk源码编译
zbar,解析条码和二维码的又一利器,zbar代码是用c语言编写的,如果想在Android下使用zbar类库,就需要使用NDK将zbar编译成.so加载使用,zbar编译好的Android SDK可以 ...