結對編程
項目地址
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 | - |
結對編程