Java 入門指南

單元 15 - 繼續測試

~~學習進度表~~

軟體生命週期 (software life cycle) 分成三大階段,開發 (development) 、使用 (use) 、修改 (modification) ,接下來便是使用、修改的無限循環

Development
⇓
Use
⇓
Modification

開發階段,自然免不了對需求的分析 (analysis) ,然後設計 (design) 、建置 (implement) ,接著進行測試 (testing)

Analysis
⇓
Design
⇓
Implement
⇓
Test

其實這順序沒有絕對,「設計」與「建置」可能只是先做個簡單版本,「測試」與「使用」說到底都是實際執行後觀察結果,「修改」等於以之前的基礎再次「設計」與重新「建置」。

我們打算開發的 Encrypt 類別 (class) 的需求已經很清楚,也就是產生一個英文小寫字母的對照字元陣列 (array) ,我們用 code 屬性 (field) 儲存這個陣列,然後以 setCode() 方法 (method) 建立這個陣列。

上個單元中,我們將 a 設定為 3 , b 設定為 5 ,順利的跑出一個英文小寫字母的對照,現在我們希望把 a 、 b 設定成 0 到 9 之間的隨機整數,這該怎麼做呢?簡單講,就是要有個產生隨機整數的方式,還好 API 中已經有相關程式供我們直接使用,因此我們不需要自己重頭開發。

API 中 Math 類別的 random() 方法可產生小於 0 的隨機浮點數,我們將其乘以 10 ,然後強制轉換型態為 int ,便可使 a 與 b 得到 0 到 9 的隨機整數。

我們將 Encrypt02 改成 Encrypt03 來測試,程式如下

/*
 * 檔名:Encrypt03.java
 * 作者:張凱慶
 * 網站:http://kaiching.org
 */
 package encrypt03;
 
 public class Encrypt03 {
    // 密碼表字元陣列
    private char[] code = new char[26];
    
    // 建構子
    public Encrypt03() {
        setCode();
    }
    
    // setter
    public void setCode() {
        int a = 0;
        int b = 0;
        
        a = (int) (Math.random() * 10);
        b = (int) (Math.random() * 10);
        
        int x, y, m, i;
        char c = 'a';
        for (i = 0; i < 26; i++) {
            x = c;
            y = x * a + b;
            m = y % 26;
            code[i] = (char) (m + 97);
            c++;
        }
    }
    
    // getter
    public char[] getCode() {
        return code;
    }
    
    // 編碼的方法
    public String toEncode(String s) {
        return s;
    }
    
    // 解碼的方法
    public String toDecode(String s) {
        return s;
    }
    
    // 測試的 main()
    public static void main(String[] args) {
        for (int i = 0; i < 20; i++) {
            Encrypt03 e = new Encrypt03();
            System.out.println(e.getCode());
        }
        //String s = "There is no spoon";
        //System.out.println(s);
        //String s1 = e.toEncode(s);
        //System.out.println(s1);
        //String s2 = e.toDecode(s1);
        //System.out.println(s2);
    }
}

Math 中的 random() 是 static 方法,因此是直接由 Math 呼叫

a = (int) (Math.random() * 10);
b = (int) (Math.random() * 10);

這樣 a 跟 b 就會得到 0 到 9 任意的隨機整數,我們將測試的 main() 加入迴圈,一次印出多個密碼表來看

// 測試的 main()
public static void main(String[] args) {
    for (int i = 0; i < 20; i++) {
        Encrypt03 e = new Encrypt03();
        System.out.println(e.getCode());
    }
    //String s = "There is no spoon";
    //System.out.println(s);
    //String s1 = e.toEncode(s);
    //System.out.println(s1);
    //String s2 = e.toDecode(s1);
    //System.out.println(s2);
}

我們用迴圈一次印出 20 個密碼表,其中有些原本的程式碼加上兩條斜線

