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

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

我們將 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);

這樣 ab 就會得到 09 任意的隨機整數,我們將測試的 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 中 Mathrandom() 回傳小於 0 的隨機浮點數。
4. 設計、建置完軟體的初始版本就進行測試,如果有問題,就重新檢視設計, Encrypt 的數學公式有問題,因此要研究問題出在哪,再回頭修改程式。
問題與討論
1. 軟體的生命週期分成哪些階段?
2. 設計軟體的時候,該不該重視使用者的體驗經驗?
3. 想一想, Encrypt 的數學公式問題可能發生在哪裡?該如何修正呢?
練習
1. 承接上一個單元的猜數字遊戲,將新專案寫在 Exercise1501 中,把測試答案的部份寫在 Guess 類別的 test() 方法裡,結果回傳布林值。
2. 承上題,建立新專案 Exercise1502 ,在 Guess 類別設計一個 ABCounter() 方法計算 AB 值, AB 值,用屬性記錄,若使用者沒用猜對就印出AB 值。
3. 承上題,加入迴圈直到使用者猜對答案為止,將新專案寫在 Exercise1503 中。