【软件工程】结对作业

项目 内容
作业属于哪个课程 北航软件工程
作业要求 作业要求
课程目标 锻炼合作能力,编程能力
这个作业如何帮助我实现目标 和partner合作完成作业

1. 在文章开头给出Github项目地址

项目地址

2. 预计开发时间PSP表

PSP2.1 Personal Software Process Stages 预估耗时(分钟)
Planning 计划
·Estimate ·估计这个任务需要多长时间 45
Development 开发
·Analysis ·需求分析(包括学习新技术) 240
·Design Sepc ·生成设计文档 60
·Design Review ·设计复审 30
·Coding Standard ·代码规范(为目前的开发制定合适的规范) 40
·Design ·具体设计 180
·Coding ·具体编码 720
·Coding Review ·代码复审 180
·Test ·测试 120
Reporting 报告
·Test Report ·测试报告 60
·Size Measurement ·计算工作量 30
·Postmortem & Process Improvement Plan ·事后总结,并提出过程改进计划 60
合计 1765

3. 看教科书,对接口进行设计

· wiki中对information hiding的解释为:

In computer science, information hiding is the principle of segregation of the design decisions in a computer program that are most likely to change, thus protecting other parts of the program from extensive modification if the design decision is changed

·对于Interface Design的解释为:

Interface design is to make the user's interaction as simple and efficient as possible, in terms of accomplishing user goals (user-centered design).

·对于Loose Coupling的解释为:

A loosely coupled system is one in which each of its components has, or makes use of, little or no knowledge of the definitions of other separate components. Subareas include the coupling of classes, interfaces, data, and services.

· 由此不难看出,这三个方法是不相同的,由于在之前的学习过程中,没有对接口进行过详细的设计和实现,因此这部分对我们来说比较困难。良好的接口是需要高内聚,低耦合的,这个强调了封装的原则:独立、低耦合。我们在设计过程中,将不同函数进行了封装,使用了少量的全局变量,保证了高聚合的特性。按照题目要求,主要分成两个模块,最长单词量和最多单词数量的模块。但是生成的dll由于时间关系,并没有和其他人进行交换测试。

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

设计过程如下:

· 算法大致思路:最长单词链的根本即为,有限连通图(无环)中的最长路径。得到的单词链,需要满足前一个单词的尾等于后一个单词的头,因此使用拓扑排序算法,可以得到一个序列。这个序列的特点是,越在后面序列的单词,其组成的单词链越长。在此就不赘述,代码中有所体现。因此序列最后的单词,必定是最长单词链中的最后一个单词,依次找到它的前驱即可。而最多单词链,即是在拓扑排序的基础上加上动态规划的思想,比较相邻的两条链长度,取较长的一条,和下一条继续比较。
· 独到之处:之前有使用过DFS算法实现-w和-c的功能,结果是如果测试数据较大的时候,运行时间超过300s,明显不符合要求。在进行深入学习后,采用了拓扑排序的方法,运行速度大大提高,并且准确率也有所提升。

5. UML图

· UML图如下:
由于Core的UML生成失败,这里仅展示主要算法的UML图:

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

· 性能图如下(这里贴出占用cpu最多的一部分):

· 由于需要从文件中读取单词,并且判断单词之间的分隔,大写单词转化成小写等,因此迭代层数较多,函数调用次数也多,cpu占用率更多。在优化了最长单词链的算法后,只需要进行一次拓扑排序就可以找出最长链,而-t和-h要求并不会再次执行计算函数,只是加上了限制条件,因此反而cpu占用率不高。

7. Design by Contract, Code Contract的优缺点

· 优点:由于在动手写代码前,对方法的参数、前提条件、后续状态进行设计,因此保证了代码的效率和质量
· 缺点:在之前的面向对象课中,老师有让使用过这种方法。但是需要验证设计的正确性,并且对语言格式有一定的要求,在此基础上可能会浪费时间,同时一些编程语言可能不兼容。
· 在设计接口时,对接口的前提条件进行了设计和约束,保证了函数在调用过程中的独立性。

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

· 由于在实现过程中,出现了比预期更多的问题,花费了大量时间,单元测试未良好完成。

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

异常1 同时有-w -c参数
· 即命令行输入

Wordlist -w -c absolute_path_of_word_list

· 处理方法:此时程序会中断,并且在控制台输出中报错

异常2 单词中含有非法字符

char *test[] = {"eng_neer", "sof2ware", "up2you"};
try{
int len = 3;
char ** results;
int re;
re = gen_chain_word(test, len, results, 0, 0, false);
}

· 处理方法:本来在预想上是想容错,然后将单词分隔开,但是由于传入的参数规定了长度,因此只能中断,抛出异常

10. 命令行模块实现过程

· 命令行部分的代码如下:

· 其中top代表 -t需求中的字母,hop代表-h需求中的字母,cpath为绝对路径

11. 命令行模块和计算模块的对接

· 在一开始实现代码基本功能的时候,并没有使用命令行输入,而是使用了控制台输入输出,这样的好处是,在模块设计和debug过程中,特别的直观方便。缺点却在于,在实现了所有功能后,再进行命令行模块的实现,需要改动大量的代码,在此基础上,有可能会产生一些错误,导致算法失效。最后在对接的过程中,确实出现了问题,花费了很多时间。
· 最后的对接方式,采用了函数调用来对接,如下图:

· 通过一个judge函数引导,来调用不同的计算模块解决了直接调用Core中的计算模块不兼容的问题。

12. 描述结对的过程

· 结对的过程有些坎坷,一开始由于partner的课程比较重,所以前期的最长链工作基本由我独立完成,他帮助我测试,并找出程序问题。但是在他有了空余时间后,我们交换了身份,他来对最多单词数量进行主要的把控,我来进行测试。经过角色的互换,有了不同角度去看待程序中出现的问题,因此我们发现了很多细节上的错误,并且逐渐适应了对方的风格,互相学习,共同进步。我认为总体过程是比较成功的,这也让我们学会了在团队作业中,如何互相适应,磨合在一起,取得更好的效果。

13. 结对编程和partner的优缺点

· 结对编程优点:1. 角色互换、减轻压力;2. 从不同角度看待问题更加全面;3. 学会合作、互相学习进步
· 结对编程缺点:1. 交换身份需要理解对方目前阶段的思路,花费时间;2. 如果是不熟悉的两人,磨合时间长,效率低
· partner优点: 1. 做事效率高; 2. 够肝(真佩服), 有毅力; 3. 按时完成工作
· partner缺点: 代码不够整洁。。

14. PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划
·Estimate ·估计这个任务需要多长时间 45 60
Development 开发
·Analysis ·需求分析(包括学习新技术) 240 120
·Design Sepc ·生成设计文档 60 30
·Design Review ·设计复审 30 10
·Coding Standard ·代码规范(为目前的开发制定合适的规范) 40 20
·Design ·具体设计 180 480
·Coding ·具体编码 720 720
·Coding Review ·代码复审 180 300
·Test ·测试 120 720
Reporting 报告
·Test Report ·测试报告 60 45
·Size Measurement ·计算工作量 30 10
·Postmortem & Process Improvement Plan ·事后总结,并提出过程改进计划 60 20
合计 1765 2535
posted @ 2019-03-14 21:07  aicoy  阅读(225)  评论(2编辑  收藏  举报