第4周作业:WordCount优化

第4周作业:WordCount优化

本次项目的github地址:https://github.com/decadeheart/WcPlus

一、基本任务

PSP表格

PSP2.1 PSP阶段 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 20 30
· Estimate · 估计这个任务需要多少时间 20 30
Development 开发 15 25
· Analysis · 需求分析 (包括学习新技术) 20 25
· Design Spec · 生成设计文档 30 30
· Design Review · 设计复审 (和同事审核设计文档) 10 20
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 10 20
· Design · 具体设计 30 40
· Coding · 具体编码 100 120
· Code Review · 代码复审 45 30
· Test · 测试(自我测试,修改代码,提交修改) 60 40
Reporting 报告 30 35
· Test Report · 测试报告 75 80
· Size Measurement · 计算工作量 15 15
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 10 20
合计 490 580

接口设计

接口描述

我负责的是输入模块,就是负责处理在控制台的输入部分。完成方式是构建一个独立的类WcPlus,该类有argc和argv[]两个参数,argc是参数个数,argv是参数列表,当参数小于一个时,表示没有输入正确的路径。当参数大于一个时进行正则匹配.txt文件,最终根据输入流是否可以打开,判断该路径是否为有效路径。也就是该接口得到了一个字符串数组并返回了有效的输入流,该接口的完成情况是能正常返回有效输入流,检测输入控制台的字符串是否真正是符合要求的,并在出错时返回相应出错情况。

设计思路

在本次实验中,文件路径可以选取最后一个参数,通过正则匹配来验证文件名是否符合需求,然后再通过文件流对路径进行读取,检测该文件是否存在,最后返回可以读取的文件流

实现过程

根据几个判断来区分不同的输入情况

WcPlus::WcPlus(const int &argc, char * argv[])
{
	//首先参数得要多于一个
	if (argc > 1) {
		string path(argv[argc - 1]);
		//正则匹配到.txt文件
		regex ifname("[[:alnum:]]+\\.txt$", regex::icase);
		if (!regex_search(path, ifname))
		{
			cout << "match failed";
			exit(-1);
		}
		input.open(path);
		//判断该路径能否打开文件
		if (input.is_open()){
			cout << "valid filePath";
		}
		else {
			cout << "inValid filePath";
		}
	}
	else {
		cout << "not input filePath";
	}

}

测试设计

设计的测试用例要覆盖所有的情况,同时应该有多种情况复合

小组贡献

我们小组齐心协力,集思广益,最终成功完成了任务,最终我的小组贡献分0.25

二、扩展任务

1.代码规范

选择了现代软件工程讲义 3 代码规范与代码复审为参考,代码风格规范中:断行与空白的{}行、分行、命名、下划线、大小写,代码设计规范中:函数、gogo、错误处理、断言、析构函数、new和delete、类型继承。

2.同组分析

根据上述代码规范,我分析了我们同组的张伟东同学的代码,他的部分代码如下:

void WcPlus::getWordList()
{
	input >> noskipws;
		char ch;
		string str;
		while (input >> ch)
		{
			if (isalpha(ch))
			{
				ch = tolower(ch);
				str = str + ch;
			}
			else if (!str.empty())
			{
				if ((ch == '-') && (isalpha((input.peek()))))
				{
					str = str + '-';
				}
				else
				{
					auto ret = word.insert({ str,1 });
					if (!ret.second)
						++ret.first->second;
					str = "";
				}
			}
		}
	input >> skipws;
	input.close();
}

在他的代码中。括号清楚的表示了优先级,每个{和}都独占一行,有更多个单词组成的变量采用了驼峰命名规则,根据以上特点说明该同学的代码十分符合代码规范,严谨而简洁

3.静态代码扫描

我们使用的是vs2015自带的静态扫描工具,最终的扫描结果

三、高级任务

设计、评审、优化

选择8kb,16kb,32kb大小的txt文件进行测试,程序处理时长如下:

9ms,11ms,14ms.我们发现文件大小对于输入时的性能影响较小,但是文件增大也会使时间增长,根据代码得到以下优化思路:优化正则匹配规则,从而减少匹配花费时间。

四、个人总结

通过这次任务,我们进一步的了解了单元测试,黑盒测试和白盒测试,小组成员们在一起通过共同努力完成任务,也让我们互相交流互相学习,增强了团结协作能力!

五、参考链接

posted @ 2018-04-08 19:54  DecadeXun  阅读(178)  评论(2)    收藏  举报