结对编程收获

结对编程收获

  ——我和我的伙伴分到了Core组,他负责生成编写四则运算表达式函数,而我负责编写计算函数以及整体框架和接口

  这一次结对编程不仅学到了不少编程技术,更在交流合作中发现了自己以往的问题,因为我一直以来是一个偏爱独来独往的人,宁愿在合作中多干活,也不愿意别人对我的构想指手画脚,不过这一次是无法避免的了。

编程收获


 

1、实战经验

  这是一次难得的C++实战经验,或者说是一次面向对象语言的实践,C++更抽象一层的数据类型及其方法将我从以往繁重的体力活(用C语言编写)中解救出来,我也充分地利用了它不同于C的特性,将整个小项目的结构都编写得比较优美(至少是学习计算机语言以来)。(最后附上核心内部接口与外部接口)

2、开发流程

结队编程的效率=成员单独的效率-交流所带来的损耗,因此成员之间任务的耦合性越大,带来的损耗也越大,所以在合作的过程中,我有如下想法:

1)前期:最好采用和-分-和的讨论方法。

  (1)和:成员需要全部参与到代码整体脉络的讨论当中,然后尽量地以减小任务耦合度为原则分配任务。

  (2)分:当两者(或者几个人)任务存在可能的交叉时,成员需要单独地进行交流,对设计的版块进行细致讨论。(这一阶段非常重要,只有细致地讨论、设计才有助于尽早地发现BUG,这对开发周期有百利而难有一害)

  (3)和:然而两者(或者几个人)交流完毕后,不能急匆匆地开始开发,需要重新召开组会,交流各个版块的设计思想,并至少需要一个统领全局的人明确整体的脉络,发现中间可能存在的冲突、重叠,然后提供改进的建议。

2)开发:有几个需要注意的问题

  (1)如果数据结构存在重叠,即后者可能用到前者的数据结构时,那么他们的耦合度可以判定为高,需要共同设计代码、编写代码,并且开发时只有一人编写,而另一人需要实时观察、跟进。而两者(或者几个人)任务只是接口级别的,则可判定为低,需要事先约定好接口的类型,然后分别开发自己的模块,最后组建为一个类。

  (2)测试代码要跟进上每一个函数,尤其是项目越大这一点越是关键,虽然有一些函数因为参数表的问题难以编写测试类,然而并不能省略,因为之后的查错可能会把人逼疯。

3)归并:需要在线(最好是面对面)的交流

  在各个同学便写完代码需要归并在一起的时候,可以按照树的结构逐步上提,当然每一个节点都是一个更高层次的功能来确定的。这时候需要进行面对面的联合测试,因为这样在对接的时候能充分化解歧义,并且前后调用函数的编写人可以互相交流容易忽视的点,可能出现的异常。

3、开发周期:

  这次我充分吸收了上次个人编程时受到的教训,以逐次迭代的思想,我每开发一个新的模块时都列写出可能用到的最基本的函数,独立地进行编写、测试。事实上这样的经历是轻松+愉快的,在后期的调试中,至少没有在算法逻辑上遇到明显的问题。(当然C++这点没有Java做得好,Java的@Test注解对函数的测试是更加轻松的,也可能我学的C++太浅显了,毕竟从Java到C++的过渡只用了6个小时)

4、开发感想:

  读了其他同学的收获,我感觉我上文所述的方案有些许遗憾,因为我太在意去除耦合性,让每个人去做独立的工作,却忽略了两个人一起编程(人数更多可能就不管用了)所带来的其他效益(这里的一起是指同时做一件事情)。因为两个人独立思考一种算法的时候能够发现更多的漏洞,这里我也有提到,也就是最初第一和第三步的公共讨论部分;另外互相监督能促使队友更高效地工作,而不是时不时就去看一眼其他无关的内容;最后还能减少debug的时间,领航员对驾驶员的代码大致了解的时候可能有不同于你的固有认识,我想这个方面的确可能是两个人合作的效率大于单干效率之和的。

接口处理:

 


 

