软件工程结对项目总结

项目 内容
课程 软件工程(罗杰)
作业要求 结对编程作业
本次作业要完成的目标 熟悉结对编程,以结对编程的形式完成题目

1.项目地址

GitHub地址

2.开发前PSP表

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

3.接口设计

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. The protection involves providing a stable interface which protects the remainder of the program from the implementation (the details that are most likely to change).
    -wiki

这里讲述了设置接口的重要意义就是保护程序在其他地方被修改的时候被连带着修改。

Interface Design

  • User interface design requires a good understanding of user needs.
    -wiki

参照作业要求,接口如下定义

static int gen_chain_word(char* words[], int len, char* result[], char head, char tail, bool enable_loop);

static int gen_chain_char(char* words[], int len, char* result[], char head, char tail, bool enable_loop);

在阅读资料的过程中也知道了好的接口需要满足很多原则:单一职责原则、里氏替换原则等,本次作业有明确的接口要求,这方面无需过多考虑。

Loose Coupling

松散耦合,松耦合让模块之间的依赖更小,独立性更高,这样即使需要修改不受影响,而且功能相同模块还能替换使用。

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

本次项目中计算模块用了面向对象类的方式进行封装。计算模块涉及到两个类,结点类Node和计算和接口在Core类中。通过Core的接口,传入接口规定的各类参数,构造单词相应结点对象,将结点对象存起来,对其进行拓补排序和动态规划计算。下面是几个函数的关系。

算法的关键在于怎么采用怎样的数据结构来存储数据。本次项目我们用了26个vector来存储构造的结点对象,每个vector中的结点对象都是相同字母开头的,并分别用一个二维数组和一位数组来存储结点间的边关系和相应字母开头的结点的入度。根据拓补排序再对26个vector进行排序,并用排好的序列进行动态规划求出最长链。对于有-r的情况,我们决定用枚举的方式强行找出,但是还没来得及实现。

独到之处就在于用的数据结构不同,这种存储方法可以节省内存,不用为每个结点建一个相连的结点vector,并且使用二维数组表示两类结点的边关系更能容易判断出有没有环。

5.UML图

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

之前用的是每个结点有一个vector来存储与其相连的结点的形式来实现接口,这样拓补排序的实现会相对较慢,采用上面第4点的结构进行接口实现的优化之后,性能得到了改进,下面是改进之后的效能分析图:


7.Design by Contract, Code Contract的优缺点和对作业的结合

这两个Contract就是一系列的约定,类似之前OO课一直强调的前置条件,后置条件等,如果能做到的话各模块之间的功能将非常清晰且任务明确。缺点是有些功能并不容易区分开,而且会在在各个方法中增加复杂度。

在结对作业中,由于有规定的接口所以一定程度上遵循了约定,但是并未一直严格执行。

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

计算模块的单元测试覆盖率达到了93%,如下图所示:

单元测试测试了正常情况(前两个)和异常情况(后一个)。第一个测试的是get_chain_word的情况,第二个测试的是get_chain_char的情况,异常情况测试了不存在-r参数时输入有环的异常情况。如下

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

  • 没有-r参数时有环的异常情况;设计目标是发现输入中没有-r参数进行“输入文件中存在环”的提示并退出程序。

  • 对于输入文件不存在的异常情况;设计目标是给出提示“Error opening file",并结束程序。

  • 对于输入中诸如同时出现-w -c的异常情况,设计目标是给出提示“para error",并结束程序。

10.命令行模块设计

我们只实现了命令行模块。

本次项目专门设计了一个Input类来实现命令行输入地处理,其中类中的属性有is_w、is_c、is_r、filePath等,都是私有属性,必须通过相应的成员函数访问。主要用类中的spilt方法来分割各个参数。

spilt方法根据传入的命令行参数,辨识出具体是那个参数,并且出现一次后进行标记,相同参数再出现则报错,-w -c亦是如此。提取出相应参数后给相应属性赋值。

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

我们将计算模块暴露出来两个接口,命令行在处理完并构造出单词表之后可以使用这两个接口和计算模块进行连接。

static int gen_chain_word(char* words[], int len, char* result[], char head, char tail, bool enable_loop);  // 计算最多单词数量
static int gen_chain_char(char* words[], int len, char* result[], char head, char tail, bool enable_loop);  // 计算最多字母数量

12.结对过程

驾驶员和领航员,一个在写代码,一个在旁边看,一段时间后换人。

13.说明结对的优缺点,并举队友和自身优缺点

  • 优点:代码一直复审,有两个人思考,能及时发现问题,互相有交流,能够学到新思路。有旁人监督也会更加专心。

  • 缺点:正如我上一篇博客所担心,两个人水平都不高的情况下效率十分低下,两个人思路都陷入僵局的时候不但进度推进慢,而且还有些尴尬。

成员 优点 缺点
张峻槐(我) 1.细节考虑更多 2.积极交流 3.擅长找到问题 对复杂点的问题不知从何着手
曾林思(队友) 1.解题思路清晰 2.执行力强 3.改进算法,完成核心工作 不够细心

14.实际花费时间PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 20 10
-Estimate -估计这个任务需要多少时间 20 10
Development 开发 1890 2430
-Analysis -需求分析(包括学习新技术) 240 360
-Design Spec -生成设计文档 30 60
-Design Review -设计复审(和同事审核设计文档) 30 10
-Coding Standard -代码规范(为目前的开发制定合适的规范) 30 20
-Design -具体设计 300 480
-Coding -具体编码 600 900
-Code Review -代码复审 360 240
-Test -测试(自我测试,修改代码,提交修改) 300 360
Reporting 报告 100 130
-Test Report -测试报告 60 60
-Size Measurement -计算工作量 10 10
-Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 30 60
合计 2010 2570
posted @ 2019-03-14 23:29  木鬼  阅读(298)  评论(1编辑  收藏  举报