Individual Project ——张永强
第一次作业是一个Individual Project。我自己打算用C#来完成这个作业,但是以前没有用过C#,所以先打算简单地了解一下C#,然后进行开发。
初步计划:用两天时间了解一下C#的基本语法。
开始写之前:在弄清楚了这个题目的需求之后,我认为这个题目主要要做这几个方面的工作。(大括号中为我计划的时间)
1、{半个小时}要能够读取一个目录下面的所有文件以及文件夹,这一点涉及到系统的API的调用,将获得的文件名全部存储在一个ArrayList中,方便以后调用。
2、{2个小时}能够读取每个文件,并且按照规则将确定的一行字符串划分到一个字符串数组中,将所有的字符串统计放到一个Dictionary中,在Dictionary中能够看到每个词的词频。
3、{2个小时}将Dictionary中的内容能够按照一定的顺序排列输出。(这里完成了普通的要求)
4、{2个小时}再次对Dictionary中的内容进行处理,能够满足extend mode。
写好了之后:在写的过程中,发现了自己太多的问题,首先是对语言的不熟练,很多时候就是一边写程序,一边在网上搜索具体的语法知识,其次就是还没有清晰地设计出算法之前,就开始 写程序,然后写程序的过程中就一边在写,一边在想,脑袋中没有具体的思路。所以总是断断续续的。浪费了很多的时间。
每个部分大概花的时间如下:
1、{半个小时}这个部分就是函数的调用,只要找到了函数之后,很简单。
2、{2个半小时}这一段主要的问题还是在于划分上面,划分的时候最开始想要能够调用系统的split函数,结果,弄了很久,都没有弄出好的结果,最后自己重新写了一个划分的函数。
3、{4个小时}做得过程中主要一直想要对Dictionary进行排序,但是Dictionary内部的实现又是一个Hash的算法,不能够实现要求的排序的规则。后来选择了一个SortedDictionary,然后再加上一个排序,是具有相同频率的词语能够按照字典序排列。
4、{3个小时}这个部分主要的问题就是对于具有extend的特征的word的合并,感觉不太好弄。最开始想要借用SortedDictionary的特性,对划分的词组进行合并,但是考虑不周,后来发现存在问题。就采用了一个ArrayList来完成排序的工作。
Next:测试,修改BUG,完善程序中考虑不足地方。
首先说测试,测试要考虑到的情况是很多的:我想到了下面的一些情况:
1、命令行参数输入的错误
2、输入的路径是否正确
3、路径下面为空
4、目录下面含有目录(可能含有多层)
5、是否能够对各种格式的文本文件进行操作
6、目录下面含有非文本文件
7、文本文件中含有中文字符
8、多种分隔符
9、需求中要求的是否能够达到,即对字符串的处理能否满足
10、大文本文件是否能够高效处理
对于前面的几个情况,测试的样例比较小,观察看到均能够正确地处理,在进行代码分析的过程中,有些情况显示没有捕捉到数据。我觉得这一点可能主要是和数据量有关。在最后的一个测试样例中,选择了一个大数据量的样本,总大小为891KB,希望看这种情况下的执行的数据,是否能够达到要求。
下面是一张性能分析得到的截图:
从这张图中能够看到执行的效率还是不错,当时这个没有和其它同学的进行对比。
这一张图为程序的调用关系,调用层次较浅
这个图截取了其中的一些函数的使用情况。
在程序写好之后,对程序所做的优化的时间大概就只有一个小时,而且主要是针对上面提到的一个情况,最开始程序执行的时候对于数据量小的时候速度还可以,但是当数据量稍微大一些以后,就发现速度就非常慢了,经过检查,发现是其中的一步写错了,主要就是在于每次添加到ArrayList中都要进行一个排序。而正常的逻辑就应该是将所有的数据都加入到ArrayList中以后,再进行排序,这样就浪费了大量的时间。期中一些具体的数据结构也会对具体的性能情况产生影响。比如对于C#中的Dictionary和SortedDictionary的选择,SortedDictionary对放到期中的元素按照键进行排序。SortedDictionary内部实现是一棵二叉搜索树,而Dictionary内部是采用的Hash算法,通过数组实现多条链式结构。两种结构各有优点,Dictionary对于添加和查找元素的速度都是非常好的。但是由于考虑到我需要排序过程中的使用,还是选择了SortedDictionary。这样我就避免了对于Dictionary的再次排序。
感想:
很久没有怎么写过代码了,再加上写的过程中,思考还没有怎么好的时候就开始动手写代码,然后就出现了写着写着就不知道该怎么写的情况。这一次我用的c#进行的开发,但是c#也不会,就花了一点时间简单地看了一下c#的一些东西,然后就是一边写代码,一边在网上查资料。然后查到了就基本上是直接将东西搬上去用,也没有怎么考虑过到底使用的效果怎么样,在这一点上我觉得还有很多改进的空间,需要了解一下C#以后,然后来改进。
其次,就是觉得这个项目应该是对于软件工程这门课来热身的,题目不难,但是应该建立一些软件工程的东西,代码分析,优化,测试,以前写代码的时候基本上都是为了完成某个题目,而这些题目往往都是有测试的,换句话说就是,我自己来想测试样例的时间太少了,测试的能力不够,一个好的项目是必须要足够的测试的。这样才能够保证最后不出问题。(当然,不出问题往往是不可能的,只是我们要尽量减少这些问题。)
这一次的小项目,还是感觉自己差的东西实在是有点多,从具体的语言,到算法设计的思想。都还应该好好地锻炼锻炼。
posted on 2012-09-22 17:38 fightingsnail1 阅读(274) 评论(1) 编辑 收藏 举报