一、 Github地址:

https://github.com/RuiBingo/PersonalWork

二、个人PSP表格:

PSP2.1

PSP阶段

预估耗时(分钟)

实际耗时(分钟)

Planning

计划

60                  

20 

· Estimate

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

60

20

Development

开发

1200

 1080

· Analysis

· 需求分析

 120  100

· Design Spec

· 生成设计文档

 30  30

· Design Review

· 设计复审

 30  30

· Coding Standard

· 代码规范

 60  50

· Design

· 具体设计

 60  30

· Coding

· 具体编码

 900  1000

· Code Review

· 代码复审

 30  30

· Test

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

 180  150

Reporting

报告

 120  100

· Test Report

· 测试报告

 60  60

· Size Measurement

· 计算工作量

 30  20

· Postmortem & Process Improvement Plan

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

 60  50
 

合计

 3000  2770

三、解题思路

刚开始看到题目的时候就觉得这个项目其实类似于之前java课设要求做的文本编辑器,首先按部就班实现基础功能,扩展功能,最后再实现高级功能,然后将实现功能的方法都汇总到含有主程序功能的类里实现。首先基础功能即查询字符数、行数和单词数是一样的,然后对于扩展功能查询注释行数、空白行数和代码行数功能我一开始的想法就是查询代码其实类似于基础功能,但判断时可以采用正则表达式去判断,关键是那个递归调用的功能,一开始看项目的想法就是:递归其实也很简单,写一个方法调用上述功能然后设置条件语句进行判断后递归就可以。但偏偏在实践做的时候因为某些原因让我的递归功能并不如意,我花了很多的时间在想办法改善,具体原因就下面分开细讲了,高级功能就我认为最简单了,做个基本的图形界面,用java插件不用一分钟就做出来了,当基本功能和扩展功能都实现了,再把这些功能调用进去就ok了!接下来细讲下每个功能的基本实现思路:

①    首先是基本功能,-c查询字符数,-l查询行数,-w查询单词数,这三个最简单的功能在之前已经实现过了,但由于之前的代码我找不到了,于是就重新打一遍,思路就是利用文件输入流获取内容,然后循环判断每行有多少字符,总共有多少行数,单词数的统计就利用简单的正则表达式就可以了。思路简单就不细讲了,代码看一眼都能懂。

②    然后接着实现扩展功能,我首先做的是-a,即查询注释行数,空白行数和代码行数,这个也是弄个文件输入流获取内容然后利用正则表达式对注释行数和空白行数进行判断,对于注释行的判断利用“//”和“/*,*/”这三种字符样式进行查找标记,即在每一行内容的查找中发现“//”就让注释行数+1,然后利用String类里的trim()方法切割掉每一行两端的空格字符,并用startsWith()方法对查找到的“/*”进行标记,用endsWith()方法对“*/”进行标记,从找到“/*”开始到找到“*/”结束统计注释行数,再加上之前统计的就是总的注释行数了。对于空白行数的判断一开始使用了正则表达式,但发现我写的正则表达式判断总是不准确,后来上网查资料知道了利用isEmpty()这个方法加上对每一行的“{”和“}”进行标记去判断空白行数,最后是对代码行的判断,我的想法是既然不是注释行也不是空白行那就是代码行咯!于是用条件语句把前两种都判断不是的行数算成代码行++,就得到代码行数了。

③    然后是这个一开始以为简单的递归调用功能-s,一开始我并没有利用好通配符这个条件,而是在一个方法里面让用户输入想匹配的后缀名(例如,用户相匹配后缀名为“txt”的就直接输入txt就可以了),然后用foreach循环找出路径中的所有文件,利用正则表达式去匹配这些文件名,若匹配到txt就输出文件名并调用上述查询功能输出统计结果,但这个方法有个bug,就是一旦循环到的是目录的话就是要重新递归这个方法,然后又要重新问一遍用户想匹配的后缀名,用户又要重新输入一遍,就很蠢,于是我开始尝试将用户输入的后缀名这段代码移出方法,就不用每次递归都要重新询问,但尝试了好久都失败了,这就是前面说的一开始觉得递归很简单,但做的时候花了很多时间。后来跟同学交流才发现他们都是去切割通配符然后匹配的,于是我删除了我原来的方法,然后利用正则表达式去切割用户输入的含有通配符的路径,切割完剩下前面的路径和后面的后缀名两部分存入数组,然后作为参数传回递归方法中,也是用foreach找出所有文件,如果匹配的数组前半部分的路径就重新递归调用,如果是匹配后半部分的后缀名就调用功能输出统计结果。

④    最后是图形界面GUI的实现,即功能-x的实现,java做图形界面我都是用插件直接设置好绝对布局后,添加按钮button和一个文本框TextArea,然后给按钮设置一个监听器,点击他既可以选择文件,然后调用方法对选择的文件进行统计,输出在文本框中。

⑤    上述四个步骤我都是放在三个类里面,其中①和②放在类countWord,③放在类fangfa中,④就是单独一个类GUI01。然后再建一个command类放执行程序,集合其余三个类的功能,并输出命令界面,供用户选择,当用户输入路径时,利用正则表达式判断用户输入格式的对错,并利用if和switch条件语句进行功能的选择。

四、设计实现过程

