结对编程
项目地址
Coding.net:结对编程
结对编程组员
雷源城:201421122108
陈志钦:201421122109
需求分析
记录用户的对错总数
1.用户每次回答问题,直接计入对错,防止用户在测试未完成时中断测试导致对错总数出错。
2.每次进入测试时,继续承接上一次未回答的问题
3.再次生成多个问题时,将在之前的问题基础上再增加
4.按照每题逐个回答
计时功能
1.问题出现的同时开始计时
2.回答完一个问题重新进行计时
程序设计
在原有的基础上了代码的编写,主要将原本为控制台程序,转变到界面上,并添加对错总数的统计和计时功能,依据每次回答时记录对错并刷新页面的数据。
代码展示
问题界面设计代码
String aaa = null; main.createFile("question"); main.createFile("answer"); main.createFile("grade"); for (int i = 0; i < a; i++) { main.question(b); } lastnum = Integer.parseInt(Count.getTrue()) + Integer.parseInt(Count.getFalse()); try { quest = main.readTotalline("question"); main.createFile("count"); jp1_1 = new JPanel(); jp1_2 = new JPanel(); jp1_3 = new JPanel(); jp1_4 = new JPanel(); //创建标签 jlb1_1 = new JLabel("问 题:"); jlb1_11 = new JLabel(main.readFileByLines("question", lastnum + 1) + "=?"); jlb1_2 = new JLabel("答 案:"); jlb1_31 = new JLabel("对:"); jlb1_32 = new JLabel(Count.getTrue()); jlb1_33 = new JLabel(" " + (lastnum + 1) + "/"); jlb1_34 = new JLabel(main.arraylength(quest) + " "); jlb1_35 = new JLabel("正确率:"); rightrate = String.valueOf(Float.parseFloat(Count.getTrue()) / (Float.parseFloat(Count.getTrue()) + Float.parseFloat(Count.getFalse()))); DecimalFormat df = new DecimalFormat("#.##"); rightrate = String.valueOf(df.format(Float.parseFloat(rightrate) * 100.0)); jlb1_36 = new JLabel(rightrate + "%"); jtext = new JTextField(5); //创建按钮 jb1_1 = new JButton("下一题"); //创建文本框 //设置布局管理 this.setLayout(new GridLayout(4, 3));//网格式布局 final JLabel l = new JLabel(); //加入各个组件 jp1_1.add(jlb1_1); jp1_1.add(jlb1_11); jp1_2.add(jlb1_2); jp1_2.add(jtext); jp1_3.add(jb1_1); jp1_3.add(l); jp1_4.add(jlb1_31); jp1_4.add(jlb1_32); jp1_4.add(jlb1_33); jp1_4.add(jlb1_34); jp1_4.add(jlb1_35); jp1_4.add(jlb1_36); //加入到JFrame this.add(jp1_1); this.add(jp1_2); this.add(jp1_3); this.add(jp1_4); long str = Now.nowTime(); Timer t = new Timer(); t.scheduleAtFixedRate(new TimerTask(){ public void run(){ l.setText(Now.nextTime(str)); } },0,1000); jb1_1.addActionListener(this); //注册监听 ; jb1_1.setActionCommand("onclick"); //设置窗体 this.setTitle("四则运算");//窗体标签 this.setSize(250, 200);//窗体大小 this.setLocationRelativeTo(null);//在屏幕中间显示(居中显示) this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出关闭JFrame this.setVisible(true);//显示窗体 //锁定窗体 this.setResizable(true); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); }
统计功能设计
public void actionPerformed(ActionEvent e) { if(e.getActionCommand()=="onclick") { this.dispose(); // TODO 自动生成的方法存根 try { String answer = main.readFileByLines("answer", lastnum + 1); if (answer.equals(jtext.getText())){ Count.trueIncrease(Count.getTrue()); }else{ Count.trueDecrease(Count.getFalse()); } if ((lastnum + 1) != main.arraylength(quest)){ Test test = new Test(0,0); }else { JOptionPane.showMessageDialog(null,"你已回答了所有的问题!总计对:" + Count.getTrue() + " 正确率为:" + rightrate + "%","提示消息",JOptionPane.YES_NO_CANCEL_OPTION); } } catch (IOException e1) { // TODO 自动生成的 catch 块 e1.printStackTrace(); } } else { System.out.println("222"); } }
计时功能
public static long nowTime() { long start = System.currentTimeMillis()/1000; return start; } //获取下次时间与开始时间的结果 public static String nextTime(long start) { long end = System.currentTimeMillis()/1000 - start; long m = end / 60; long s = end % 60; String mStr = null; String sStr = null; String str = null; if(m<10){ mStr = "0" + m; }else{ mStr = "" + m; } if(s<10){ sStr = "0" + s; }else{ sStr = "" + s; } str = mStr + ":" + sStr; return str; }
程序运行
初始登录,需输入问题个数和题目范围
不输入时显示
问题界面
输入答案
结果显示
小结感受
这次的结对编程做完后,我自己感觉实现这些功能的速度比较一个人快了很多,从效率上完全有1+1>2效果。
在我认为,主要的一部分原因在于两个人的想法都不太一样,有可能有一些并不是很难的问题却能刚好卡住你自己,但是另一个人却能够顺利解决,致使我们在编写代码时,不容易出现一直无法实现某个功能或方法的情况。
结对编程除了开始分配工作任务和制定计划需要讨论之外,其他时间基本是自己在进行对代码的编写,这样能有效地提高自身的编码能力,而且经常性的会有一些问题需要讨论,两个人也能从讨论中进一步提升自身对代码的理解,这对于编程上的效率提升是巨大的。
不过,最重要的还是需要组员间不能有争吵,和睦相处是能够进行结对编程的必要条件,有问题可以进行讨论,自己有什么想法也可以跟另一个组员提出来,只有在和睦的情况下才能让两个人间顺利合作,才能实现1+1>2的效果。
评价合作伙伴
这次结对编程的合作伙伴是我的一个舍友,待在同一个宿舍3年多了致使我们在进行代码编写的过程中也不会出现一些争吵的事情,对对方的性情都比较了解。先说下不足的地方,即是我的合作伙伴同时也包括我,都比较爱到最后的时间段才开始着手工作,算是一种赶工,有点类似于漫画家给催稿时才有动力开始画漫画一样,这一点是比较大的不足。不过优点同样是有的,正如之前小结中所说的,我们两个人对代码的理解方面不一样,对于一个功能上的理解方式也不同,通常上他对问题的看法和我的看法都不一样,想出来解决的方法也不一样,这样都导致了我们俩能够比较顺利地进行结对编程的编写。
结对过程
我们在开始进行结对编程时先查看了一下这次作业的要求是什么,之后在讨论后,在三个功能上选择了其中两个功能。
其次是代码规范,我的组员和我都有较好的代码规范理解,而且基本上对于一些代码的处理规范上的准则是相同的,所以没有花费多少时间。
经过一番讨论先选择了我的上次的四则远算为基准,然后开始分配任务,介于我对于我自身的代码更加的熟悉,由我来进行对界面的编写,加上和之前的代码进行整合,新增一部分方法并将我的组员编写的方法运用到界面上来。我的组员则是编写实现出这些功能的方法,并和我商量好数据类型和传递方法。
之后是代码编写环节,我们通过两人独立间完成自己的任务,当然在一些迷惑或者是纠结的问题上也进行了讨论。
最后我的组员将他的代码提交到我这边,我将他方法运用,接着再两个人共同讨论,完善一些功能上的bug。
PSP
PSP2.1 | Personal Software Process Stages | Time Predicted | Time |
---|---|---|---|
Planning | 计划 | 5 | 5 |
· Estimate | 估计这个任务需要多少时间 | 5 | 5 |
Development | 开发 | 600 | 500 |
· Analysis | 需求分析 (包括学习新技术) | 20 | 25 |
· Design Spec | 生成设计文档 | - | - |
· Design Review | 设计复审 | 10 | 5 |
· Coding Standard | 代码规范 | 10 | 5 |
· Design | 具体设计 | 20 | 20 |
· Coding | 具体编码 | 300 | 360 |
· Code Review | 代码复审 | 30 | 20 |
· Test | 测试(自我测试,修改代码,提交修改) | 100 | 80 |
Reporting | 报告 | 120 | 150 |
. | 测试报告 | 60 | 90 |
. | 计算工作量 | 20 | 20 |
. | 并提出过程改进计划 | 10 | - |