软件工程结对编程作业

1.本次作业GitHub地址

项目地址

2. PSP表

PSP2.1Personal 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. 计算模块的设计与实现过程

1346515-20190314234943615-736894706.png

算法说明

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

5. UML图

1346515-20190314222650286-16982705.png

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

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

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

1346515-20190314233548292-2138089004.png

1346515-20190314233556452-244546902.png

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,也统一了编程的风格,并且互相了解了对方完成模块的实现过程。

1346515-20190314221315592-224440537.jpg

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

结对编程

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

队友

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

自己

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

14.PSP表格回填

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

转载于:https://www.cnblogs.com/wzybuaa/p/10534434.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值