软件工程结对编程作业

时间:2021-10-06 23:47:25

1.本次作业GitHub地址

项目地址

2. PSP表

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

3.接口设计方法

在类的内部提供若干方法,属性为类内私有,调用者调用函数的时候输入合法的参数即可。

4. 计算模块的设计与实现过程

软件工程结对编程作业

算法说明

首先是对输入文本的处理,将输入的一个个单词当作图上的一个个点进行处理,采用邻接矩阵来储存边与边之间的距离,距离为被指向单词的长度。之后先对所有的单词进行拓扑排序,排序后可以知道这个图是不是有环的(如果有环那么排序后顶点的数量将少于图本身点的数量),从而采用两种不同的方法处理。如果图是无环的,那么就用动态规划的算法来求出最长的路径长度和路径,如果要指定首字母,那么就在选择起点的时候选择符合的首字母作为起点;如果要指定尾字母,那么就对找到的路径从头开始检查,因为是无环的图,所以当找到指定的尾字母后,至多还有其后面的单词也为同样的尾字母,这样就找到了符合要求的单词链。如果图是有环的,那么就用DFS搜索每个点作为起点的最长路径然后排序比较即可,如果指定首字母就选择符合要求的起点;如果指定尾字母就看符合要求的尾字母的链那个最长即可。

5. UML图

软件工程结对编程作业

-该图为自动生成的,和队友的差不多

6.计算模块接口部分的性能改进

我们小组开始没有对搜索进行优化,所以说有时候进行了大量的无用搜索。我们主要对这个拓扑排序进行了优化,减少了很多不必要的搜索。其次就是在处理-r参数时,我们先判断了图,如果没有环,仍然调用拓扑排序来做。这样就减少了很多时间开销。我们这个改进大概总共花费了6个小时吧

软件工程结对编程作业

软件工程结对编程作业

7. 看Design by Contract, Code Contract的内容,描述这些做法的优缺点, 说明你是如何把它们融入结对作业中的

优点:保证了双方的代码质量
缺点:并不是所有程序设计语言都有断言机制。

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

没有封装成core接口,所以测试不好做。
TEST_METHOD(TestMethod1) { string xx = "test.txt"; ProcessNoRing p = ProcessNoRing(xx); p.init(); p.getWord(xx); Assert::AreEqual(2, p.wordNum); }
后续会改进

9.计算模块部分异常处理说明

-输入文件不存在

例如输入111.txt,但是在这个目录下没有这个文件,会报错:open file failed!!!

-输入的单词数量过多

例如输入五百个以上不同的单词的文件,会报错:too many words!!!

-输入了有环的指令但图中没有环

报错:topologicalSort successed! 表示可以拓扑排序,图中无环

-输入了无环的指令但图中有环

报错:topologicalSort failed! 表示不可以拓扑排序,图中有环

-输入的首字母有除了字母之外的字符出现

报错:illegimate input as first char X(表示错误的字符)

-输入的尾字母有除了字母之外的字符出现

报错:illegimate input as last char X(表示错误的字符)

-输入的某个单词自身首尾相同

不会报错,不会自身成环

-输入单个字母的单词

不会报错,视为正常单词

10.界面模块(如果没有实现GUI,则可以描述命令行模块)的详细设计过程

这个主要就是运用状态机的知识来处理这个命令行参数。
主要函数有下面三个

void FirstState(char *argv[]);
void SecondState(char *argv[]);
void ThirdState(char *argv[]);

这个主要就是识别到-r进入第一个状态,然后识别到-h或者-t进入第二个状态,最后-w,-c进入第三个状态。
在这个过程中,我们会把一些参数转为bool型变量。

void FirstState(char *argv[]) {
    if (strcmp(argv[ArgvCnt], "-w") == 0 || strcmp(argv[ArgvCnt], "-c") == 0) {
        process = strcmp(argv[ArgvCnt], "-w") == 0 ? 0 : 1;
        ArgvCnt++;
        ThirdState(argv);
    }
    else if (strcmp(argv[ArgvCnt], "-h") == 0 || strcmp(argv[ArgvCnt], "-t") == 0) {
        ProStart = strcmp(argv[ArgvCnt], "-h") == 0;
        ProEnd = strcmp(argv[ArgvCnt], "-t") == 0;
        ArgvCnt++;
        if (strlen(argv[ArgvCnt]) == 1 && isalpha(argv[ArgvCnt][0])) {
            StartWord = argv[ArgvCnt][0];
            EndWord = argv[ArgvCnt][0];
            ArgvCnt++;
            SecondState(argv);
        }
        else {
            ErrorPrint(argv);
        }
    }
    else {
        ErrorPrint(argv);
    }
}

部分函数如上所示。

11. 界面模块(GUI或命令行模块)与计算模块的对接

int EnalbleLoop; //是否允许单词环 (0不允许,1允许)
int process;    //处理单词的方式 (0为单词数量,1为单词字母数)
int ProStart; //是否指定首字母(0不指定,1指定)
char StartWord; //首字母
int ProEnd;   //是否指定尾字母(0不指定,1指定)
char EndWord;  //尾字母
string fileName;  //文件路径

如上所示,这个界面模块和计算模块主要就是通过这几个全局变量进行对接,命令行的参数已经完全转化为我们所需的参数,直接调用即可。

12. 描述结对的过程

我们结对编程大多时候就坐在一起写,偶尔通过QQ共享屏幕来一起完成。在思考方面,主要是各自上网搜集方法,我搜了无环的情况,他搜了有环的情况。然后他写了命令行输入的部分,我写了处理输入文件的部分,之后我完成了无环的部分,他完成了有环的部分,中间也一起讨论并告诉对方实现的原理。在结对的过程中,我们的确发现了对方编程时的bug,也统一了编程的风格,并且互相了解了对方完成模块的实现过程。

软件工程结对编程作业

13. 说明结对编程的优点和缺点;结对的每一个人的优点和缺点在哪里

结对编程

结对编程的优点:可以让两个人互相监督对方,使得被监督者能*的专注,并且可以及时发现被监督者的bug
结对编程的缺点:两个人一起干一件事情,使得花费的时间变多,并且可能会闲聊。

队友

-优点1:开朗有热情
-优点2:随和有耐心
-优点3:踏实且认真
-缺点0:在时间规划上过于理想

自己

-优点1:不懂就问积极上网查找方法
-优点2:积极交流
-优点3:勇敢的发现bug
-缺点0:喜欢拖沓,实现部分功能便跑去做其他事情,不能一鼓作气

14.PSP表格回填

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