1、前后接口讨论的重要性:

  诚如上文所言,在最初的讨论中所有成员都应该参加,但是这次并没有邀请UI组(甚至最开始的时候还没有考虑到要联系UI组,因为接口函数看上去已经确定了)。也如后来UI同学在群里抱怨的,虽然逻辑上各组之间差异不大,但是他们最初想得太美好了,接口参数表、返回值、甚至编写语言的不同让UI组的工作一下子重了不少。我们在之后的第二天找到了UI组的同学,不过他们讨论的积极性也不高,所谓的对接组内讨论也不了了之。

2、人性化、例程:

  这一次我们的接口设计是比较成功的,因为据反馈有好几组UI都对我们的接口表示满意,我想这一方面得益于我在对接口设计时充分考虑到(a)尽可能少的调用函数完成尽可能多的事情(b)C语言仍然是所有同学熟练掌握的语言,并且它几乎成为各种编程语言会优先支持的外部语言;另一方面我也不厌其烦地在每一个版本中编写Test工程对dll进行测试,更对接口编写实际的使用例程并且不断进行更新,这样充分考虑用户感受使我们赢得了赞誉。

代码展现:


 

 

1、留给UI组的接口

 

extern "C" __declspec(dllexport)
void  SettingCal(int numOfOperand, int numOfQuestion, double rangeOfQuestion, bool addition, bool subtraction, bool multiplication, bool division, bool power, bool brackets, int precision, bool properFraction, bool decimalFraction);extern "C" __declspec(dllexport) 
void  GenerateAndCalc();extern "C" __declspec(dllexport) 
const char*  getExpression(int count);extern "C" __declspec(dllexport)
const char*  getAnswer(int count);extern "C" __declspec(dllexport)
int numOfQuestion();
View Code

 

2、内部的代码框架

 

struct ReversePolishType {stack<double> OPTR;        //操作数栈stack<char> OPND;        //操作符栈
};struct fractionType {//假分数形式int    numerator;            //分子int denominator;        //分母
};struct RPT_FractionType {//真分数的逆波兰式表示stack<fractionType> OPTR;stack<char>    OPND;
};class OperationClass
{
private:
//B同学:int numOfQuestion;        //题目的数量int numOfOperand;        //操作数的数量double rangeOfQuestion;    //题目中的数值范围//运算符的种类bool addition;bool subtraction;bool multiplication;bool division;bool power;bool brackets;int precision;            //精度bool properFraction;    //是否支持真分数bool decimalFraction;    //是否支持小数//都不支持说明支持整数
//计算整形、小数形式的算式static ReversePolishType ReversePolishNotation(string Input)throw(...);                        //计算整形、小数形式的算式:根据string生成逆序波兰式static double CalReversePolishNotation(ReversePolishType expression)throw(...);                //计算整形、小数形式的算式:根据逆波兰式计算结果//计算分数形式的算式static RPT_FractionType RPN_FractionType(string Input)throw(...);                                //计算分数形式的算式:根据string生成逆序波兰式static fractionType CRPN_FractionType(RPT_FractionType expression)throw(...);                    //计算分数形式的算式:根据逆波兰式计算结果//分数形式的加、减、乘、除、乘方static fractionType fraAdd(fractionType a, fractionType b)throw(...);static fractionType fraSub(fractionType a, fractionType b)throw(...);static fractionType fraMul(fractionType a, fractionType b)throw(...);static fractionType fraDiv(fractionType a, fractionType b)throw(...);static fractionType fraPow(fractionType a, int b)throw(...);//A同学:string generate()throw(...);string generate1()throw(...);string generate2()throw(...);string generate3()throw(...);string generate0()throw(...);
public:OperationClass();                //无参构造方法//提供给UI的属性、方法
//对象的属性vector<string>    expression;        //存储生成的表达式vector<string>    answer;            //存储表达式的计算结果void Setting(int numOfOperand, int numOfQuestion, double rangeOfQuestion, bool addition, bool subtraction, bool multiplication, bool division, bool power, bool brackets, int precision, bool properFraction, bool decimalFraction);/*设置属性:操作数数量,题目数量,数值范围,加法?减法?乘法?除法?乘方?(真分数?or小数?最后两项只可选其一,否则抛出异常)*/void GenerateAndCalc();void Generate();                //生成表达式,并存储在string当中void CalcAllExpression();        //对题目表达式依次进行计算,将结果string数组返回//获得对象的属性int getNumOfQuestion();            //获取题目数量设定值//B同学提供给A同学的方法
//计算表达式expression
//返回double类型的答案double CalcDouble(string expression)throw(...);                    //整数/小数形式表达式:对输入表达式字符串进行运算,然后以数值形式返回double CalcFrationDouble(string expression)throw(...);            //分数形式表达式:对输入表达式字符串进行运算,然后以数值形式返回//返回string类型的答案string Calc(string expression)throw(...);                            //整数/小数形式表达式:对输入表达式字符串进行运算,然后以数值形式返回string CalcFration(string expression)throw(...);                    //分数形式表达式:对输入表达式字符串进行运算,然后以数值形式返回

};
View Code

 

