结对作业

结对作业

开发耗时

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

接口设计

在设计之初,考虑到为降低代码单元的耦合度,我们将需求简单拆分为3个类,分别是输入,输出,和单词处理。使各个代码单元之间的耦合度尽量最低,不需要与其他代码纠缠不清。将类封装,数据以接口的形式传入。

计算模块接口的设计和实现过程

  • 在最初分析需求时,我们将代码分成4个类,分别是负责输入数据的input,输出需要数据的output,对需求处理的wordHandler,和统合的main。
    input类含函数:FIleInput(); 用于提取文件中的单词信息。
    output类含函数:_output(); 用于输出要求的计算结果数据。
    wordHandler类含函数:get_chain_word(); 用于寻找最多单词数的最长链。
    get_chain_char(); 用于寻找最多字母数的最长链。
    这三个类每个类都是很独立的代码单元,三者间并没有什么关系,使得程序的耦合度很低。

  • 算法的关键是:蛮力求解。

  • UML图

  • 计算模块接口部分的性能改进
    因为查找的最长链为无序数组,所以在进行查找比较时并无优化可说,查找的时间复杂度仍未O(n)。

Design by Contract, Code Contract对结对作业的影响

这促使我们组在结对工作时按时按点准时开始工作,每次工作都尽量不拖延按时完成计划好的工作进度。

计算模块部分单元测试展示

  • 测试代码
TEST_METHOD(TestMethod1)
		{
			FileInput fin;
			fin.readFile("D:\\word_chain\\01.txt");
			wordHandler wh(fin);
			char *words[20];
			vector<string> result;
			wh.gen_chain_word(words, 0, result, 0, 0, false);
			Assert::IsTrue(result.at(0) == "apple");
			Assert::IsTrue(result.at(1) == "elephant");
			Assert::IsTrue(result.at(2) == "toad");
		}

		TEST_METHOD(TestMethod2) {
			FileInput fin;
			fin.readFile("D:\\word_chain\\02.txt");
			wordHandler wh(fin);
			char *words[20];
			vector<string> result;
			wh.gen_chain_char(words, 0, result, 0, 0, false);
			Assert::IsTrue(result.at(0) == "pseudonym");
			Assert::IsTrue(result.at(1) == "moon");
		}
  • 测试数据
    在测试数据上,我们除了边界数据和错误数据外,还测试了以同一单词重复出现的情况

  • 测试覆盖率截图

计算模块部分异常说明

  • FINException:检测用户输入文件不合法时,抛出异常,main中捕获直接退出。

命令行设计过程

按指导书中的命令行参数,设计了解释程序。如出现'-r',则将对应的bool型变量置为true,'-h'则按顺序读入下一个命令行参数,将其复制给char型变量,'-t'同上。'-w'先按顺序读入下一命令行参数作为文件路径,调用gen_chain_word()接口;'-c'同上,不同在于调用gen_chain_char()接口。读到文件路径后完成对命令行的解析。

while (true)
	{
		con = false;
		switch (ptr[1])
		{
		case 'r':
			recur = true;
			con = true;
			break;
		case 'h':
			ptr++;
			head = *ptr;
			con = true;
			break;
		case 't':
			ptr++;
			tail = *ptr;
			con = true;
			break;
		case 'w':
			fun = 'w';
			break;
		case 'c':
			fun = 'c';
			break;
		default:
			break;
		}
		if (con)
		{
			i++;
			ptr = argv[i];
			continue;
		}
		else
		{
			break;
		}
	}
	try
	{
		fin.readFile(argv[i + 1]);
	}
	catch (FINException& fine)
	{
		fine.what();
		return 0;
	}
	if (fun == 'w')
	{
		wordHandler whword(fin);
		whword.gen_chain_word(_words, _len, result, head, tail, recur);
	}
	else if (fun == 'c')
	{
		wordHandler whchar(fin);
		whchar.gen_chain_char(_words, _len, result, head, tail, recur);
	}
	else
	{
		cout << "Invalid command!" << endl;
	}

结对体验

两个人结对编程有助于提升代码质量,随时复审,能尽早发现和解决一些问题,两个人可以拓宽思路,避免一个人陷入死胡同。

对结对作业的优缺点

  • 优点

    • 能随时复审,能够及时发现逻辑错误
    • 能在发现问题是互相交流拓宽思路
    • 双方适时的交换角色能改变角度审视自己的逻辑和代码细节
  • 缺点

    • 在发现bug交流时容易打断个人的思路
posted @ 2019-03-14 22:42  sakura030  阅读(159)  评论(0编辑  收藏  举报