Java 入門指南 V2.00 - 單元 15 - 繼續測試




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



開發階段,自然免不了對需求的分析 (analysis) ,然後設計 (design) 、建置 (implement) ,接著進行測試 (testing) ,其實這順序沒有絕對,「設計」與「建置」可能只是先做個簡單版本,「測試」與「使用」說到底都是實際執行後觀察結果,「修改」等於以之前的基礎再次「設計」與重新「建置」。


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


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


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


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


001public class Encrypt03 {
002   // 密碼表字元陣列
003   private char[] code = new char[26];
004
005   // 建構子
006   public Encrypt03() {
007      setCode();
008   }
009
010   // setter
011   public void setCode() {
012      int a = 0;
013      int b = 0;
014
015      a = (int) (Math.random() * 10);
016      b = (int) (Math.random() * 10);
017
018      int x, y, m, i;
019      char c = 'a';
020      for (i = 0; i < 26; i++) {
021         x = c;
022         y = x * a + b;
023         m = y % 26;
024         code[i] = (char) (m + 97);
025         c++;
026      }
027   }
028
029   // getter
030   public char[] getCode() {
031      return code;
032   }
033
034   // 編碼的方法
035   public String toEncode(String s) {
036      return s;
037   }
038
039   // 解碼的方法
040   public String toDecode(String s) {
041      return s;
042   }
043
044   // 測試的 main()
045   public static void main(String[] args) {
046      for (int i = 0; i < 16; i++) {
047         Encrypt03 e = new Encrypt03();
048         System.out.println(e.getCode());
049      }
050      //String s = "There is no spoon";
051      //System.out.println(s);
052      //String s1 = e.toEncode(s);
053      //System.out.println(s1);
054      //String s2 = e.toDecode(s1);
055      //System.out.println(s2);
056   }
057}
058 
059/* 檔名: Encrypt03.java
060   作者: Kaiching Chang
061   時間: September, 2014  */

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


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

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


044// 測試的 main()
045public static void main(String[] args) {
046   for (int i = 0; i < 16; i++) {
047      Encrypt03 e = new Encrypt03();
048      System.out.println(e.getCode());
049   }
050   //String s = "There is no spoon";
051   //System.out.println(s);
052   //String s1 = e.toEncode(s);
053   //System.out.println(s1);
054   //String s2 = e.toDecode(s1);
055   //System.out.println(s2);
056}

我們用迴圈一次印出 16 個密碼表,其中第 50 行到第 55 行都加上兩條斜線


050//String s = "There is no spoon";
051//System.out.println(s);
052//String s1 = e.toEncode(s);
053//System.out.println(s1);
054//String s2 = e.toDecode(s1);
055//System.out.println(s2);

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



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

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


中英文術語對照


軟體生命週期sofeware life cycle
開發development
使用use
修改modification
分析analysis
設計design
建置implement
測試testing
類別class
陣列array
屬性field
方法method
註解comment

重點整理


  1. 軟體生命週期分成開發、使用、修改三大階段,開發階段又包含對需求分析、設計、建置、測試等過程。
  2. Encrypt 類別的需求是產生一個隨機編排的英文小寫字母字元陣列,利用 API 中 Math 類別的 random() 方法取得公式中需要的隨機數。
  3. 註解化使原本的程式碼變成註解,因此不會被執行。


問題與討論


  1. 軟體生命週期分成哪三大階段?每個階段又有哪些重點工作?
  2. 什麼是註解化?註解化對開發程式有什麼幫助?

the end

沒有留言: