结对编程之效能分析
作业要求:现代软件工程 作业 文本文件中英语单词的频率
项目git地址:ASE-Pair-Programing-Project
第一次用博客园,而此篇文章是在csdn上写的,没有写出博客园的风格,所以排版别扭的可以查看 作业三,结对编程之效能分析
作业简介
- step0-输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后面两位
- step1:输出单个文件中的前 N 个最常出现的英语单词。
- step2: 支持 stop words
- step3: 我们想看看常用的短语是什么, 怎么办呢?
- step4: 把动词形态都统一之后再计数。
- step5: 统计动介短语出现的频率
- 效能分析
guideline
我们收到assigment后,便约了时间,一起讨论了这次的guideline,一直按照这个guideline进行
如何合作
此次结对编程,我们前期独立实现每步的功能,每天晚上19:00-22:30进行讨论,一是确保自己程序的正确性;二是交换各自的idea; 三讨论接下来的工作,与自己的感受。 后期我们整合了一个程序,三个人对其进行测试与效能分析,测试的结果写到腾讯的共享文件
里,bug解决后 可以在后面标注已解决
,不用删。
编程语言
由于我们三人中,2个人擅长python
,2个人了解c/c++
,加之人生苦多,我用python
,同时为了更快的开发。So我们的开发环境:
- 系统:
win10
- 语言:
python
- IDE:
pycharm2017
代码风格
我们的代码命名使用驼峰命名法
-
普通变量名:一个或多个单字连结在一起,首字母以小写开头,每个单词首字母大写(第一个单词除外)。
例如: (注释是为了更好地说明命名规则,实际注释风格并非如此)wordsCountsDict #存放词频的字典,key为单词,value为频率
-
全局变量:一个或多个单字连结在一起,开头为为g_,每个单词首字母大写(第一个字母除外)。
例如:g_wordsCountsDict #存放词频的字典的全局变量
-
函数名/类名: 一个或多个单字连结在一起,每个单词首字母大写
例如:def CountLetters(): #用来统计字母的频率的函数 class WordCount(object):
-
注释风格
- 函数的说明
写明函数名称,功能输入,输出,作者,日期。
################################################################################### #Name:StopWordProcessing() #function:Remove the words from the "stopwords.txt" #input: dict2List : A list transformed by a dict whose keys are words and values are frequencies # ouput: listProcs : A list after removing stopwords #Author: Enoch #Date:2018.10.22 ###################################################################################
- 某行注释
注释在某行行末
wordsCounts = StopWordProcessing(wordsCounts) # Remove the words from the "stopwords.txt"
- 函数的说明
单元测试、代码覆盖率与回归测试
对于单元测试、代码覆盖率与回归测试这些概念,可以参考邹老师的博客,在此简要说一下。
现代软件工程讲义 2 开发技术 - 单元测试 & 回归测试
单元测试:写完某个模块后,假想一下各种情况,测试文件的正确性。
代码覆盖率:这其实在单元测试的时候已经做了,代码覆盖率都不是100%,那么此程序肯定不是只为此公共功能服务。
回归测试:便是高版本兼容低版本,不是之前实现了统计字母的频率,在实现了可以统计单词频率后,统计字母就出bug。
我们这三部分并不独立,我们把所有的测试合并成一个文件。如下所示
from CountLetters import CountLetters
from CountPhrase import CountPhrases
from CountPrephrase import CountVerbPre
from CountWords import CountWords
from CountDir import OperateInDir
if(__name__=='__main__'):
#test letters #测试统计字母的频率
CountLetters('test.txt',10,None,None) #测试统计字母有没有正常工作,test文件是个20个字的短文。
CountLetters('gone_with_the_wind.txt',-10, None, None) #测试输出前-10时,程序能正确处理
CountLetters('gone_with_the_wind.txt',10,'stopwords.txt','verbs.txt') #测试程序是否正确处理stopword和verb.txt
CountLetters('empty.txt', 10, None, None) #测试程序是否正确处理空文件
CountLetters('blanks.txt', 10, None, None) # blank.txt里面全是字符
#test words #测试统计单词的频率
CountWords('test.txt', 10, None, None)
CountWords('gone_with_the_wind.txt',10,'stopwords.txt',None)
CountWords('gone_with_the_wind.txt',10,None,'verbs.txt')
CountWords('gone_with_the_wind.txt', 10, 'stopwords.txt','verbs.txt')
CountWords('empty.txt', 10, 'stopwords.txt','verbs.txt')
#test phrase #测试统计短语的频率
CountPhrases('test.txt', 10, None, None, 2)
CountPhrases('gone_with_the_wind.txt',10,None,'verbs.txt',2)
CountPhrases('gone_with_the_wind.txt', 10, 'stopphrase.txt', 'verbs.txt', 2)
CountPhrases('blanks.txt', 10, 'stopphrase.txt', 'verbs.txt', 2)
# test dir # 测试遍历目录与子目录
OperateInDir(CountWords, 'examples', 10, 'stopwords.txt', 'verbs.txt', True)
OperateInDir(CountPhrases, 'examples', 10, 'stopwords.txt', 'verbs.txt', None, 2)
# test verbpre #测试统计动介短语的频率
CountVerbPre('empty.txt', 10, None, 'verbs.txt', 'prepositions.txt')
CountVerbPre('empty.txt', 10,'stopverbpre.txt', 'verbs.txt', 'prepositions.txt')
CountVerbPre('test.txt', 10, None, 'verbs.txt','prepositions.txt')
CountVerbPre('gone_with_the_wind.txt', 10, 'stopverbpre.txt', 'verbs.txt', 'prepositions.txt')
如何搭建环境可以参考博客 性能分析与代码覆盖率测试 里面的例子也是引用本次作业的例子,应该通俗易懂吧,哈哈。
little bug
在单元测试的时候发现了一些little bug,放到共享文件里,之后进行了改正
腾讯共享文件之little bug
coverage的html的测试报告。
效能分析与提升
效能的定义可以点击 现代软件工程讲义 2 开发技术--效能分析了解,
针对此次任务我们的效能分析为 :本次作业的效能分析
My teammates
杨涛:极强的领悟能力与快速学习能力,热爱科研,对待各项任务都投入极大的热情,看待问题独到而全面,善于运用各种strange tips。就喜欢坑我,刚约了网课就拉我去讨论。
张贺: 超强的逻辑思维与敏锐的洞察力,善于总结与能把握进度,相见恨晚。
总结
此次编程,体会了人生苦短,我用python的感慨;首次对程序进行了单元测试,代码覆盖率与回归测试。用效能分析提升了程序的性能。这次的获益匪浅真不违心。