本软件的代码:https://github.com/amekao/SE_work1
界面:
一、需求分析阶段:
需求分析:
总需求:需要用户在cmd运行程序,根据所输入的参数提供对应的计算模式
基本功能: -c -w -l 显示字符数,词数,行数
拓展功能:-a 显示具体行数, -s 可以递归遍历指定目录下的文件
高级功能: -x 弹出界面让用户选择要统计的文本,显示所有的信息
二、设计阶段:
考虑到python语言对文本操作提供了较好的接口,而且文件编码也比较丰富,因此决定使用python来完成这次项目,但是要另外付出学习python的时间成本
对任务进行时间划分:
子任务 | 预期时间(h) | 实际时间(h) |
初期学习python | 6h | 7h |
程序框架搭建 | 2h | 1.5h |
实现-c | 1h | 0.2h |
实现-w | 1h | 1.5h |
实现-l | 1h | 0.2h |
实现-a | 1.5h | 0.5h |
实现-s | 2h | 2h |
支持通配符 | 1.5h | 2h |
实现-x | 1h | 1h |
联结各模块 | 1h | 2h |
后续新功能设计 | 2h | 4h |
总用时 | 20h | 21.9h |
各种功能的设计思路:
1. cmd获取参数的功能:使用OS模块定义的argv函数以列表的形式获得用户在缓冲区输入的数据,使用标志位记录用户输入了什么参数,从而实现参数复合使用的要求
2. -c和-l功能:len对应列表的条目数
3. -w功能:通配符分割各单词存入列表,len列表
4. -a功能:逐行判断是什么类型的行
5. 递归遍历目录的功能:使用os库提供的接口列出当前目录下的文件和文件夹,如果是文件夹则继续递归进行遍历,文件则判断是否为对应文件类型,若是,则存到一个表里
6. 使用通配符的功能:使用fnmatch的接口
7. -x弹出文件选择对话框:使用win32ui提供的接口,获取用户选择的文件的路径
三、软件开发阶段:
在真正输入代码时,才会发现各种各样新的问题,发现新的设计会更好,最终程序调用关系如下图
后续新增的更多功能:
1. 增加-b显示详细字数:在测试len(open_file.read())时发现显示的字符数一直不对,后来才发现是把换行符也算了进去,不过这不符合正常人的习惯,而且做一个字符判断的模块也不难,所以可以把换行符个数也显示出来,让用户自己决定要不要把换行符加入字符数中
2. 一开始程序是限制argv长度的,即同一时间只支持用一个参数和一个文件路径,但是交给同学帮忙测试时他吐槽参数的地方限制太多。后来重新分析程序发现-c -w -l -a -b模块其实都互不影响的,所以就更改成argv中出现这个字段就把对应的标志位设置为True的方法,这样五个普通参数就都可以同时使用,一次就可以把五种功能都测试出来,大大加快了测试效率。
3. 在设计-s模式时发现fnmatch库(用以通配符匹配)的功能强大,因此在非-s模式也加入了这个功能,即使用户想输入“自制数组.c”但不小心输入了“数组.c”也能寻找到
输入:
输出:
4. python的read函数除了.c文件以外,也可以打开其他一些文本文件格式,比如.py和.java等,所以本软件也支持这类文件的统计
设计心得:
1. 本次实验是自己第一次用python写程序,c语言很多功能要自己写,而且对文本编码支持不好,而java中类的概念本人也不是很熟悉,总对类里面定义的函数感到迷惘,所以使用python编程,花了一两天来看python相关教程就上手了,不得不感叹python真是好用啊。
2. 本次设计最难实现的模块是递归遍历目录的函数,据说可以使用os.walk函数来遍历,不过网上关于os.walk函数的说明实在晦涩难懂,什么返回三元列表的实在超出我的常识范围,而且知道是树形结构,自己写一个遍历也不是很难,不过也花了不少时间才测试成功
3. 另外一个难题就是将代码组装起来,一开始识别argv的main函数很弱智,就是[0]号元素是wc.exe,[1]号元素则是各种参数,[2]号元素是文件路径,不过这样就实现不了wc.exe -s -a file.c的功能了,而且测试模块又要一个一个改参数输命令很烦,于是花了一点时间让其支持多参数
4. 写代码永远都是越写发现越想修改得更好一点,毕竟也是自己的亲生儿子,发现辛辛苦苦写的遍历函数稍作修改后可以复用而且会让体验更好,又花了一点时间将“文件”分为“文件路径”和“文件名字”,这样就可以让通配符更灵活,支持相对路径和绝对路径,而且文件类型也可以修改,一箭三雕
四、测试阶段:
测试均是手工完成,大多数都是边写程序边测试,所幸本程序中使用到分支语句的地方不多,就在判断argv参数时需要用到,且大多数参数都是并列关系,所以并没有使用多层if else语句嵌套,而且支持多参数输入,所以一条指令就可以测试到大多数分支
后来也学习到了pytest的使用方法,写出了测试各个count模块的代码:
1 def test_wc(): 2 test_path = "自制数组.c" 3 op = open(test_path, "r", encoding=‘UTF-8‘) 4 assert char_count(op) == 551 5 assert complex_char_count(op) == (9, 327, 49, 45, 25, 96) 6 assert line_count(op) == 46 7 assert complex_line_count(op) == (4, 10, 32) 8 assert word_count(op) == 61
目前已知的bug:
1. 权限问题:遇到不可访问的文件(如系统文件)时可能会出错
2. 编码格式问题:本软件应该支持UTF-8和GBK的编码,不过极少数情况下无法打开,会出现UnicodeEncodeError
3. 个人能力有限,C语言/**/方式的注释花样繁多,把所有情况都统计出来一定会让代码中充斥许多if else语句,让代码十分杂乱,所以/*类注释行无法统计
4. 截取单词是用通配符匹配一串英文字母的方式,无法判断出该字母串有否实际意义,比如说“adsadasds”这样的字母串就会判定为词语
原文地址:https://www.cnblogs.com/amekao/p/11582212.html