【作業報告】作業5 四則運算 測試與封裝 5.1

蘇亦晨發表於2015-04-30

 測試與封裝 5.1

程式開發簡介:

【開發環境】:eclipse

【開發人員】:Ives & 鄭勝斌

【部落格地址】:38鄭勝斌

【開發時間】:2015-04-30

【版本】:5.1

【要求】:

  • 封裝
  • 測試

 

 

【分工】:

      Ives:單元測試。介面。自定義異常。

      鄭勝斌:封裝 Expression類。

封裝:

概念

  封裝是把過程和資料包圍起來,對資料的訪問只能通過已定義的介面。物件導向計算始於這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的物件,這些物件通過一個受保護的介面訪問其他物件。封裝是一種資訊隱藏技術,在java中通過關鍵字private實現封裝。什麼是封裝?封裝把物件的所有組成部分組合在一起,封裝定義程式如何引用物件的資料,封裝實際上使用方法將類的資料隱藏起來,控制使用者對類的修改和訪問資料的程度。
      
作用

    1、良好的封裝能夠減少耦合。

    2、類內部的結構可以自由修改。

    3、可以對成員進行更精確的控制。

    4、隱藏資訊,實現細節。

步驟: 

    1、修改屬性的可見性來限制對屬性的訪問。(通常將類的成員變數宣告為private)
      2、為每個屬性建立一對賦值方法和取值方法,用於對這些屬性的訪問。
      3、在賦值和取值方法中,加入對屬性的存取限制。
 
單元測試小白式教程:
 
這次我是和1班的鄭勝斌童鞋一起結對寫這個程式的。這是第一個階段,第一個階段還是比較簡單的,估計接下來有得忙一會了。廢話不多說了,今天些了一天的部落格了,這篇我儘量簡潔些好了。
 
Ives
 
