四則運算結對項目
結對項目
1.代碼地址:https://git.coding.net/mx123422/sizeyunsuanGUI-master.git
2.PSP計劃
PSP2.1 |
任務內容 |
計劃共完成需要的時間(h) |
Planning |
計劃 |
0.5 |
· Estimate |
· 估計這個任務需要多少時間,並規劃大致工作步驟 |
0.5 |
Development |
開發 |
35 |
· Analysis |
· 需求分析 (包括學習新技術) |
1 |
· Design Spec |
· 生成設計文檔 |
1 |
· Design Review |
· 設計復審 (和同事審核設計文檔) |
3 |
· Coding Standard |
· 代碼規範 (為目前的開發制定合適的規範) |
2 |
· Design |
· 具體設計 |
5 |
· Coding |
· 具體編碼 |
15 |
· Code Review |
· 代碼復審 |
3 |
· Test |
· 測試(自我測試,修改代碼,提交修改) |
5 |
Reporting |
報告 |
3 |
· Test Report |
· 測試報告 |
1 |
· Size Measurement |
· 計算工作量 |
1 |
· Postmortem & Process Improvement Plan |
· 事後總結, 並提出過程改進計劃 |
1 |
3.接口
(1)Information Hiding信息隱藏
信息隱藏指在設計和確定模塊時,使得一個模塊內包含的信息(過程或數據),對於不需要這些信息的其他模塊來說,是不能訪問的。通過信息隱藏,可以定義和實施對模塊的過程細節和局部數據結構的存取限制。
信息隱藏有著獨特的啟發力,它能夠激發出有效的設計方案。信息隱藏同樣有助於設計類的公開接口。在設計的所有層面上,都可以通過詢問該隱藏些什麽來促成好的設計決策。
(2)Interface Design接口設計
模塊間的接口分類:參數傳遞,全局變量,文件
設計原則:
低耦合,高內聚;兩個耦合的模塊間以數據耦合為最佳,即除了調用時傳參數以外不存在其他關系。
設計要點:
模塊功能力求單一,即一個模塊只做一件事;模塊的輸入輸出數據全部組織成為調用參數且當被調用時實參和形參要保持一致
本次項目在生成運算式與計算數值中使用到了接口。
(3)Loose Coupling松耦合
模塊與模塊之間總會存在一些“聯系”,這就會提升我們維護過程中的復雜度和任務量。松耦合通過接口的方式實現各個模塊之間的調用,可以使模塊在發生改變時,其他的部分可以保持不變,減少模塊間的相互“聯系”,降低耦合。
4.計算模塊接口的設計與實現過程
(1)YunSuanShiShengCheng
此接口對於題目中僅加減、是否含乘除法、是否含括號含三個方法,接受來自GUI界面輸入的題目數、絕對值上下限及運算符個數,從而完成Main.java中對於生成計算式的實現;同理也可從命令行接受來自Command.java中的參數進行運算式生成。
(2)Calculate
此接口中的方法對來自YunSuanShiShengCheng.Java中生成字符串型運算式的求值。
5.計算模塊接口部分的性能改進
項目總體分析圖,從內存,多線程,CPU等方面分析了計算模塊的性能,截圖如下:
代碼覆蓋率:
6.計算模塊部分單元測試展示
7.計算模塊部分異常處理說明
輸入參數不合法:
1 import java.io.PrintStream;
2 import java.util.Scanner;
3
4 public class Command {
5 static YunSuanShiShengCheng expression=new YunSuanShiShengCheng();
6 public static int n;//題目數
7 public static int m1;//範圍下限
8 public static int m2;//範圍上限
9 public static int b = 0;//題目中是否有括號,默認沒有
10 public static int c = 0;//題目中是否有乘除法,默認沒有
11 public static int o = 1;//運算符個數,默認為1
12
13
14
15 public static void main(String[] args) {
16 // TODO Auto-generated method stub
17 int isN = 0;
18 int isM = 0;
19 /*n = 10;
20 m1 = 1;
21 m2 = 50;
22 c=0;
23 o=4;
24 b=1;*/
25 for (int i = 0; i < args.length; i++) {
26 if (args[i].equals("-n")) {
27 isN = 1;
28 try {
29 n = Integer.parseInt(args[i + 1]);
30 if (n <= 0 || n > 10000) {
31 System.out.println("n的範圍不在[1,10000]內,請重新輸入");
32 return;
33 }
34 } catch (Exception e) {
35 System.out.println("n的格式不合法,請重新輸入!");
36 }
37 }
38 if (args[i].equals("-m")) {
39 isM = 1;
40 try {
41 m1 = Integer.parseInt(args[i + 1]);
42 m2 = Integer.parseInt(args[i + 2]);
43 if (m1 <= 0 || m1 > 100) {
44 System.out.println("m1的範圍不在[1,100]內,請重新輸入");
45 return;
46 }
47 if (m2 < 50 || m2 > 1000) {
48 System.out.println("m1的範圍不在[50,1000]內,請重新輸入");
49 return;
50 }
51 } catch (Exception e) {
52 System.out.println("m的格式不合法,請重新輸入!");
53 }
54 }
55
56 if (args[i].equals("-o")) {
57 try {
58 o = Integer.parseInt(args[i + 1]);
59 if (o <= 0 || o > 10) {
60 System.out.println("o的範圍不在[1,10]內,請重新輸入");
61 return;
62 }
63 } catch (Exception e) {
64 System.out.println("o的格式不合法,請重新輸入!");
65 }
66 }
67 if (args[i].equals("-b")) {
68 b = 1;// 括號
69 }
70 if (args[i].equals("-c")) {
71 c = 1;// 乘除
72 }
73 }
74 if (isN == 0) {
75 System.out.println("無參數n,請重新輸入!");
76 return;
77 }
78 if (isM == 0) {
79 System.out.println("無參數m,請重新輸入!");
80 return;
81 }
82
83 System.out.println("生成"+n+"道算術題,每道題目與中間結果的絕對值應該在"+m1+"到"+m2+"之間,算術題中的符號有"+o+"個。");
84
85 if (b == 0&&c==0) {
86 expression.generateExpressionA(o,m1,m2,n);
87 }
88 else if(b == 0&&c==1){
89 expression.generateExpressionD(o,m1,m2,n);
90 }
91 else if((c == 0)&&b==1){
92 expression.generateExpressionB(o,m1,m2,n);
93 }
94 else
95 System.out.println("請重新輸入!");
96 //System.out.println("成功");
97 }
98
99 }
8.界面模塊的詳細設計過程
主頁面使用CalFrame frame=new CalFrame();
1 import javax.swing.*;
2 import java.awt.*;
3 /**
4 * 主頁面框架
5 *
6 */
7 class CalFrame extends JFrame{
8 private static final long serialVersionUID = 1L;
9
10 Toolkit kit=Toolkit.getDefaultToolkit();
11 Dimension screenSize=kit.getScreenSize();
12 int DEFAULT_WIDTH=screenSize.width;
13 int DEFAULT_HEIGHT=screenSize.height;
14
15 public CalFrame(){
16 setSize(DEFAULT_WIDTH/2,DEFAULT_HEIGHT/2);
17 setLocationByPlatform(true);
18 add(new MainComponent());
19 }
20 }
21 @SuppressWarnings("serial")
22 class MainComponent extends JComponent{
23
24 }
文件及題型選擇:
1 JMenuBar menuBar = new JMenuBar();
2
3 JMenu fileMenu = new JMenu("文件");
4 JMenu tixingMenu = new JMenu("題型選擇");
5
6 menuBar.add(fileMenu);
7 menuBar.add(tixingMenu);
功能選擇區:
1 // 創建文本區域, 用於顯示相關信息
2 final JTextArea msgTextArea = new JTextArea(10, 30);
3 msgTextArea.setLineWrap(true);
4 panel.add(msgTextArea);
5
6 //MenuBar組件部分
7 //文件下目錄
8 JMenuItem generateMenuItem = new JMenuItem("生成題庫");
9 JMenuItem exitMenuItem = new JMenuItem("退出");
10 fileMenu.add(generateMenuItem);
11 fileMenu.addSeparator();// 添加一條分割線
12 fileMenu.add(exitMenuItem);
13
14 /*題型選擇下目錄*/
15 final JRadioButtonMenuItem radioButtonMenuItem01 = new JRadioButtonMenuItem("加減法");
16 final JRadioButtonMenuItem radioButtonMenuItem04 = new JRadioButtonMenuItem("乘法混合運算");
17 final JRadioButtonMenuItem radioButtonMenuItem02 = new JRadioButtonMenuItem("帶括號整數算式");
18 final JRadioButtonMenuItem radioButtonMenuItem03 = new JRadioButtonMenuItem("真分數整數算式");
19 // 子菜單添加到一級菜單
20 //viewMenu.add(openQuestion);
21 tixingMenu.addSeparator();
22 tixingMenu.add(radioButtonMenuItem01);
23 tixingMenu.add(radioButtonMenuItem04);
24 tixingMenu.add(radioButtonMenuItem02);
25 tixingMenu.add(radioButtonMenuItem03);
26 // 其中兩個 單選按鈕子菜單,要實現單選按鈕的效果,需要將它們放到一個按鈕組中
27 ButtonGroup btnGroup = new ButtonGroup();
28 btnGroup.add(radioButtonMenuItem01);
29 btnGroup.add(radioButtonMenuItem04);
30 btnGroup.add(radioButtonMenuItem02);
31 btnGroup.add(radioButtonMenuItem03);
32 // 默認第一個單選按鈕子菜單選中
33 radioButtonMenuItem01.setSelected(true);
9.
generateExpressionA、generateExpressionB、generateExpressionC、generateExpressionD
1 generateMenuItem.addActionListener(new ActionListener() {
2 @Override
3 public void actionPerformed(ActionEvent e) {
4
5 int flag=1;//默認普通算式
6 if(radioButtonMenuItem01.isSelected()){flag=1;}
7 if(radioButtonMenuItem04.isSelected()){flag=4;}
8 if(radioButtonMenuItem02.isSelected()){flag=2;}
9 if(radioButtonMenuItem03.isSelected()){flag=3;}
10 String inputContent1 = JOptionPane.showInputDialog(
11 frame,
12 "輸入運算符的個數:"
13 );
14 String inputContent2 = JOptionPane.showInputDialog(
15 frame,
16 "輸入結果絕對值的範圍下限:"
17 );
18 String inputContent3 = JOptionPane.showInputDialog(
19 frame,
20 "輸入結果絕對值的範圍上限:"
21 );
22 String inputContent4 = JOptionPane.showInputDialog(
23 frame,
24 "輸入題目的數量(<10000):"
25 );
26
27 if((inputContent4==null||inputContent4.equals(""))&&(inputContent1==null||inputContent1.equals(""))&&(inputContent3==null||inputContent3.equals(""))&&(inputContent4==null||inputContent4.equals(""))){
28 textArea.append("取消生成\n");
29 }
30 else{
31 if(judge(Float.parseFloat(inputContent4))){
32 switch(flag){
33 case 1:
34 expression.generateExpressionA(Integer.parseInt(inputContent1),Integer.parseInt(inputContent2),Integer.parseInt(inputContent3),Integer.parseInt(inputContent4));
35 break;
36 case 4:
37 expression.generateExpressionD(Integer.parseInt(inputContent1),Integer.parseInt(inputContent2),Integer.parseInt(inputContent3),Integer.parseInt(inputContent4));
38 break;
39 case 2:
40 expression.generateExpressionB(Integer.parseInt(inputContent1),Integer.parseInt(inputContent2),Integer.parseInt(inputContent3),Integer.parseInt(inputContent4));
41 break;
42 case 3:
43 expression.generateExpressionC(Integer.parseInt(inputContent1),Integer.parseInt(inputContent2),Integer.parseInt(inputContent3),Integer.parseInt(inputContent4));
44 break;
45 }
46
47 arithExpress=doFile.ReadFromFile("./correctAnswer.txt");
48
49 JOptionPane.showMessageDialog(frame,"新的題庫已生成,可以開始答題","消息標題",JOptionPane.INFORMATION_MESSAGE);
50 }else{
51 JOptionPane.showMessageDialog(frame,"輸入非法參數","消息標題",JOptionPane.WARNING_MESSAGE);
52 }
53
54 }
55
56 }
57 });
10.描述結對的過程
從項目開始就在一起準備,查找各方面的資料。JAVA的知識都忘卻的差不多了,但是兩人還是一起努力撿起原來的JAVA書開始針對性地學習。最開始並沒有任何計劃,在查找了相關資料以及咨詢大佬門之後,兩人共同完成了大致的項目進行走向。中間也產生過分歧,在計算結果模塊的部分,兩人各有各的思考,但是個人的成果都有bug存在,在協商一致後兩人互補的完成了計算模塊的代碼設計,雖然過程較為復雜,但是最終能夠完成了項目的基本功能!在合作過程中苦中有樂,收獲很多!
11.結對情況分析
成員:
馬雪 2016012093
王亞楠 2015012012
(1)結對優點
程序員互相幫助,互相教對方,可以得到能力上的互補。
可以讓編程環境有效地貫徹Design。
增強代碼和產品質量,並有效的減少BUG。
降低學習成本。一邊編程,一邊共享知識和經驗,有效地在實踐中進行學習。
在編程中,相互討論,可能更快更有效地解決問題。
(2)結對缺點
於有不同習慣的編程人員,可以在起工作會產生麻煩,甚至矛盾。
有時候,程序員們會對一個問題各執己見(代碼風格可能會是引發技術人員口水戰的地方),爭吵不休,反而產生重大內耗。
兩個人在一起工作可能會出現工作精力不能集中的情況。程序員可能會交談一些與工作無關的事情,反而分散註意力,導致效率比單人更為低下。
個人優點:不松懈、努力、不懂就問
個人缺點:缺少耐心
隊員優點:冷靜、積極、技術性指導
隊友缺點:辦事心切,處事不夠幹練
12.PSP實際
PSP2.1 |
任務內容 |
實際完成需要的時間(h) |
Planning |
計劃 |
0.5 |
· Estimate |
· 估計這個任務需要多少時間,並規劃大致工作步驟 |
0.5 |
Development |
開發 |
47 |
· Analysis |
· 需求分析 (包括學習新技術) |
2 |
· Design Spec |
· 生成設計文檔 |
2 |
· Design Review |
· 設計復審 (和同事審核設計文檔) |
5 |
· Coding Standard |
· 代碼規範 (為目前的開發制定合適的規範) |
3 |
· Design |
· 具體設計 |
6 |
· Coding |
· 具體編碼 |
20 |
· Code Review |
· 代碼復審 |
3 |
· Test |
· 測試(自我測試,修改代碼,提交修改) |
6 |
Reporting |
報告 |
6 |
· Test Report |
· 測試報告 |
2 |
· Size Measurement |
· 計算工作量 |
2 |
· Postmortem & Process Improvement Plan |
· 事後總結, 並提出過程改進計劃 |
2 |
四則運算結對項目