軟體生命週期 (sofeware life cycle) 分成三大階段,開發 (development) 、使用 (use) 、修改 (modification) ,接下來便是使用、修改的無限循環
開發階段,自然免不了對需求的分析 (analysis) ,然後設計 (design) 、建置 (implement) ,接著進行測試 (testing) ,其實這順序沒有絕對,「設計」與「建置」可能只是先做個簡單版本,「測試」與「使用」說到底都是實際執行後觀察結果,「修改」等於以之前的基礎再次「設計」與重新「建置」。
我們打算開發的 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 來測試,程式如下
001 | public 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 呼叫
015 | a = (int) (Math.random() * 10); |
016 | b = (int) (Math.random() * 10); |
這樣 a 跟 b 就會得到 0 到 9 任意的隨機整數,我們將測試的 main() 加入迴圈,一次印出多個密碼表來看
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 | } |
我們用迴圈一次印出 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 |
重點整理
- 軟體生命週期分成開發、使用、修改三大階段,開發階段又包含對需求分析、設計、建置、測試等過程。
- Encrypt 類別的需求是產生一個隨機編排的英文小寫字母字元陣列,利用 API 中 Math 類別的 random() 方法取得公式中需要的隨機數。
- 註解化使原本的程式碼變成註解,因此不會被執行。
問題與討論
- 軟體生命週期分成哪三大階段?每個階段又有哪些重點工作?
- 什麼是註解化?註解化對開發程式有什麼幫助?
the end
沒有留言:
張貼留言