个人项目之词频统计

写在前面

这大概算是我第一次写博客。主要是对软件工程的第一次个人项目作一下总结,项目的具体要求见http://www.cnblogs.com/jiel/p/3978727.html

总的来说这次作业做的很虐心,但是能够总结点经验也算是对得起我前几天耗在这上面的时间。如果有错误,希望大家提出来,多多交流 ^-^

 

项目时间预估

开发环境的搭建    2h

项目需求分析       1h

编写代码              6h

软件测试及调试    1h

性能分析与优化    2h

(ps:  一共12h,一天就可以搞定的样子,理想是如此的丰满!!木心先生的友人评价他是”一个很好的悲观主义者“,不知道我算不算得上是一个很不好的乐观主义者?)

 

项目实际用时

开发环境的搭建     2h+2h=  4h    

项目需求分析        1h                                

编写代码               6h+6h=  12h 

软件测试及调试     1h+2h=  3h

性能分析与优化     2h+3h=  5h

(ps: 开发环境搭建我其实用了一晚上,先是把VS2010给卸了,再安装VS2012我走了点弯路,居然把安装包给下载错了,导致我安装了两次

       需求分析是英文的,感觉老师用英文写也算是用心良苦,可能有的说法英文表述会更清楚。但是我会说我是直接用的谷歌翻译吗?!下次绝对要好好读英文O_O 其实编写程序的时候看需求分析可能看得更多,零零碎碎的时间不太好统计,大概也就总共1小时吧。

  编写代码!!!其实我一开始听到这个作业就想起了OO课,本来以为可以借鉴之前Java写的程序,可是实际情况是我用的C#并且整个代码体系和之前的程序完全不像。其实程序的思路还算是比较简单的:递归找出目录下的所有符合条件的文本文件,然后把所有文本文件的内容都读入到一个字符串,对这个字符串进行解析,统计出现次数,最后对单词进行排序输出。不过我每一项都摸索了好久,~~o(>_<)o ~~  拿对字符串进行解析为例,我是先想着要用正则表达式,后来发现我不太会用,然后打算一五一十地一个个字符进行判断,发现工程量有点浩大,最后在网上查到了一个很有效的方法——利用状态机的思想。我看懂了之后真的觉得很高兴,之前学的计组知识终于发光发热了啊,然后这个就导致我后面的扩展模式写的很快。总的来说,上手很艰难,但是写到后半段就会好很多。

  软件测试及调试,这方面对各种异常也没有进行处理,只是处理了目录不存在的情况= =我果然是很懒,不知道老师说得正确性分析会不会包含异常情况,有的话我必跪无疑。至于为什么用了5h(估计不止),我觉得是我对于测试用例考虑的还很不周全。总是发现了一种错误,然后去调试,完了又是另一种错误,反正每次改正错误的效率很低。另外关于字典序和ASCALL这方面也纠结了很久。

  性能分析与优化这方面花的时间主要是前半段对优化工具的学习上。老师给的那个网址我去看了,而且看了好久,可悲的没看出什么门道来,我的英文水平啊!不过最后我也就是按了下”启动性能测试“,然后各种图、各种分析都出来了,不得不说微软出的东西很强大。)

 

性能优化

从进行性能测试,然后改代码进行优化,前后大概花了3,4个小时吧。

优化之前,我用 ”F:\文档“ 进行测试,用了大概5分钟,直接上图

然后具体一看发现是我那个字符串拼接用得太多了

 

然后就想着要怎么优化,我紧接着又犯了一次错误:改成了通过不断调用一个函数来一个文件一个文件地进行解析,没想到时间居然变成了350s,这时候才意识到函数的不断调用远比字符串拼接更费事好吗。。。然后继续改,发现ReadLine()其实可以换成ReadToEnd(),再次运行,时间变成12s了

 

优化后的~

 

 

测试用例

1目录不存在

2目录下为空

下面是一些自己构造的文本文件

3测试单词合并

  file filE  

  期待输出:filE:2

 

4测试无效单词的排除

  file 123file

  期待输出:file:1

5.测试排序输出的顺序 file aaa File aaa  bbb

  期待输出:File:2

       aaa:2

       bbb:1       

6.测试两个单词的输出

7测试3个单词的输出

8目录下包含有汉字的文本文件 乱码

9目录下一个比较大的文本文件

10目录下n多文件,包含其他后缀名

(在这里真诚地向老师提一点建议:关于”programs with incorrect result will get 0 points,  regardless of speed“,程序不正确,得分直接为0,如何定义不正确呢?检查用的10个用例里有2个测得不正确和10个都不正确,得分同样为0的话似乎有点不公平吧。)

 

关于收获

说实话写完这个作业,我觉得挺不容易的。我的coding能力比较弱,我一直都很清楚,没办法在几个小时内快速写出代码来。我在msdn库上查函数,也要比较好久才能选定用哪一个。其实说到底还是因为写得不够。事实就是如此,那些大神在代码上花的时间绝对不少。这世界上的天才哪能那么多呢。其实整个过程,特别是在前期,挺痛苦的,宿舍里就我一个需要写这个,想要交流下甚至找不到人,只能在网上各种查资料。然后对着电脑真的很无奈,我是很想出去随便走走的,只是看看天也好,最后还是在寝室里窝着写代码。。。好了,够了。下面是正式的总结,前面的助教就跳过吧~~

1.一些文件操作函数的使用。之前递归目录的时候一直是自己写函数,现在发现可以直接用GetFiles,直接可以提取文件了,很方便

2.cmd模式下运行程序,其实我是第一次体验这个,之前的命令行也是直接设置的,这次运行cmd试了下,感觉挺新奇的

3.用状态机的思想对字符串进行解析

4.C#的一些语句的用法。比如orderby可以很方便地实现排序

嗯,上面的几点其实都是关于具体的程序代码方面的收获。往大的方向说,或许也能包括独立完成一个项目,权衡项目进度,熟悉项目流程等方面能力的提升吧。

(还有,我写这个博客写了快3个小时了,,这速度)

 

最后

茨威格写断头皇后玛丽·安托瓦内特的一句话:

她那时候还太年轻,不知道所有命运赠送的礼物,早已在暗中标好了价格。

posted @ 2014-09-22 20:08  encoin  阅读(324)  评论(1编辑  收藏  举报