结对编程收获

结对编程收获

  ——我和我的伙伴分到了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,一经查实,立即删除!

相关文章

工作283:从字典表获取数值

order_task() {getAction(/dict, {page: 1,limit: 10,query: {"keywords":"order_status"}}).then(res > {this.status res.data.items;console.log(1)console.log(this.status)})},

微信新的用户信息接口wx.getUserProfile,返回信息解密失败

**关于微信小程序新登录接口wx.getUserProfile的使用方法 和手机号码有几率解密失败的解决办法** 自从2021年4月15号微信发布了小程序登录、用户信息相关接口调整说明之后&#xff0c;4.15之后上线的产品需更改用户登录逻辑&#xff0c;这是比较操*的&#xff0c;尤其是产品逻辑…

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依赖…

工作284:理解绑定逻辑

<custom-table v-loading"loading"element-loading-text"拼命加载中"element-loading-spinner"el-icon-loading" element-loading-background"rgba(0, 0, 0, 0.8)" size-changes"list" pagination-change"list&…

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;的开源实…

工作285:判断绑定逻辑

/*绑定id逻辑分析*/dialog() {/*传给当前的account_id进行接收*/putAction("/account/" this.account_id "/bind_ff_account_id", {remote_account_id: this.BindData[this.form.index].id,pavg: this.BindData[this.form.index].avatar_url,plugin_key:…

对象(一)

基本特征&#xff1a;面向对象编程有三个基本特征&#xff1a;封装、继承、多态&#xff1b; 面向对象思想&#xff1a;JavaScript 语言是通过一种叫做 原型&#xff08;prototype&#xff09;的方式来实现面向对象编程的。对象&#xff08;object&#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 …

工作286:v-model没有值会报错

</span></el-row><el-form-item label"刊例价"><span>&#xffe5;</span> {{ form.price }}</el-form-item><el-form-item label"任务名称"><!-- {{form.name}}--><el-input :disabled"viewList…

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

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

工作283:抽离出新页面优化

<template><!--绑定了一个 控制是否为全屏fullscreen close-on-click-modal 是否通过点击model进行关闭 visible是否显示弹出框 close关闭按钮 --><el-dialog open"open" :title"fullTitle" width"80%" :fullscreen"false&q…

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

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

CAS Client 3.2.1 配置详解

CAS Client 3.2.1 配置详解 http://www.pinhuba.com/casclient/101256.htm 摘要: CAS作为开源的单点登陆框架已经非常的流行了。由于它对已有系统的入侵性小&#xff0c;支持的语言多&#xff0c;备受广大开发者关注&#xff1b;CAS作为开源的单点登陆框架已经非常的流行了。由…

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

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

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

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

工作288:跨组件传值

putAction("/order/"this.$parent.$parent.ListId"/status",{status:-1,remark: this.remark}).then(res>{this.$message({message: 退回已提交,type: success});this.$emit("ok")this.dialogVisiblefalse跨组件传值

javafx HBOX按钮右对齐

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