【做业】结对编程纪实

结对编程纪实

一、Github地址

HansBug/pair_program_word_chaingit

二、PSP表格(独立)

PSP2.1 Personal Software Process Stages 预估耗时(小时) 实际耗时(小时)
Planning 计划 0.5 0.4
· Estimate · 估计这个任务须要多少时间 0.1 0.2
Development 开发 20 22.7
· Analysis · 需求分析 (包括学习新技术) 6 5
· Design Spec · 生成设计文档 0.5 0.1
· Design Review · 设计复审 (和同事审核设计文档) 0.5 0.1
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 0.5 0.4
· Design · 具体设计 0.5 0.3
· Coding · 具体编码 10 13
· Code Review · 代码复审 1 0.8
· Test · 测试(自我测试,修改代码,提交修改) 1 3
Reporting 报告 1 0.4
· Test Report · 测试报告 0.3 0.1
· Size Measurement · 计算工做量 0.2 0.1
· Postmortem & Process Improvement Plan · 过后总结, 并提出过程改进计划 0.5 0.2
合计 21.5 23.5

三、结对编程的设计(独立)

基本设计过程

在本次结对编程中,咱们一共分为几个模块:github

  • 计算模块,用于计算最短路
  • 用户接口模块1,命令行交互接口
  • 用户接口模块2,GUI交互接口
  • 测试模块,主要用于测试计算模块的功能

core.dll中的接口

文件core.h编程

EXPORT int TEST_LIB_PLUS(int a, int b);
EXPORT int gen_chain_word(char *words[], int len, char *result[], char head, char tail, bool enable_loop);
EXPORT int gen_chain_char(char *words[], int len, char *result[], char head, char tail, bool enable_loop);

四、计算模块接口的设计与实现过程

计算模块对外接口即为上面所述的core.h内的接口。数组

内部包含functions.h,为顶层功能。数据结构

// check if words is valid
int words_precheck(const std::vector<std::string> &words);

// check if there is word circle
int words_circle_check(const std::vector<std::string> &words);

// get longest word chain with word count
int get_chain_with_word(const std::vector<std::string> &words, std::vector<std::string> *&link,
                        const char &start_with, const char &end_with);

// get longest word chain with word length
int get_chain_with_char(const std::vector<std::string> &words, std::vector<std::string> *&link,
                        const char &start_with, const char &end_with);

int get_chain_with_word_allow_same(const std::vector<std::string> &words, std::vector<std::string> *&link,
                                   const char &start_with, const char &end_with);

int get_chain_with_char_allow_same(const std::vector<std::string> &words, std::vector<std::string> *&link,
                                   const char &start_with, const char &end_with);

在此之下,咱们共同实现了Graph类,用于支持全部的图论计算。框架

在Graph类上,咱们封装了SimpleChainModelWordChainModel两个类,用于对图论的构图,计算,数据调度等行为进行底层封装。工具

即流程为:oop

  • core.h调用functions.h(由于用指针传递字符串数组实在太难受了)
  • functions.h调用SimpleChainModelWordChainModel,进行逻辑层面的运算。
  • SimpleChainModelWordChainModel调用Graph,进行底层数据结构层面的运算。

五、画出UML图(独立)

UML图

六、计算模块接口部分的性能改进

改进思路

说来尴尬,其实咱们一开始就对于一、二、3需求设计成了最优解,经过创建虚节点,进行构图,将整个问题抽象为无环图的最长路径。gitlab

性能分析图

性能分析图

能够大概看出,咱们的程序中,尤为是计算模块,大量使用了stl进行运算。post

不过总体的性能瓶颈基本上依然集中于graph和Model的计算方法。

七、描述这些作法的优缺点, 说明你是如何把它们融入结对做业中的(独立)

契约式设计。即当程序知足一些约定好的最基本需求时才进行运行,不然直接拒绝运行。

优势:

  • 该模块将变得更严谨,定位更明确
  • 当外部调用该模块出现问题(违约)时,能够很快发现并暴露出来,便于其余部分的维护
  • 强制程序的前条件(pre-condition)、后条件(post-condition)、不变式(invariant)获得保证,从而使程序接口获得进一步的明确
  • 经过契约检查,保证模块始终处于可控状态内

缺点:

  • 程序语言须要有断言或者异常机制
  • 在稍微超出契约的状况下即不能运行,边界兼容性低
  • 正是由于上一点,因此对于契约制定阶段提出了更高的要求。

八、计算模块部分单元测试展现

九、计算模块部分异常处理说明

十、界面模块(若是没有实现GUI,则能够描述命令行模块)的详细设计过程

画界面用的是 QT 自带的 QT Designer 设计工具。这个工具灰常好用,所见即所得,操做又略略繁琐,虽然耗费了咱们大量的时间来熟悉这个鬼东西,但最终仍是取得了不错的效果。

QT Designer 设计的界面是保存在一个名字为.ui文件中的,这个文件采用 xml 语言描述了界面设计。在编译QT App时,QT会自动将这个 .ui 文件转换成一个 .h 文件,咱们能够直接在代码中使用这个文件,特别方便。

咱们的 GUI 是采用 QT 框架实现的,它具备如下特点:

  1. 界面美观、简洁大方、操做简单、功能完善
  2. 计算采用后台线程进行计算,较长时间运算不会卡 UI 线程

QT App 界面截图

十一、界面模块(GUI或命令行模块)与计算模块的对接

界面模块与计算模块的对接最后进行的几个步骤,此时咱们已经完成了核心模块的编写,所以,直接在代码中调用核心模块的头文件便可正常编写代码,再配合上cmake,就能自动进行动态连接。

因此,对接就这样完成啦。

十二、描述结对的过程

结对过程 - 滑稽打码

1三、结对的每个人的优势和缺点在哪里(独立)

袁勤
优势 一、认真负责,守时
二、代码水平不错
三、自学能力强
四、钻研探索的精神很不错
五、总而言之感受是个很使人以为靠得住的队友
一、写代码不算太慢,ddl当天大改需求半小时莽完200+行代码
二、写代码准确性不算过低,半小时莽完后零debug一遍所有经过
三、会用git,知道如何自建gitlab
缺点 一、让他的队友在填写这一栏的时候非常为难 一、其懒无比,拖延症,大鸽子一只二、很差好看需求,ddl当天发现需求错误
相关文章
相关标签/搜索