结对编程ending-我和洧洧的碎碎念
应该是第一次和队友分工合作去完成一个项目,其中也经历了跳进不少坑又被拉回来的过程,总体来说这对于我俩也的确是值得纪念的一次经历。
我的碎碎念时间……
对比个人项目和结对编程项目二者需求,前者重在面对不同对象生成题目到文本,而后者涉及的方面就更多。除了可以复用个人项目生成题目这一模块之外,项目还有很多难点需要攻破,并且在完成项目过程中也遇到了各种各样的问题:
1、用户注册模块实现短信验证码功能;
- 阿里云注册申请短信签名;
- 将demo嵌入生成短信验证码这一button的监听事件;
单独运行demo需要自己写一个主函数,测试手机的确可以收到验证码之后,将这一模块放进项目中单独为一个类,不再需要主函数,在注册界面加入按钮监听功能。在此调用验证码类的功能。
实现中遇到的问题就是与队友界面的代码进行综合的时候,粗心将输入验证码的文本变量verification当成了按钮,调用功能不能实现,改了很久很久……最后队友发现这个问题才得到解决。一方面也是两个人编程各自实现功能时候还好,综合的时候确实暴露了很多问题,各自编码风格,命名习惯等等,交流磨合是必不可少的过程,自己也确实从队友这里收获许多;另一方面就是个人完成模块一定要耐心细心,申请签名的确浪费时间磨人耐心,写代码的时候细心一些才不会因为小错误浪费时间。
registered.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent em)
{
try {
StudyUI smsUtils = new StudyUI();
String telphoneString = ad.getText();
smsUtils.sendSms(telphoneString);
}
catch (ClientException e) {
e.printStackTrace();
}
}
});
2、UI界面的文本数据监听并利用;
在项目中有一个这样的需求,就是用户还是要在界面输入生成的题目数量,之后会生成相应数量的题目。
个人项目可以直接用循环解决,但在这次项目中,这个问题就比较难办,因为输入数量的文本在一个界面,得到这个数据之后直接控制之后需要产生多少个题目界面(前提一道题目一个界面),项目中两个功能分成了两个界面,不能同时利用这一变量,后来也是朋友讲解才明白要利用静态变量。单独写一个类来声明这些‘“共享”的变量,之后在需要的类中import这个类即可。
public class GetNum
{
static int k; //题目数量
static int count; //生成界面数量
static int score; //显示得分
}
之后就是在输入题目数量的界面将自定义的值赋给K,一开始自己是直接将赋值语句 String numb=num.getText(); GetNum.k=Integer.valueOf(numb); 写进了文本num的监听模块,在之后测试产生的界面数量时为0,显然是这个值没有赋过去,后来反复的调试输出测试,发现是自己选择监听模块出了错,这里就有一个逻辑问题,num是用来监听输入的数量,输入之后这个监听功能就实现并且完成,不能在这里直接getText,在接下来的按钮模块或者其他模块直接getText才可以。这的确是一个很大的教训,在这块花费的时间很长,并且像这种错误还不容易发现。
primary.addActionListener(new ActionListener()
{ public void actionPerformed(ActionEvent e)
{
String numb=num.getText();
GetNum.k=Integer.valueOf(numb);
dispose();
run(new MyQuiz(),500,350);
} });
num.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
int c=e.getButton();
if(c==MouseEvent.BUTTON1 && num.getText().equals("题目数量")&&e.getClickCount()==1)
{
num.setText(null);
}
} });
这一模块就是用户在做题的时候按NEXT会到下一界面的题目,控制判断语句中的k就是“共享变量”K,在修改了上面所说的错误之后这里实现起来就简单一些,得到了用户输入的值,这里控制如果界面数量没有超过K值会继续产生题目,反之出现最终的分数界面。
Next.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//System.out.println(GetNum.count);
//System.out.println(GetNum.k);
if(GetNum.count<GetNum.k-1)
{
dispose();
run(new MyQuiz(),500,350);
GetNum.count++;
}
else {
dispose();
run(new MyScore(),500,350);
}
}
});
这大概是项目中花费时间最长爬出来的两个坑,在这次项目中也是真的感受到队友的细致与认真,有时候已经到自己觉得:啊啊啊好麻烦,不然就这样吧。结果还是队友找到了解决的更好的办法,所以这次经历不仅是提升编程能力过程,也能感受到他人身上值得学习的东西。期间的交流和改bug的过程也是一份珍贵的经历。
哈哈哈,然后就是洧洧的碎碎念时间……
结对编程在个人编程的基础上加上了UI界面,而且我认为结对编程与个人编程相同的需求大概就是在小学、中学、和高中出题的要求上是一致的了,其余的需求都是全新的需求,于是我们在保留小学、中学和高中出题的代码上,增添了UI界面和计算结果这两个需求,并将其整合起来就成了我们结对编程项目的大概框架。
一开始由于个人编程的误导,因为个人编程里面是存储好指定几个人的信息,然后在此情况下,生成指定的个人难度的试卷,于是我们俩认为一开始会有个登录界面,并存储进相应的个人信息,比如啥名字,账号,密码之类的,再加上在群里面有人在问数据库怎么用,就更加加深了我们往这方面的想法,于是就感觉这次的个人编程好难呀,连数据库都用上了,但由于没有学过,我们先将这个放到了一边,做起了UI界面,想着最后再来考虑这个问题。再将第一步也就是登录界面完成后,我们俩看了看结对编程的需求,然后这才发现它的需求里面其实根本就没有什么登录的界面要求,不需要存储用户的数据在里面,这里步骤应该是短信发送验证码成功后,到设置密码,设置密码完成后就直接到了选择出题难度的界面了,然后就可以开始出题了,于是在这里我们得到了一个教训,看清楚需求到底是什么样的,不要自己想当然的增加需求,更不要因为别人的想法来左右自己的想法,这是我在这次结对编程里得到的第一个教训。
两个人编程肯定是分工合作,因此我俩一个人负责短信API那个一个人负责写每一部分的UI界面,然后将UI界面发送给她进行两部分的整合,然后由于有两个地方的注释有点模糊不清的原因,她理解错了,就造成了整合在一起之后的代码不能正常地发送短信,后来一看才发现加代码的地方加错了,于是这里又得到了一个教训,那就是注释写清楚,遇上模糊不清的时候还是要和小组成员进行讨论,不能自己去猜测到底是什么那内容。
这次结对编程中我收获到了许多经验和教训,1+1>2我也是深刻的体会到了,但这是在两人配合默契相辅相成的情况下的,也学到了许多原来不曾接触的东西,比如写一个UI界面,以及计算算是所需用到的后缀表达式,这都是我在这次结对编程学到的东西,而且感觉比以往学到的更深刻也更牢固。
结对编程ending-我和洧洧的碎碎念的更多相关文章
- 结对编程--基于android平台的黄金点游戏
游戏内容: 阿超的课都是下午两点钟,这时班上不少的同学都昏昏欲睡,为了让大家兴奋起来,阿超让同学玩一个叫“黄金点”的游戏: N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或1 ...
- 结对编程-地铁续(有种上个学期OO的既视感)
我们组比较特殊..三人结对 github:https://github.com/qingchanghan/WPFUI_Metro po一张照片: 石浩然,韩青长.陈彦吉 (台式机真的很高端,分屏贼帅) ...
- 结对编程项目——四则运算vs版
结对编程项目--四则运算vs版 1)小伙伴信息: 学号:130201238 赵莹 博客地址:点我进入 小伙伴的博客 2)实现的功能: 实现带有用户界面的四则运算:将原只能在 ...
- 关于软件工程结对编程作业 PairProject : Elevator Scheduler(电梯调度算法的实现与测试)的总结
1)结对编程队友 1106xxxx 张扬 1106xxxx 杨军 其中,此项目的编程实现主要由前者完成. 2)关于结对编程 结对编程的优点: 最直接的一点:在结对编程中,由于有另一个人在你身边和你配合 ...
- 结对编程—黄金点游戏WinForm单机版
本小游戏场景来自邹欣老师的<移山之道>一书: "阿超的课都是下午两点钟,这时班上不少的同学都昏昏欲睡,为了让大家兴奋起来,阿超让同学玩一个叫"黄金点"的游戏: ...
- Week4 结对编程
1.照片 1.1 结对编程参与者:李文涛.黎柏文 1.2 展示照片 2.结对编程的优点&缺点 2.1 优点 2.1.1.两人分工合作,减少了工作量 2.1.2.结对编程的伙伴往往能提供不同 ...
- 结对编程——关于Fault、Error、Failure程序设计
一.问题描述: 构造程序,分别是: •不能触发Fault •触发Fault,但是不能触发Error •触发Error,但是不能产生Fai ...
- GUI、模块化与结对编程(homework-03)
摘要: 在本次作业博客里,我将主要阐述作业3的收获.作业3表面是将之前的程序转换为图形界面(之前程序见http://www.cnblogs.com/shone/p/3348372.html),然而本质 ...
- BJDP结对编程活动
7月21日参与了 BJDP北京的活动 在北京首次参与能够参与动手编程活动,感觉挺不错的. 本次活动共有三项内容 1. 金锐分享单元测试的Mocking技术,20 mins 2. 伍 ...
随机推荐
- 如何使用mongodb(建立原型,连接数据库)
前两天看了一个朋友做的mongodb数据库,他是自己从某网络大学试听课学的,从可读性和模块区分方面做的比较差,所以写下此文,以作交流. 首先是创建一个modules文件夹,这里面用来存放mongodb ...
- Spring history、design philosophy (Spring的历史及设计理念)
一,Spring的发展史 1,Spring1.x 时代 在Spring1.x时代,都是通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分放到不同的配置文件中,需要频繁的在java类和x ...
- dict字典的一些优势和劣势
01. 键必须是可散列的一个可散列的对象必须满足以下要求. (1) 支持 hash() 函数,并且通过 __hash__() 方法所得到的散列值是不变的. (2) 支持通过 __eq__() 方法来检 ...
- 论文笔记:Heterogeneous Memory Enhanced Multimodal Attention Model for Video Question Answering
Heterogeneous Memory Enhanced Multimodal Attention Model for Video Question Answering 2019-04-25 21: ...
- threejs深入纹理,立体场景cubeResolution(四)
在这个课程里主要完成讲解两个demo: 一个是电视墙:用视频做纹理 一,用视频做纹理 首先我们用video标签把视频源引入: <video id="video" autopl ...
- 数据类型(data type)
基本数据类型(primitive data type):字符型(2个字节),布尔型(一位),byte(1个字节),short(两个字节),int(4个字节),long(8个字节),float(2个字节 ...
- H5外包团队 2019案例更新
H5外包团队 2019案例更新 本项目控件均为动态加载,3D部分使用Unity3D,其它基于ReactJS,NodeJS,部分使用cocos2D,由于项目涉密,只能发部分截图,欢迎联系索取更多案例,企 ...
- 二、Python数据类型(一)
一.Python的基本输入与输出语句 (一)输出语句 print() 示例: print('你好,Python') print(4+5) a = 10 print(a) 输出的内容可以是字符串,变量, ...
- _spellmod_aura_pct_on_stat
为玩家添加属性转换光环 `comment` 备注 `aura`光环ID `auraType1` 选择添加('治疗效果','法术强度','近战攻击强度','远程攻击强度','空') `statType ...
- AT2412 最大の和
传送门 思路: 线段树暴力枚举区间,查询最大区间和. Code: #include<iostream> #include<cstdio> #include<algorit ...