介面程式碼如下:
  1 package com.ives;
  2 
  3 import java.awt.EventQueue;
  4 
  5 public class frame {
  6 
  7     private JFrame frame;
  8     private JTextField textField;
  9     private JTextField textField_1;
 10     private JTextField textField_2;
 11     private JTextField textField_3;
 12     private JTextField textField_4;
 13     private JTextField textField_5;
 14     
 15     int a;
 16     int b;
 17     int op;
 18     String Sa;
 19     String Sb;
 20     int result;
 21     Expression expression = new Expression();
 22     private JButton btnNewButton_1;
 23 
 24 
 25     /**
 26      * Launch the application.
 27      */
 28     public static void main(String[] args) {
 29         EventQueue.invokeLater(new Runnable() {
 30             public void run() {
 31                 try {
 32                     frame window = new frame();
 33                     window.frame.setVisible(true);
 34                 } catch (Exception e) {
 35                     e.printStackTrace();
 36                 }
 37             }
 38         });
 39     }
 40 
 41     /**
 42      * Create the application.
 43      * @throws Yichang 
 44      */
 45     public frame() throws Yichang {
 46         initialize();
 47     }
 48 
 49     /**
 50      * Initialize the contents of the frame.
 51      */
 52     private void initialize() throws Yichang{
 53         frame = new JFrame();
 54         frame.setBounds(100, 100, 517, 352);
 55         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 56         
 57         JPanel panel = new JPanel();
 58         frame.getContentPane().add(panel, BorderLayout.CENTER);
 59         panel.setLayout(null);
 60         
 61         JLabel lblNewLabel = new JLabel("\u56DB\u5219\u8FD0\u7B97\u56685.1");
 62         lblNewLabel.setFont(new Font("微軟雅黑", Font.PLAIN, 30));
 63         lblNewLabel.setBounds(141, 0, 208, 57);
 64         panel.add(lblNewLabel);
 65         
 66         textField = new JTextField();
 67         textField.setHorizontalAlignment(SwingConstants.CENTER);
 68         textField.setFont(new Font("微軟雅黑", Font.PLAIN, 30));
 69         textField.setBounds(56, 82, 88, 45);
 70         panel.add(textField);
 71         textField.setColumns(10);
 72         
 73         textField_1 = new JTextField();
 74         textField_1.setHorizontalAlignment(SwingConstants.CENTER);
 75         textField_1.setFont(new Font("微軟雅黑", Font.PLAIN, 30));
 76         textField_1.setColumns(10);
 77         textField_1.setBounds(220, 82, 88, 45);
 78         panel.add(textField_1);
 79         
 80         textField_2 = new JTextField("=");
 81         textField_2.setEditable(false);
 82         textField_2.setFont(new Font("微軟雅黑", Font.PLAIN, 30));
 83         textField_2.setColumns(10);
 84         textField_2.setBounds(318, 82, 36, 45);
 85         panel.add(textField_2);
 86         
 87         textField_3 = new JTextField();
 88         textField_3.setHorizontalAlignment(SwingConstants.CENTER);
 89         textField_3.setFont(new Font("微軟雅黑", Font.PLAIN, 30));
 90         textField_3.setColumns(10);
 91         textField_3.setBounds(371, 82, 88, 45);
 92         panel.add(textField_3);
 93         
 94         JButton btnNewButton = new JButton("\u505A\u5B8C\u4E86");
 95         btnNewButton.setFont(new Font("微軟雅黑", Font.PLAIN, 30));
 96         btnNewButton.setBounds(188, 156, 131, 45);
 97         panel.add(btnNewButton);
 98         
 99         JLabel lblNewLabel_1 = new JLabel("\u8BA1\u7B97\u7ED3\u679C");
100         lblNewLabel_1.setFont(new Font("微軟雅黑", Font.PLAIN, 30));
101         lblNewLabel_1.setBounds(56, 222, 131, 35);
102         panel.add(lblNewLabel_1);
103         
104         textField_4 = new JTextField();
105         textField_4.setFont(new Font("微軟雅黑", Font.PLAIN, 20));
106         textField_4.setColumns(10);
107         textField_4.setBounds(188, 222, 161, 35);
108         panel.add(textField_4);
109         
110         textField_5 = new JTextField();
111         textField_5.setEditable(false);
112         textField_5.setFont(new Font("微軟雅黑", Font.PLAIN, 30));
113         textField_5.setText("+");
114         textField_5.setColumns(10);
115         textField_5.setBounds(159, 82, 44, 45);
116         panel.add(textField_5);
117         
118         a = expression.geta();
119         Sa = String.valueOf(a);
120         textField.setText(Sa);
121         
122         b = expression.getb();
123         Sb = String.valueOf(b);
124         textField_1.setText(Sb);
125         
126         btnNewButton_1 = new JButton("\u518D\u6765 ");
127         btnNewButton_1.addActionListener(new ActionListener() {
128             public void actionPerformed(ActionEvent e) {
129                 
130             }
131         });
132         btnNewButton_1.setFont(new Font("微軟雅黑", Font.PLAIN, 30));
133         btnNewButton_1.setBounds(366, 222, 107, 36);
134         panel.add(btnNewButton_1);
135         
136 
137         btnNewButton.addActionListener(new ActionListener() {
138             public void actionPerformed(ActionEvent arg0){
139                 int n3=Integer.valueOf(textField_3.getText().toString());
140                 result = expression.getaswer();
141                 if(textField_3.getText().equals(""))
142                 {
143                     String inputValue = JOptionPane.showInputDialog("Please input a value");
144                     n3 = Integer.parseInt(inputValue);
145                 }     
146                 try {
147                  if(n3<0)
148                 
149                         throw new Yichang("不可能是負數!");
150                     } catch (Yichang e) {
151                         // TODO 自動生成的 catch 塊
152                         e.printStackTrace();
153                     }
154                  if(result==n3)
155                 {
156                     textField_4.setText(" 正確");
157                 }else{
158                     textField_4.setText(" 錯誤!答案為"+result);
159                 }
160                 }
161         });
162     }
163 }
frame

 

自定義異常程式碼如下: 
1 package com.ives;
2 
3 class Yichang extends Exception 
4 {  
5     public Yichang(String msg)      
6     {  
7         super(msg);  
8     }  
9 }  
Yichang

 

測試程式碼如下:

 1 package com.ives;
 2 import static org.junit.Assert.*;
 3 
 4 import org.junit.Test;
 5 
 6 
 7 public class ExpressionTest {
 8 
 9     @Test
10     public void testExpression() {
11         int a;
12         Expression test = new Expression();
13         a = test.getaswer();
14         assertEquals(a, test.answer);
15     } 
16 }
ExpressionTest

 

 

