git
2)在開始實現程序以前,在下述程序員
任務內容算法 |
計劃共完成須要的時間(min)編程 |
|
Planning模塊化 |
計劃函數 |
25性能 |
· Estimate單元測試 |
· 估計這個任務須要多少時間,並規劃大體工做步驟學習 |
10天測試 |
Development |
開發 |
|
· Analysis |
· 需求分析 (包括學習新技術) |
90 |
· Design Spec |
· 生成設計文檔 |
5 |
· Design Review |
· 設計複審 (和同事審覈設計文檔) |
4 |
· Coding Standard |
· 代碼規範 (爲目前的開發制定合適的規範) |
10 |
· Design |
· 具體設計 |
10 |
· Coding |
· 具體編碼 |
600 |
· Code Review |
· 代碼複審 |
35 |
· Test |
· 測試(自我測試,修改代碼,提交修改) |
60 |
Reporting |
報告 |
9 |
· Test Report |
· 測試報告 |
60 |
· Size Measurement |
· 計算工做量 |
2 |
· Postmortem & Process Improvement Plan |
· 過後總結, 並提出過程改進計劃 |
10 |
3)看教科書和其它資料中關於Information Hiding, Interface Design, Loose Coupling的章節,說明大家在結對編程中是如何利用這些方法對接口進行設計的。
信息隱藏(Information Hiding)
信息隱藏指在設計和肯定模塊時,使得一個模塊內包含的特定信息(過程或數據),對於不須要這些信息的其餘模塊來講,是不可訪問的。信息隱藏有着獨特的啓發力,它可以激發出有效的設計方案。信息隱藏一樣有助於設計類的公開接口。
咱們的信息隱藏設計: 類的全部數據成員都是private,全部訪問都是經過訪問函數實現的;
接口設計(Interface Design)
接口能夠下降耦合性,便可以讓某個模塊或功能可以重複利用。
咱們的設計:能夠了解對象的交互界面,而不需瞭解對象所對應的類。
鬆耦合(Loose Coupling)
鬆耦合:即下降功能模塊之間的依賴度。
咱們的設計: 採用模塊化設計,將方法進行封裝,每一個類之間保持獨立,下降耦合度
1 if (c ==0 && b == 0) { 2 String answer = Lib2.compute1(ns, os, m1s, m2s); 3 label.setText(answer); 4 } 5 if (c != 1 && b == 1) { 6 String answer = Lib2.compute2(ns, os, m1s, m2s); 7 label.setText(answer); 8 } 9 if (c == 1 && b != 1) { 10 String answer = Lib2.compute3(ns, os, m1s, m2s); 11 label.setText(answer); 12 } 13 if (c == 1 && b == 1) { 14 String answer = Lib2.compute4(ns, os, m1s, m2s); 15 label.setText(answer); 16 }
F4回收垃圾後,發現紅色所有消失,資源所有被回收。證實沒有資源泄露。程序性能良好。
1 import static org.junit.Assert.*; 2
3 import org.junit.Test; 4
5 public class test { 6 Lib2 lib = new Lib2(); 7 @Test 8 public void test() { 9 lib.compute1(12, 2, 1, 100); 10 lib.compute2(12, 2, 1, 100); 11 lib.compute3(12, 2, 1, 100); 12 lib.compute4(12, 2, 1, 100); 13
14 } 15
16 }
樣例1:n爲非法字符(字母,符號等,這裏以字母爲例)。
@Test public void testn1command() { String[] args={"-n","e","-m","1","100"}; Command.main(args); }
樣例2:n超出預計範圍(n小於1或大於10000,這裏以-9爲例)。
@Test public void testn2command() { String[] args={"-n","-9","-m","1","100"}; Command.main(args); }
樣例3:m1,m2超出預計範圍(m1大於m2或者m1小於1大於100或者m2小於50大於1000,這裏以m1爲-8,m2爲40爲例)。
@Test public void testm1command() { String[] args={"-n","10","-m","-8","40"}; Command.main(args); }
樣例4:m爲非法字符(字母,符號等,這裏以字母爲例)。
@Test public void testm2command() { String[] args={"-n","10","-m","8","e"}; Command.main(args); }
樣例5:m,n爲空值
@Test public void testmncommand() { String[] args={}; Command.main(args); }
作題界面,設置監聽器,當觸發「下一題」的按鈕事件時,根據用戶定製的要求,進行出題。
1 class ButtonListener implements ActionListener { 2 public void actionPerformed(ActionEvent e) { 3 Lib2 lib2 = new Lib2(); 4 int ns = Integer.parseInt(n.getText()); 5 int os = Integer.parseInt(o.getText()); 6 int m1s = Integer.parseInt(m1.getText()); 7 int m2s = Integer.parseInt(m2.getText()); 8 if (e.getSource() == jbtBeginCompute) { 9 JFrame frame2 = new JFrame(); 10 frame2.setTitle("作題界面"); 11 frame2.setSize(500, 500); 12 frame2.setLocationRelativeTo(null); 13 frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 14 frame2.setVisible(true); 15 if (c ==0 && b == 0) { 16 String answer = Lib2.compute1(ns, os, m1s, m2s); 17 label.setText(answer); 18 } 19 if (c != 1 && b == 1) { 20 String answer = Lib2.compute2(ns, os, m1s, m2s); 21 label.setText(answer); 22 } 23 if (c == 1 && b != 1) { 24 String answer = Lib2.compute3(ns, os, m1s, m2s); 25 label.setText(answer); 26 } 27 if (c == 1 && b == 1) { 28 String answer = Lib2.compute4(ns, os, m1s, m2s); 29 label.setText(answer); 30 } 31
32 panel1.add(label); 33 JPanel panel2 = new JPanel(); 34 panel2.add(new JLabel("請輸入答案:")); 35 panel2.add(text); 36 JButton buttonSubmit = new JButton("提交答案"); 37 JButton buttonNext = new JButton("下一題"); 38 JPanel panel3 = new JPanel(); 39 panel3.add(buttonNext); 40 panel3.add(buttonSubmit); 41
42 frame2.add(panel1, BorderLayout.NORTH); 43 frame2.add(panel2, BorderLayout.CENTER); 44 frame2.add(panel3, BorderLayout.SOUTH); 45 frame2.setSize(500, 500); 46 frame2.setLocationRelativeTo(null); 47 frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 48 frame2.setVisible(true); 49 }
覈對答案:
1 buttonNext.addActionListener(new ActionListener() {// 定義時間監聽器
2 public void actionPerformed(ActionEvent e) { 3 System.out.println("下一題"+lib2.result); 4 String question = label.getText(); 5 int count = 0; 6 double sum = Double.parseDouble(text.getText()); 7 if (count < ns) { 8 String ifRight = ""; 9 if (lib2.result == sum) { 10 ifRight = "正確"; 11 rightSum++; 12 count++; 13 } else { 14 ifRight = "錯誤"; 15 count++; 16 } 17 String message = question + ", " + "你的答案:" + sum + ", " + "正確答案: " + lib2.result + ", 狀態: "
18 + ifRight; 19 list.add(message); 20 text.setText(""); 21 if (c ==0 && b == 0) { 22 String answer = Lib2.compute1(ns, os, m1s, m2s); 23 label.setText(answer); 24 } 25 if (c != 1 && b == 1) { 26 String answer = Lib2.compute2(ns, os, m1s, m2s); 27 label.setText(answer); 28 } 29 if (c == 1 && b != 1) { 30 String answer = Lib2.compute3(ns, os, m1s, m2s); 31 label.setText(answer); 32 } 33 if (c == 1 && b == 1) { 34 String answer = Lib2.compute4(ns, os, m1s, m2s); 35 label.setText(answer); 36 } 37 } 38 } 39 });
輸入「題目數量、運算符個數、數值上下界範圍、是否帶乘除和括號」後,選擇開始作題。
有計算作題時間的功能。
若是選擇「上傳題目」
將用戶上傳的題目逐一展現出來,用戶可在此界面作題。
答題完畢後,自動審覈,展現錯題庫。
結對編程的優勢:
1)在開發層次,結對編程能提供更好的設計質量和代碼質量,兩人合做能有更強的解決問題的能力。
2)兩個程序員之間能夠相互教對方,進行優劣勢的互補。
結對編程的缺點:
1)兩我的在一塊兒工做可能會出現工做精力不能集中的狀況。程序員可能會交談一些與工做無關的事情,反而分散注意力,致使效率比單人更爲低下。
2)有時候,程序員們會對一個問題互不相讓(代碼風格可能會是引起技術人員口水戰的地方),爭吵不休,反而產生重大內耗。
搭檔的優缺點:性格好,有耐心,心細,有規劃。能夠實現互幫互助,一塊兒學習,有時候,會對一個問題很堅持,缺乏變通性。
個人優缺點:好溝通,願意共享,喜歡一塊兒學習,耐性比較差,有時不夠細心。
任務內容 |
實際完成須要的時間(min) |
|
Planning |
計劃 |
30 |
· Estimate |
· 估計這個任務須要多少時間,並規劃大體工做步驟 |
10天 |
Development |
開發 |
|
· Analysis |
· 需求分析 (包括學習新技術) |
45 |
· Design Spec |
· 生成設計文檔 |
8 |
· Design Review |
· 設計複審 (和同事審覈設計文檔) |
6 |
· Coding Standard |
· 代碼規範 (爲目前的開發制定合適的規範) |
15 |
· Design |
· 具體設計 |
30 |
· Coding |
· 具體編碼 |
500 |
· Code Review |
· 代碼複審 |
80 |
· Test |
· 測試(自我測試,修改代碼,提交修改) |
120 |
Reporting |
報告 |
6 |
· Test Report |
· 測試報告 |
90 |
· Size Measurement |
· 計算工做量 |
8 |
· Postmortem & Process Improvement Plan |
· 過後總結, 並提出過程改進計劃 |
10 |