应该是第一次和队友分工合作去完成一个项目,其中也经历了跳进不少坑又被拉回来的过程,总体来说这对于我俩也的确是值得纪念的一次经历。 

 

 我的碎碎念时间…… 


  对比个人项目和结对编程项目二者需求,前者重在面对不同对象生成题目到文本,而后者涉及的方面就更多。除了可以复用个人项目生成题目这一模块之外,项目还有很多难点需要攻破,并且在完成项目过程中也遇到了各种各样的问题:

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-我和洧洧的碎碎念的更多相关文章

  1. 结对编程--基于android平台的黄金点游戏

    游戏内容: 阿超的课都是下午两点钟,这时班上不少的同学都昏昏欲睡,为了让大家兴奋起来,阿超让同学玩一个叫“黄金点”的游戏: N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或1 ...

  2. 结对编程-地铁续(有种上个学期OO的既视感)

    我们组比较特殊..三人结对 github:https://github.com/qingchanghan/WPFUI_Metro po一张照片: 石浩然,韩青长.陈彦吉 (台式机真的很高端,分屏贼帅) ...

  3. 结对编程项目——四则运算vs版

    结对编程项目--四则运算vs版 1)小伙伴信息:        学号:130201238 赵莹        博客地址:点我进入 小伙伴的博客 2)实现的功能: 实现带有用户界面的四则运算:将原只能在 ...

  4. 关于软件工程结对编程作业 PairProject : Elevator Scheduler(电梯调度算法的实现与测试)的总结

    1)结对编程队友 1106xxxx 张扬 1106xxxx 杨军 其中,此项目的编程实现主要由前者完成. 2)关于结对编程 结对编程的优点: 最直接的一点:在结对编程中,由于有另一个人在你身边和你配合 ...

  5. 结对编程—黄金点游戏WinForm单机版

    本小游戏场景来自邹欣老师的<移山之道>一书: "阿超的课都是下午两点钟,这时班上不少的同学都昏昏欲睡,为了让大家兴奋起来,阿超让同学玩一个叫"黄金点"的游戏: ...

  6. Week4 结对编程

    1.照片 1.1  结对编程参与者:李文涛.黎柏文 1.2  展示照片 2.结对编程的优点&缺点 2.1 优点 2.1.1.两人分工合作,减少了工作量 2.1.2.结对编程的伙伴往往能提供不同 ...

  7. 结对编程——关于Fault、Error、Failure程序设计

    一.问题描述:         构造程序,分别是:         •不能触发Fault         •触发Fault,但是不能触发Error         •触发Error,但是不能产生Fai ...

  8. GUI、模块化与结对编程(homework-03)

    摘要: 在本次作业博客里,我将主要阐述作业3的收获.作业3表面是将之前的程序转换为图形界面(之前程序见http://www.cnblogs.com/shone/p/3348372.html),然而本质 ...

  9. BJDP结对编程活动

    7月21日参与了 BJDP北京的活动 在北京首次参与能够参与动手编程活动,感觉挺不错的. 本次活动共有三项内容 1.      金锐分享单元测试的Mocking技术,20 mins 2.      伍 ...

随机推荐

  1. String.StartsWith 方法

    startsWith() 方法用于检测字符串是否以指定的前缀开始. 语法 public boolean startsWith(String prefix, int toffset) 或 public ...

  2. 浏览器解析JavaScript的原理

    JavaScript的特点一般都知道的就是解释执行,逐行执行,就是从上到下依次执行. JavaScript的执行之前,其实还是有一些操作的,只是没有表现出来 JavaScript的执行过程: 1.语法 ...

  3. redux&&createStore

    const createStore = (reducer,presetState, enhancer) => { if (typeof presetState === "functio ...

  4. Tag

    C# ASP.NET SQL SERVER .Net Entity Framework JS Question Records Others

  5. error_Could not load file or assembly

    原文链接 Could you be missing the loaded assembly from your configuration file? Ensure you have somethin ...

  6. 微信小程序http连接访问解决方案

    HTTP + 加密 + 认证 + 完整性保护 = HTTPS,小程序考虑到信息安全的问题,选用了更为稳定安全的https 来进行信息传递. HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全 ...

  7. CocoaPods 中删除不需要的第三方

    1...打开Podfile  找到不需要的类库,直接删除 2...打开终端cd到当前项目的根目录下重新执行pod install --verbose --no-repo-update命令(更新一下) ...

  8. Python自动发送邮件提示:smtplib.SMTPServerDisconnected: please run connect() first

    参考:http://blog.csdn.net/leven_change/article/details/66976695

  9. golang Mysql -- Tx

    Transaction 事务 事务处理是数据的重要特性.尤其是对于一些支付系统,事务保证性对业务逻辑会有重要影响.golang的mysql驱动也封装好了事务相关的操作.我们已经学习了db的Query和 ...

  10. AT2412 最大の和

    传送门 思路: 线段树暴力枚举区间,查询最大区间和. Code: #include<iostream> #include<cstdio> #include<algorit ...