类command通过判断用户输入的路径进行判断,若是含有通配符的文件则调出-s功能,若是不含通配符的文件则调出-c,-l,-w,-a,-x功能。路径错误则重新让用户输入,-x功能直接弹出图形界面框。

五、测试

①wc exe功能界面展示:

②建立测试文档:

③各个功能的测试:

-c,-l,-w,-a功能展现:

-x功能展现:

-s递归功能展现:

六、个人总结

  通过这次项目我意识到了以前学习的java知识都忘了很多,看来代码一段时间不打还是很容易生疏啊,以后还是要多打点代码,这次个人项目的设计我是边回顾以前的知识一边做,中途有很多忘记的方法也是通过找资料才想起来,在这个过程中我遇到了几个bug,有时一直找不出问题在哪比较烦躁,但其实问题很显眼,过于浮躁大大降低了我的工作效率,遇到难题还是要先休息下放空大脑,只要头脑清醒,然后把一个大的难题慢慢分成一个小难题去解决,很快你就会发现这个难题已经不算是难题了。

软工个人项目(Java实现)的更多相关文章

  1. [2017BUAA软工]个人项目

    软工个人项目 一.Github项目地址 https://github.com/Lydia-yang/2017BUAA-SoftwareEngineering 二.解题思路 在刚开始拿到题目的时候,关于 ...

  2. [2017BUAA软工]结对项目

    软工结对项目 一. Github项目地址 https://github.com/crvz6182/sudoku_partner 二. PSP表格 Psp personal software progr ...

  3. 软工团队项目之团队展示&选题(OnTime——S.L.N)

    软工团队项目之团队展示&选题(OnTime——S.L.N) 一.团队展示 队名:『S.L.N』即Seigelion——乃“攻城狮”之意. 队员学号: 团队项目描述:(项目名称:OnTime) ...

  4. 2020BUAA软工结伴项目作业

    2020BUAA软工结伴项目作业 17373010 杜博玮 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 结伴项目作业 我在这个课程的目标是 学 ...

  5. 2020BUAA软工个人项目作业

    2020BUAA软工个人项目作业 17373010 杜博玮 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人项目作业 我在这个课程的目标是 学 ...

  6. 软工个人项目———WC.exe(Java实现)

    一.github地址 https://github.com/hhw-15521301615/hello-world 二.PSP表格 PSP2.1 Personal Software Process S ...

  7. 软工作业(JAVA)

    github传送门:https://github.com/hhg52516/WC.git 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序 ...

  8. [2017BUAA软工]结对项目:数独扩展

    结对项目:数独扩展 1. Github项目地址 https://github.com/Slontia/Sudoku2 2. PSP估计表格 3. 关于Information Hiding, Inter ...

  9. 软工个人项目 ——wc.exe

    1.GitHub项目地址 https://github.com/k8kiw/WordCount 2.PSP预计时间 PSP2.1 Personal Software Process Stages 预估 ...

随机推荐

  1. Go 自定义类型来实现枚举类型限制

    今天使用iota 发现一个问题.定义别名类型的时候 调用函数报错.废话不多说,我们看一段示例(关于iota的用法这里就不介绍了,手册介绍滴比较详细): package main import &quo ...

  2. 用XHR简单封装一个axios

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 在vue项目中的js文件里使用vue实例

    参考的网址:https://blog.csdn.net/weixin_34353714/article/details/86958742 不为其他,就为了记录一下,方便以后查看: 第一种方法: 1.首 ...

  4. 微信小程序实现点击拍照长按录像功能

    微信小程序实现点击拍照长按录像功能 代码里面注释写的都很详细,直接上代码.官方的组件属性中有触摸开始和触摸结束属性.本功能依靠这些属性实现. .wxml代码: <!-- 相机 pages/cam ...

  5. Impala基于内存的SQL引擎的详细介绍

    一.简介 1.概述 Impala是Cloudera公司推出,提供对HDFS.Hbase数据的高性能.低延迟的交互式SQL查询功能. •基于Hive使用内存计算,兼顾数据仓库.具有实时.批处理.多并发等 ...

  6. appium---App页面滑动

    我们操作app的过程中都会进行页面滑动,那么这个过程通过python怎么实现呢? 如何滑动 大家都非常的清楚我们手动在app上是如何滑动的,然后自动化只是模仿了手工的方法去实现,我们通过一个图来分析 ...

  7. 3天学会kettle -全网最全的kettle教程

    从资源库开始,详细讲解了kettle的所有控件的用法,无论你是开发人员.运维人员还是测试人员. 通过此教程都可以很快速的掌握kettle,再加上笔者的实例,3天学会kettle的实战操作. 欢迎关注公 ...

  8. Leetcode 153. 寻找旋转排序数组中的最小值

    假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 请找出其中最小的元素. 你可以假设数组中不存在重 ...

  9. npm简单实用

    npm包管理工具 npm可以理解为前端的maven,一个包的管理工具 1. 查看npm和node版本 node -v npm -v 2. 初始化项目 npm init 默认配置初始化项目 npm in ...

  10. Paper | Highway Networks

    目录 1. 网络结构 2. 分析 解决的问题:在当时,人们认为 提高深度 是 提高精度 的法宝.但是网络训练也变得很困难.本文旨在解决深度网络训练难的问题,本质是解决梯度问题. 提出的网络:本文提出的 ...