结对作业
结对作业
开发耗时
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交流时容易打断个人的思路