鄭勝斌 

計算程式碼如下:
 1 package com.ives;
 2 import java.util.*;
 3 
 4 import com.ives.Input;
 5 public class Expression 
 6 {
 7     private int a = (int)(Math.random() * Math.pow(10,2)-1);
 8     private int b = (int)(Math.random() * Math.pow(10,2)-1);
 9     private int op;
10     static int c;//使用者答案
11     int answer;//答案
12     static Scanner in=new Scanner(System.in);
13     
14 public int geta()
15 {
16     return a;
17 }
18 
19 public void seta(int a)
20 {
21     this.a = a;
22 }
23 
24 public int getb()
25 {
26     return b;
27 }
28 
29 public void setb(int b)
30 {
31     this.b = b;
32 }
33 
34 public int getaswer()
35 {
36     return answer;
37 }
38 public Expression()
39 {
40     answer = a+b;
41 }
42 public static void main(String[] args){
43     int answer;
44     Expression expression = new Expression();
45     
46     answer = expression.answer;
47     Input input = new Input();
48     Expression.c = input.a;
49     /*try{
50         Expression.c = in.nextInt();
51     }
52     catch(InputMismatchException e)
53     {   System.err.println("\n錯誤!  ,請你輸入一個整數");
54     }*/
55     if(answer==c)
56     {
57         System.out.print("答對了");
58     }
59     else System.out.print("答錯了");
60     //System.out.print("answer="+answer);
61 }
62 }
Expression

 

執行截圖如下:

 

 

 

個人體會:

  終於到了這個版塊了。每次寫作業報告我都特別喜歡這個版塊,能夠暢所欲言,為自己代言。哈哈,廢話不多說了,還是說點有用的吧。

  Duang!

  1、前幾天和鄭童鞋做宿舍裡面討論何謂封裝,何謂單元測試,要怎麼樣去做這次作業的第一個階段的。雖然討論完了都斷網了,不能玩遊戲。但是,真的有充實的感覺,沒有玩遊戲也沒關係,因為學習到了東西。而且和鄭童鞋一起討論交流感覺很愉快,沒有爭吵,不過不知道下個階段會不會爭吵,不過為了知識而爭吵,也是蠻不錯的,很期待,到時候專門更新“做漢堡”來給鄭童鞋做個好吃的漢堡好了。等著我,小斌斌。

  2、知道今天,我才發現了其實我們之前討論的封裝沒有討論到它的核心思想。前面都有提到封裝的概念、作用、步驟等等,我就不多說了。我覺得封裝就是把屬性隱藏,不對外分享。外部要訪問只能通過方法。所以每個屬性都應該有一對get,set方法。就好比如你有一座房子,房子裡面的裝飾,傢俱什麼的都隨你擺放,別人不能夠懂你的任何東西,因為他們沒有鑰匙開啟你的門,但是他們可以通過視窗來看到你裡面的擺設。所以一定得留個視窗給別人,不然就會沒意義了哦。

ps: 其實封裝的概念很廣的,助教的那個Code類有爭議,有人說沒有資訊隱藏(沒有定義私有化的變數),所以嚴格不算是封裝,但是有人說它定義了對外介面(公共方法),這樣也算是封裝。嗯,不用糾結概念的。過幾天貼一篇關於“封裝”的博文出來,有興趣的小夥伴可以關注哦!

  3、自定義異常類很好玩啊。哈哈。第三點我只是想表達這個!至於怎麼去定義自定義類什麼的教程,請看

 

     Java自定義異常 

  4.好充實的一天,寫了一天的部落格。痛並快樂著。

  5.對小斌斌說的話:下一個階段的工作可能會複雜那麼一點,但是我相信你,相信我們,相信我。我們會做得更好的,一起加油。

感覺這次的作業報告廢話好多啊。哇哈哈。Happying~~~

 

 

 

---------此次的作業報告到此結束,謝謝老師審閱------------

 

--------如果以上有什麼錯誤或者不足之處,歡迎指出。--------

 

PS:長期招募小夥伴一起組成一個團隊學習軟體開發(java), 可以合作開發軟體,也可以討論交流,有志同道合的小夥伴可以發站內訊息。

 

 

相關文章