//String s = "There is no spoon";
//System.out.println(s);
//String s1 = e.toEncode(s);
//System.out.println(s1);
//String s2 = e.toDecode(s1);
//System.out.println(s2);

這是註解化,使原本的程式碼變成註解 (comment) ,因此這部份的程式碼不會被執行。來編譯測試看看囉

iloruxadgjmpsvybehknqtwzcf
prtvxzbdfhjlnprtvxzbdfhjln
qsuwyacegikmoqsuwyacegikmo
rajsbktcludmvenwfoxgpyhqzi
jqxelszgnubipwdkryfmtahovc
mtahovcjqxelszgnubipwdkryf
emucksaiqygowemucksaiqygow
lszgnubipwdkryfmtahovcjqxe
xyzabcdefghijklmnopqrstuvw
mtahovcjqxelszgnubipwdkryf
iloruxadgjmpsvybehknqtwzcf
zhpxfnvdltbjrzhpxfnvdltbjr
qzirajsbktcludmvenwfoxgpyh
qzirajsbktcludmvenwfoxgpyh
iloruxadgjmpsvybehknqtwzcf
cgkoswaeimquycgkoswaeimquy
cccccccccccccccccccccccccc
vxzbdfhjlnprtvxzbdfhjlnprt
abcdefghijklmnopqrstuvwxyz
hknqtwzcfiloruxadgjmpsvybe

註解化是程式設計的一個小技巧,可先測試未註解化的程式碼,這裡使用註解化的原因是不想執行註解化的程式碼。

居然有一行都是 'c' ,有些是我們要的密碼表沒錯,有一些則不是,那表示我們所用的數學公式有問題,接下來要先修正數學公式。

相關教學影片

上一頁 單元 14 - 實作 setCode()
回 Java 入門指南首頁
下一頁 單元 16 - 修正後的數學公式
回 Java 教材首頁
回程式語言教材首頁
中英文術語對照
analysis分析
array陣列
class類別
comment註解
design設計
development開發
field屬性
implement建置
method方法
modification修改
software life cycle軟體生命週期
testing測試
use使用
參考資料
1. The Java™ Tutorials: Declaring Classes
2. The Java™ Tutorials: Declaring Member Variables
3. The Java™ Tutorials: Defining Methods
4. The Java™ Tutorials: Providing Constructors for Your Classes
5. The Java™ Tutorials: Returning a Value from a Method
6. The Java™ Tutorials: Using the this Keyword
7. The Java™ Tutorials: Controlling Access to Members of a Class
8. The Java™ Tutorials: Understanding Class Members
9. The Java™ Tutorials: Initializing Fields
10. The Java™ Tutorials: Beyond Basic Arithmetic
重點整理
1. 軟體的生命週期分成開發、使用、修改三大階段。
2. 開發階段就是對需求分析,然後設計、建置、測試等等。
3. Java API 中 Math 的 random() 回傳小於 0 的隨機浮點數。
4. 設計、建置完軟體的初始版本就進行測試,如果有問題,就重新檢視設計, Encrypt 的數學公式有問題,因此要研究問題出在哪,再回頭修改程式。
問題與討論
1. 軟體的生命週期分成哪些階段?
2. 設計軟體的時候,該不該重視使用者的體驗經驗?
3. 想一想, Encrypt 的數學公式問題可能發生在哪裡?該如何修正呢?
練習
1. 承接上一個單元的猜數字遊戲,將新專案寫在 Exercise1501 中,把測試答案的部份寫在 Guess 類別的 test() 方法裡,結果回傳布林值。
2. 承上題,建立新專案 Exercise1502 ,在 Guess 類別設計一個 ABCounter() 方法計算 A 、 B 值, A 、 B 值,用屬性記錄,若使用者沒用猜對就印出A 、 B 值。
3. 承上題,加入迴圈直到使用者猜對答案為止,將新專案寫在 Exercise1503 中。