本项目GitHub地址:https://github.com/sherlockHSY/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 这个参数单独使用。用户可图形化选取界面,选取文件展示文件信息。
二、PSP表格
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 40 | 30 |
· Estimate | · 估计这个任务需要多少时间 | 30 | 25 |
Development | 开发 | 790 | 710 |
· Analysis | · 需求分析 | 20 | 20 |
· Design Spec | · 生成设计文档 | 40 | 30 |
· Design Review | · 设计复审 | 30 | 30 |
· Coding Standard | · 代码规范 | 30 | 40 |
· Design | · 具体设计 | 80 | 100 |
· Coding | · 具体编码(查找文档) | 470 | 370 |
· Code Review | · 代码复审 | 60 | 50 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 80 |
Reporting | 报告 | 120 | 120 |
· Test Report | · 测试报告 | 60 | 80 |
· Size Measurement | · 计算工作量 | 30 | 50 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 30 |
合计 | 950 | 960 |
三、解题思路
拿到这个题目后,首先理解项目需求,大致是统计文件中的数据,需要统计包括字符数、行数、单词数、代码行、注释行、空行等结果。会涉及到文件的读写操作。经考虑后,决定用Node.js实现。图形界面直接使用web页面。
1. 开发准备
实现语言:Node.js
IDE:VSCode
2.需求分析:
(1)基础功能:首先是命令行指令与参数的获取。利用yargs模块读取命令的输入,判断指令类型,以及对指令和参数进行验证,确保输入是否合法。然后执行相应的逻辑处理。使用原生fs模块创建文件IO流,利用readline模块逐行读取文件内容,再结合正则表达式实现对文件字符数、行数、单词数的统计
(2)进阶功能:实质上是在基础功能上的一些拓展,写个递归函数增加对文件夹的递归处理,以及正则匹配出通配符(* ?),在对文件搜索时加以判断。-a 命令中的复杂查找,结合正则匹配即可实现统计。
(3)高级功能:图形化界面的实现。由于Node.js语言本身作为一门新起的后端语言,本身就服务于web端,所以图形界面直接用web实现,只要命令行输入命令,调用Node的子进程实现自动打开浏览器窗口运行。web页面采用html,css,js实现。
四、设计实现
流程图
1. index.js作为程序主入口,获取命令行输入的指令和参数后,校验指令输入是否合法,做出相应处理,相当于Controll层。
2. handleCommand.js将对各个指令的逻辑处理过程高度封装对应函数,并通过export暴露出模块,相当于Service层,对数据的深层处理。供Controll层调用
3. webView.js实现对web层的处理。通过开启http server监听页面请求,并主动触发自动打开web页面,渲染index.html(相当于View层)。
五、测试
单元测试
1.测试基础指令
测试文件 1.c
测试结果:
2.测试进阶指令 测试递归读取文件夹下的文件,并统计复杂数据
测试文件夹 testDir
测试结果:
3.测试高级指令
4. 通配符测试
测试通配符 * :
测试通配符 ? :
六、总结
本项目采用Node.js+web是我的一次尝试,使用web的初衷是想要与传统的GUI不一样。这个项目的开发,我第一次一个人实现一个完整的流程,从需求分析、设计、开发到测试,学习到了软件工程的很多思想和知识,把项目的本身功能点实现是一方面,项目的测试也是非常重要的一部分。在实际开发中,模块的构建和整体框架的搭建也十分重要。我也认识到只有把各个方面都尽可能的做好,才能使程序具有更好的健壮性。