转载于:https://www.cnblogs.com/Trinidad/p/8893597.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/414207.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot整合ActiveMQ发送邮件

虽然ActiveMQ以被其他MQ所替代&#xff0c;但仍有学习的意义&#xff0c;本文采用邮件发送的例子展示ActiveMQ 文章目录1. 生产者1.1 引入maven依赖1.2 application.yml配置1.3 创建配置类ConfigQueue1.4 创建生产者类Producer1.5 启动类AppProducer2. 消费者2.1 引入maven依赖…

PHPStudy集成环境下使用laravel框架报错ERR_CONNECTION_REFUSED

环境&#xff1a;php7.2mysqlapachelaravel5.5 因为要搞个新项目&#xff0c;用了laravel&#xff0c;不是很熟悉这个框架&#xff0c;还用了laravel-admin后台系统&#xff0c;配置本地虚拟域名的时候&#xff0c;映射始终报错&#xff0c;能访问到项目跟目录&#xff0c;但是…

MQTT客户端库-Paho GO

为了加深理解&#xff0c;本文是翻译文章。原文地址 Paho GO Client   语言  GO协议EPL AND EDL官网地址http://www.eclipse.org/paho/API类型Asynchronous 描述 回到2013年10月&#xff0c;我转到了关于其他Paho MQTT客户端库的编写&#xff0c;并选择了作为一种新的语言去…

RabbitMQ简单介绍+Windows环境安装

文章目录 文章目录文章目录1、RabbitMQ简介2、RabbitMQ与其他MQ有什么不同3、RabbitMQ环境安装3.1 安装erlang3.2 安装rabbitmq-server4. RabbitMQ管理平台介绍1、RabbitMQ简介 RabbitMQ 是一个由 erlang 开发的 AMQP&#xff08;Advanced Message Queue &#xff09;的开源实…

intellij idea 在Java控制台报java: 错误: 无效的源发行版:16

一共有三个地方要设置 第一个地方File->Project Structure->Project,全部修改为对应的JDK版本&#xff0c;例如如果是1.8&#xff0c;language level就选择8对应的包&#xff0c; 第二个地方File->Project Structure->Modules 也有个language level&#xff0c;一…

RabbitMQ六种队列模式-主题模式

前言 RabbitMQ六种队列模式-简单队列 RabbitMQ六种队列模式-工作队列 RabbitMQ六种队列模式-发布订阅 RabbitMQ六种队列模式-路由模式 RabbitMQ六种队列模式-主题模式 [本文] 从前面的几篇我们依次经历了 exchange 模式从 fanout > direct 的转变过程&#xff0c;在 fanout …

exe4j打包jar包生成exe文件BUG日记

参考了很多资料,生成需要的包以及设置文件目录: 不过我用的是IntelliJ IDEA 2021.3.3,所以java打包成jar的步骤以及配置有点不同; 首先设置导出配置:File->Project Strure->Artifacts MANIFEST.MF最好保存在src目录下,避免生成的jar包再打包成Exe时找不到主类: …

RabbitMQ六种队列模式-路由模式

前言 RabbitMQ六种队列模式-简单队列 RabbitMQ六种队列模式-工作队列 RabbitMQ六种队列模式-发布订阅 RabbitMQ六种队列模式-路由模式 [本文] RabbitMQ六种队列模式-主题模式 本文带大家了解 RabbitMQ 队列模式中的路由模式。 其实只要看过上篇发布模式后&#xff0c;相信路由…

