个人项目:WC
个人项目GitHub地址:https://github.com/shamegoddd/personal-project
1.WC项目要求
wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。
实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。
具体功能要求:
程序处理用户需求的模式为:
wc.exe [parameter] file_name
基本功能列表:
wc.exe -c file.c //返回文件 file.c 的字符数
wc.exe -w file.c //返回文件 file.c 的词的数目
wc.exe -l file.c //返回文件 file.c 的行数
扩展功能:
-s 递归处理目录下符合条件的文件。
-a 返回更复杂的数据(代码行 / 空行 / 注释行)。
空行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”。
代码行:本行包括多于一个字符的代码。
注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释:
} //注释
在这种情况下,这一行属于注释行。
高级功能:
-x 参数。这个参数单独使用。如果命令行有这个参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息。
需求举例:
wc.exe -s -a .c
返回当前目录及子目录中所有.c 文件的代码行数、空行数、注释行数。
2.PSP表格
注:PSP表格应该随着项目的进行而不断变化,不可能一开始做好就无任何变动。
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 90 | 140 |
· Estimate | · 估计这个任务需要多少时间 | 180 | 240 |
Development | 开发 | 150 | 210 |
· Analysis | · 需求分析 (包括学习新技术) | 50 | 90 |
· Design Spec | · 生成设计文档 | 60 | 80 |
· Design Review | · 设计复审 (和同事审核设计文档) | 30 | 40 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 40 | 50 |
· Design | · 具体设计 | 40 | 50 |
· Coding | · 具体编码 | 90 | 120 |
· Code Review | · 代码复审 | 20 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 45 | 50 |
Reporting | 报告 | 30 | 40 |
· Test Report | · 测试报告 | 30 | 40 |
· Size Measurement | · 计算工作量 | 30 | 45 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 30 |
合计 | 825 | 1140 |
3.解题思路描述
这个项目基本要求是写一个命令行程序,它能统计文本文件的字符数、单词数和行数。因此要对文件进行操作,第一时间就想到I/O流,用JAVA来实现该程序会更简单一些。
而就统计而言,无非就是对文件内根据用户输入的需求从而对特定的对象进行迭代累加,最终计算出结果并返回,因此该程序会涉及到对不同对象的循环统计数值的操作,每一个选项用一个函数来实现。例如:-c选项用char()函数实现、-w用word()函数实现等等。整个统计文本文件的字符数、单词数和行数都很熟悉,所以主要去了解对文件进行操作的技术和相关包调用。
设计的过程中尽量将每个功能模块化以降低代码耦合度。
同时采用分层的方式编写不同模块之间的层级调用关系,以提高代码的可维护性
4.设计实现过程
模块调用过程:
参数过滤模块:
将用户输入的参数进行判断是否合法,若合法,则将调用文件处理模块处理;否则让用户重新输入参数。
文件处理模块:
首先,该模块通过调用I/O流工具判断文件路径参数是否存在文件,若存在,则根据选项参数调用统计工具模块对应的文本统计模块;否则返回错误信息并让用户重新输入。
统计工具模块:
该模块会根据选项参数来选择调用哪个文本统计文件,并且文本统计文件直接将统计结果返回。其中包含四个函数供上层文件处理模块调用。
5.功能测试
测试代码:
public static void main(String[] args) throws IOException {
FileArgsFilter filter = new FileArgsFilter();
Scanner sc = new Scanner(System.in);
String path = null;
String option = null;
while (true){
System.out.println("please enter file path:");
path=sc.nextLine();
System.out.println("please enter option oriented to the file:");
option=sc.nextLine();
if (filter.isArgsLegal(path,option)){
filter.FileStatistic(path, option);
}
else
System.err.println("please enter again!");
}
}
各个文本文件内容:
空文件路径:E:\test\empty.txt
只有一个字符的文件路径:E:\test\onechar.txt
c
只有一个单词的文件路径:E:\test\oneword.txt
java
正常源文件路径:E:\test\test.java
/**
*
*
/*
* @author user
*
*/
public class UserDaoImpl implements IUserDao {
public User login(String username, String password) throws SQLException {//這是注釋
//获取Connection对象
Connection con =DBUtils.getConnection();
//获取预处理对象
PreparedStatement pst= con.prepareStatement("select * from user where username=? and password=?");
//解析占位符
pst.setString(1, username);
pst.setString(2, password);
//执行sql获取结果集对象
ResultSet rs =pst.executeQuery();
User user=null;
while(rs.next()){
user=new User();
user.setId(rs.getString("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setFullname(rs.getString("cus_name"));
user.setPhone(rs.getString("phone"));
user.setStatus(rs.getInt("status"));
}
con.close();
return user;
}
测试字符数功能 -c:
测试单词数功能 -w:
测试行数功能 -w:
测试复杂行功能 -a:
代码覆盖率
项目总结与经验之谈
本次项目运用Java语言实现了文本文件统计的基本功能(-c,-w,-l)以及其中一个复杂功能(-a),整个过程下来我学到的不仅仅是代码的功能实现,更重要的是基本理解整个软件开发的基本流程:
1) 计划(估计这个任务需要多少时间)
2) 开发(包括 分析需求,生成设计文档,设计复审(和同事审核设计文档),代码规范(为目前的开发定制合适的规范),具体设计,具体编码,代码复审,测试(包括自测,修改代码,提交修改))
3) 记录用时
4) 测试报告
5) 计算工作量
6) 事后总结
此外,通过该项目也学会运用不少工具,如将工程提交到GitHub的Git工具以及基于jacoco的EclEmma工具用于代码覆盖率的测试。
本次项目有许多地方需要改进,如代码覆盖率偏低,说明代码还不够分散,使用的if-else等分支语句过多不够精简,并不能完全实现所有扩展功能。以后应通过更良好的开发规划来提高开发效率,尽量在更短的时间内实现尽可能多的、质量高的功能,并且要做到代码简洁,分模块化从而提高代码质量,降低代码冗余度.