专栏首页HansBug's Lab【作业】结对编程纪实

【作业】结对编程纪实

结对编程纪实

1、Github地址

HansBug/pair_program_word_chain

2、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

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

基本设计过程

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

  • 计算模块,用于计算最短路
  • 用户接口模块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);

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

计算模块对外接口即为上面所述的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两个类,用于对图论的构图,计算,数据调度等行为进行底层封装。

即流程为:

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

5、画出UML图(独立)

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

改进思路

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

性能分析图

可以大概看出,我们的程序中,尤其是计算模块,大量使用了stl进行运算。

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

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

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

优点:

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

缺点:

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

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

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

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

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

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

我们的 GUI 是采用 QT 框架实现的,它具有以下特色:

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

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

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

所以,对接就这样完成啦。

12、描述结对的过程

13、结对的每一个人的优点和缺点在哪里(独立)

袁勤

优点

1、认真负责,守时2、代码水平不错3、自学能力强4、钻研探索的精神很不错5、总而言之感觉是个很令人觉得靠得住的队友

1、写代码不算太慢,ddl当天大改需求半小时莽完200+行代码2、写代码准确性不算太低,半小时莽完后零debug一遍全部通过3、会用git,知道如何自建gitlab

缺点

1、让他的队友在填写这一栏的时候很是为难

1、其懒无比,拖延症,大鸽子一只2、不好好看需求,ddl当天发现需求错误

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 算法模板——平衡树Treap

    实现功能如下——1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相同的数,因输出最小的排名) 4. 查询排名为x...

    HansBug
  • 3377: [Usaco2004 Open]The Cow Lineup 奶牛序列

    3377: [Usaco2004 Open]The Cow Lineup 奶牛序列 Time Limit: 10 Sec  Memory Limit: 128 ...

    HansBug
  • 算法模板——splay区间反转 2

    实现功能:同splay区间反转 1(基于BZOJ3223 文艺平衡树) 这次改用了一个全新的模板(HansBug:琢磨了我大半天啊有木有),大大简化了程序,同时...

    HansBug
  • 基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET平台开发指南 - 系统管理使用教程

    前言          所谓AgileEAS.NET平台系统管理即指AgiLeEAS.NET平台中用于完成插件的发现、安装、配置及组织管理功能的一组具体应用,以...

    魏琼东
  • C++核心准则C.44:默认构造函数最好简单而且不会抛出异常

    C.44: Prefer default constructors to be simple and non-throwing

    面向对象思考
  • 问题:单片机软件仿真和实际运行速度不一样?

    如图,问题大概就是说初学单片机,用软件仿真出来的程序,在开发板上运行的效果比仿真的快,晶振都是一样的12M。还问到一个1T模式和12T模式的区别?

    单片机技术宅
  • 前端axios下载excel,并解决axios返回header无法获取所有数据的问题

    需求:通过后端接口下载excel文件,后端没有文件地址,返回二进制流文件 实现:axios(ajax类似) 主要代码: axios:设置返回数据格式为blo...

    hbbliyong
  • Android APP安全防护总结

    使用Lint对无用资源进行清理,而Lint则可以检查所有无用的资源文件,只要使用命令./gradlew lint或者在Android Studio工程中点击An...

    天钧
  • spring 引入uploadify控件时的302与406

    302 302错误是由于spring拦截器造成的,需要将上传图片的controller不进行session验证即可 406 406是由于请求json头造成,解决...

    听城
  • 数据抓取实践:对加密参数及压缩混淆 JS 的逆向分析

    本文会介绍几种分析技巧,需要一点前端知识(总感觉在前端做防爬没什么意义,因为源码都是公开的)。文末附上爬虫 Demo 验证,虽然对于这个案例来说使用 Selen...

    sergiojune

扫码关注云+社区

领取腾讯云代金券