已经改成UTF-8了,git提交properties还是乱码

原因idea的File Encoding勾选了Transparent native-to-ascii conversion 如果团队中都勾选了则无所谓、如果有的勾选、有的没勾选合并代码会出现乱码。

RabbitMQ六种队列模式-发布订阅模式

前言 RabbitMQ六种队列模式-简单队列 RabbitMQ六种队列模式-工作队列 RabbitMQ六种队列模式-发布订阅 [本文] RabbitMQ六种队列模式-路由模式 RabbitMQ六种队列模式-主题模式 上文的工作队列模式是直接在生产者与消费者里声明好一个队列&#xff0c;这种情况下消息只会对应同类…

javafx HBOX按钮右对齐

<HBox spacing"20" alignment"CENTER_LEFT"> <!---关键在这里----><HBox HBox.hgrow"ALWAYS"></HBox><JFXButton prefWidth"100" fx:id"dialogCommitButton" prefHeight"40" textAlig…

景山公园

转载于:https://www.cnblogs.com/optor/p/8928938.html

RabbitMQ六种队列模式-工作队列模式

前言 RabbitMQ六种队列模式-简单队列 RabbitMQ六种队列模式-工作队列 [本文] RabbitMQ六种队列模式-发布订阅 RabbitMQ六种队列模式-路由模式 RabbitMQ六种队列模式-主题模式 上文我们了解了 RabbitMQ 六种队列模式中的简单队列&#xff0c;代码也是非常的简单&#xff0c;比较…

RabbitMQ六种队列模式-简单队列模式

前言 RabbitMQ六种队列模式-简单队列 [本文] RabbitMQ六种队列模式-工作队列 RabbitMQ六种队列模式-发布订阅 RabbitMQ六种队列模式-路由模式 RabbitMQ六种队列模式-主题模式 在官网的教程中&#xff0c;描述了如上六类工作队列模式&#xff1a; 简单队列模式&#xff1a;最简…

工作290:重置新增的mode

/*4 GY定义 找到该组件下面的add方法*/add() {/* 5GY定义 给当前属性下面的title赋值*/this.title "新增";/*重置新增的mode*/this.mode[]this.show();this.IsShowtrue;this.attrthis.viewMode false;this.approveMode false/* 7GY定义 给当前的form赋值 并进行对…

串口数据字节位的理解

# STM32F4xx系列的MCU的UART数据字节组成如下图 # 发送数据做如下图示&#xff0c;data byte MSB 与 Parity 重合 # 先刨去 Parity bit&#xff0c;分析 LSB ~ MSB 的纯数据&#xff1a; > 假定数据中的 ‘1’ 个数为奇数&#xff0c;偶校验&#xff1a;Parity ‘1’&#…

RabbitMQ消息确认机制

文章目录1. 事务机制2. Confirm模式2.1 生产者2.1.1 普通Confirm模式2.1.2 批量Confirm模式2.1.3 异步Confirm模式2.2 消费者3. 其他消费者如何确保消息一定能够消费成功呢&#xff1f;由于在前面工作队列模式里面我们了解了应答模式&#xff0c;所以我们可以很自信的回答如上题…

RabbitMQ消息幂等性问题

文章目录1. 什么是幂等性&#xff1f;1.1 消息队列的幂等性1.2 模拟重试机制1.2.1 生产者代码1.2.2 消费者代码1.2.3 消费者 application.yml 配置2. 如何保证消息幂等性&#xff0c;不被重复消费&#xff1f;解决方法1. 什么是幂等性&#xff1f; 在编程中一个幂等操作的特点是…

Centos安装JDK(java环境)

王小私下问我 centos 中 jdk 怎么安装呀&#xff0c;所以再次整理了这篇基础环境搭建的文章。 1、创建java目录2、下载上传jdk3、解压jdk4、配置环境变量 1、创建java目录 首先我们创建java的安装目录 cd /usrmkdir javacd java 2、下载上传jdk 我们如上在 usr 目录下创建了 ja…

工作288:根据时间戳处理接口

<template><div class"table-list-page"><div class"query-area"><el-date-pickerv-model"value1"type"daterange"range-separator"至"start-placeholder"开始日期"end-placeholder"结…