結對做業:基於GUI實現四則運算

1)Coding.Net項目地址https://git.coding.net/day_light/GUIszysLL.gitgit

2)在開始實現程序以前,在下述PSP表格記錄下你估計將在程序的各個模塊的開發上耗費的時間。程序員

 

任務內容算法

計劃共完成須要的時間(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)

鬆耦合:即下降功能模塊之間的依賴度。

咱們的設計: 採用模塊化設計,將方法進行封裝,每一個類之間保持獨立,下降耦合度

4)計算模塊接口的設計與實現過程。

 

1.共三個大類,六個函數:分別爲命令行測試和GUI界面測試。

2.命令行:Command類中包含主函數,主要負責命令行參數的接受及參數異常處理;同時調用Lib類中的Compute1,Compute2,Compute3,Compute4的四個方法,分別生成加減運算式,加減帶括號運算式,加減乘除運算式,加減乘除帶括號運算式。

3.GUI界面測試:GUI類中包含主函數,主要負責GUI的界面展現,同時設置監聽器,分別調用buttonSubmit和buttonNext兩個方法,進行出題和提交答案;同時buttonNext調用Lib類中的Compute1,Compute2,Compute3,Compute4的四個運算方法,生成運算式。

算法關鍵:經過複選框監聽器實現調用四個運算函數

 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                             }

5) 計算模塊接口部分的性能改進。記錄在改進計算模塊性能上所花費的時間,描述你改進的思路,並展現一張性能分析圖,並展現你程序中消耗最大的函數。

1.性能改進:爲保證除法中不出現小數,當不知足改條件時,從新生成隨機數,致使代碼會出現不少無效循環,爲改進這一問題,咱們設置當遇到除法的時候,咱們能夠隨機產生被除數的因數,以減小代碼的無效循環。當遇到乘法的時候,減小乘數的大小,以保證能夠產生較多的式子。
2.消耗最大函數:出題類Lib中的Compute4,主要實現加減乘除帶括號的功能。

 

F4回收垃圾後,發現紅色所有消失,資源所有被回收。證實沒有資源泄露。程序性能良好。

6)計算模塊部分單元測試展現。展現出項目部分單元測試代碼,並說明測試的函數,構造測試數據的思路。並將單元測試獲得的測試覆蓋率截圖,發表在博客中。只須要測試命令行部分,且該部分覆蓋率到90%以上。

單元測試代碼:

 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 }

 

 

7)計算模塊部分異常處理說明。在博客中詳細介紹每種異常的設計目標。每種異常都要選擇一個單元測試樣例發佈在博客中,並指明錯誤對應的場景。

 樣例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); }

8)界面模塊的詳細設計過程。在博客中詳細介紹界面模塊是如何設計的,並寫一些必要的代碼說明解釋實現過程。

作題界面,設置監聽器,當觸發「下一題」的按鈕事件時,根據用戶定製的要求,進行出題。

 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                 });

9)界面模塊與計算模塊的對接。詳細地描述UI模塊的設計與兩個模塊的對接,並在博客中截圖實現的功能。

界面模塊共四個,出題界面選擇用戶上傳或定製出題,選擇定製出題時,在「四則運算」界面,選擇輸入題目數量、運算符個數、數值上下界範圍、是否帶乘除和括號時,UI模塊將參數傳到符合定製要求的計算模塊中,計算模塊將知足用戶要求的題目生成,並返回到「作題界面」,用戶在作題界面輸入答案,首先判斷是否爲合法參數,若不合適則從新生成,若合適,則調用計算模塊中生成的正確答案,與用戶輸入答案進行判斷,生成錯題庫,當完成作題數量時,停止作題,按下提交答案按鈕,跳轉到錯題庫,查看作題狀況。

 

輸入「題目數量、運算符個數、數值上下界範圍、是否帶乘除和括號」後,選擇開始作題。

 有計算作題時間的功能。

 

若是選擇「上傳題目」

 

將用戶上傳的題目逐一展現出來,用戶可在此界面作題。

 

答題完畢後,自動審覈,展現錯題庫。

 

 

10)描述結對的過程,提供非擺拍的兩人在討論的結對照片。

11)說明結對編程的優勢和缺點。

結對編程的優勢:

1)在開發層次,結對編程能提供更好的設計質量和代碼質量,兩人合做能有更強的解決問題的能力。

2)兩個程序員之間能夠相互教對方,進行優劣勢的互補。

結對編程的缺點:

1)兩我的在一塊兒工做可能會出現工做精力不能集中的狀況。程序員可能會交談一些與工做無關的事情,反而分散注意力,致使效率比單人更爲低下。

2)有時候,程序員們會對一個問題互不相讓(代碼風格可能會是引起技術人員口水戰的地方),爭吵不休,反而產生重大內耗。

搭檔的優缺點:性格好,有耐心,心細,有規劃。能夠實現互幫互助,一塊兒學習,有時候,會對一個問題很堅持,缺乏變通性。

個人優缺點:好溝通,願意共享,喜歡一塊兒學習,耐性比較差,有時不夠細心。

12)PSP

 

任務內容

實際完成須要的時間(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

相關文章
相關標籤/搜索