wordcount第四周小組作業
一、小組GitHub地址
https://github.com/muzhailong/wcPro.git二、PSP表格
PSP2.1 |
PSP階段 |
預估耗時 (分鐘) |
實際耗時 (分鐘) |
Planning |
計劃 |
30 |
30 |
· Estimate |
· 估計這個任務需要多少時間 |
20 |
20 |
Development |
開發 |
480 |
480 |
· Analysis |
· 需求分析 (包括學習新技術) |
30 |
30 |
· Design Spec |
· 生成設計文檔 |
30 |
30 |
· Design Review |
· 設計復審 (和同事審核設計文檔) |
30 |
30 |
· Coding Standard |
· 代碼規範 (為目前的開發制定合適的規範) |
20 |
30 |
· Design |
· 具體設計 |
30 |
30 |
· Coding |
· 具體編碼 |
240 |
240 |
· Code Review |
· 代碼復審 |
30 |
30 |
· Test |
· 測試(自我測試,修改代碼,提交修改) |
180 |
240 |
Reporting |
報告 |
90 |
90 |
· Test Report |
· 測試報告 |
60 |
60 |
· Size Measurement |
· 計算工作量 |
30 |
30 |
· Postmortem & Process Improvement Plan |
· 事後總結, 並提出過程改進計劃 |
30 |
30 |
三、模塊編寫和測試
這次的小組作業我負責的是UI和util類。
3.1 UI設計
功能:實現一個方便交互的UI。
實現:這個就比較簡單,這裏采用了文件選擇器,可以很方便的制作一個UI界面。
1 package com.ui; 2 import java.io.File; 3 import javax.swing.JFileChooser;4 5 /** 6 * ui界面模塊類 7 * @author wangyuzhe 8 * 9 */ 10 public class WordSelector { 11 /** 12 * 文件選擇器 13 */ 14 JFileChooser jfc = new JFileChooser(); 15 16 /** 17 * 設置界面ui 18 */ 19 public WordSelector() { 20 jfc.setCurrentDirectory(new File("c:\\")); 21 22 } 23 /** 24 * @return 使用ui界面選擇的文件 25 */ 26 public File select() { 27 jfc.setFileSelectionMode(0); 28 int state = jfc.showOpenDialog(null); 29 if (state == 1) { 30 return null; 31 } else { 32 return jfc.getSelectedFile(); 33 } 34 } 35 }
3.2 util設計
功能:生成隨機的文件供測試使用
實現:這裏是對於指定的文件(如果不存在會自動新建)和給定一個文件大小進行操作,下面的代碼中文件大小設置成了1KB,然後產生的隨機文件。文件內的所有字符均是符合作業要求的字符,即英文大小寫字母、數字和常用字符。
1 package com.util; 2 3 import java.io.BufferedWriter; 4 import java.io.File; 5 import java.io.FileWriter; 6 import java.io.IOException; 7 import java.util.Random; 8 9 /** 10 * 工具類 11 * @author wangyuzhe 12 * 13 */ 14 public class Utils { 15 16 private Utils() { 17 } 18 19 /** 20 * 隨機數類 21 */ 22 private static Random random = new Random(); 23 /** 24 * 合法字符集合 25 */ 26 private static String str = "abcddefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~`!" 27 + "#%^&*_…()[]+=-:‘\"|<>,./? \n\t\r0123456789"; 28 29 /** 30 * @param fn 文件名 31 * @param sz 文件的大小 單位字節 32 */ 33 public static void randomFile(String fn, int sz) { 34 File f = new File(fn); 35 StringBuilder sb = new StringBuilder(sz * 2 / 3); 36 BufferedWriter writer = null; 37 try { 38 writer = new BufferedWriter(new FileWriter(f)); 39 char c = 0; 40 int len = str.length(); 41 for (int i = 0; i < sz; ++i) { 42 c = str.charAt(random.nextInt(len)); 43 sb.append(c); 44 } 45 writer.write(sb.toString()); 46 } catch (IOException e) { 47 e.printStackTrace(); 48 } finally { 49 try { 50 writer.close(); 51 } catch (IOException e) { 52 e.printStackTrace(); 53 } 54 } 55 } 56 57 /** 58 * 測試生成隨機文件 59 * @param args 命令參數 60 */ 61 public static void main(String[] args) { 62 String fn="1.txt"; 63 int sz=1024*1;// 1k 64 randomFile(fn,sz); 65 } 66 }
四、測試設計過程
需要實現的目標:UI類:可以正確的與用戶交互即可。
util類:正確運行,且運行時間不應過長;
生成的文件中,所包含的字符應是屬於3.2中str字符串中的某一個字符,即要滿足作業的要求;
同時要保證生成的文件內容是隨機的,這樣用於測試其他的模塊可以保證實驗結果的隨機性與正確性。
本模塊需要測試的內容並不是很多。
對於UI界面,文件選擇器的使用十分方便;
對於工具類,在該方法可以正確運行的情況下,我們只需要通過判斷生成的文件的內容就可以得出結果。
五、開發規範說明
開發規範采用的是《阿裏巴巴Java開發手冊終極版v1.3.0.pdf》
選定的開發規範:
常量定義
1. 【強制】不允許任何魔法值(即未經定義的常量)直接出現在代碼中。
2. 【強制】long 或者 Long 初始賦值時,使用大寫的 L,不能是小寫的 l,小寫容易跟數字 1 混 淆,造成誤解。
3. 【推薦】不要使用一個常量類維護所有常量,按常量功能進行歸類,分開維護。 說明:大而全的常量類,非得使用查找功能才能定位到修改的常量,不利於理解和維護。
代碼格式
1. 【強制】大括號的使用約定。如果是大括號內為空,則簡潔地寫成{}即可,不需要換行;如果 是非空代碼塊則:
1) 左大括號前不換行。
2) 左大括號後換行。
3) 右大括號前換行。
4) 右大括號後還有 else 等代碼則不換行;表示終止的右大括號後必須換行。
2. 【強制】 左小括號和字符之間不出現空格;同樣,右小括號和字符之間也不出現空格。
3. 【強制】if/for/while/switch/do 等保留字與括號之間都必須加空格。
4. 【強制】任何二目、三目運算符的左右兩邊都需要加一個空格。
5. 【強制】采用 4 個空格縮進,禁止使用 tab 字符。
6. 【強制】註釋的雙斜線與註釋內容之間有且僅有一個空格。
7. 【強制】方法參數在定義和傳入時,多個參數逗號後邊必須加空格。
OOP 規約
1. 【強制】避免通過一個類的對象引用訪問此類的靜態變量或靜態方法,無謂增加編譯器解析成 本,直接用類名來訪問即可。
2. 【強制】所有的覆寫方法,必須加@Override 註解。
3. 【強制】不能使用過時的類或方法。
4. 【強制】構造方法裏面禁止加入任何業務邏輯,如果有初始化邏輯,請放在 init 方法中。
5. 【推薦】循環體內,字符串的連接方式,使用 StringBuilder 的 append 方法進行擴展。
6. 【推薦】類成員與方法訪問控制從嚴:
1) 如果不允許外部直接通過 new 來創建對象,那麽構造方法必須是 private。
2) 工具類不允許有 public 或 default 構造方法。
3) 類非 static 成員變量並且與子類共享,必須是 protected。
4) 類非 static 成員變量並且僅在本類使用,必須是 private。
5) 類 static 成員變量如果僅在本類使用,必須是 private。
6) 若是 static 成員變量,必須考慮是否為 final。
7) 類成員方法只供類內部調用,必須是 private。
8) 類成員方法只對繼承類公開,那麽限制為 protected。
集合處理
1. 【推薦】集合初始化時,指定集合初始值大小。
2. 【推薦】使用 entrySet 遍歷 Map 類集合 KV,而不是 keySet 方式進行遍歷。
六、交叉代碼評審
對於17056同學的代碼評審:
以我的水平的來說的話,他的代碼都是很優秀的那種,非常值得我去學習。如果真要說問題的話,正如他自己所說:為了測試,他的類全是public那種。
七、作業小結
由於是小組作業,每個人都有具體的分工,也都完成了自己的任務,各得其所,也是很棒的。
在每個成員遇到困難的時候也可以尋求隊友的幫助,也是一種非常好的團隊體驗。
wordcount第四周小組作業