第四周作业 wcPro
1、github地址
https://github.com/ChAnYaNG97/wcPro.git
2、psp表格
| Planning | 計劃 | 25 | 30 |
| · Estimate | · 估計這個任務需要多少時間 | 30 | 40 |
| Development | 開發 | 60 | 70 |
| · Analysis | · 需求分析 (包括學習新技術) | 60 | 60 |
| · Design Spec | · 生成設計文檔 | 10 | 10 |
| · Design Review | · 設計復審 (和同事審核設計文檔) | 40 | 45 |
| · Coding Standard | · 代碼規范 (為目前的開發制定合適的規范) | 30 | 30 |
| · Design | · 具體設計 | 40 | 40 |
| · Coding | · 具體編碼 | 100 | 120 |
| · Code Review | · 代碼復審 | 60 | 60 |
| · Test | · 測試(自我測試,修改代碼,提交修改) | 120 | 180 |
| Reporting | 報告 | 60 | 60 |
| · Test Report | · 測試報告 | 60 | 70 |
| · Size Measurement | · 計算工作量 | 100 | 90 |
| · Postmortem & Process Improvement Plan | · 事后總結, 并提出過程改進計劃 | 30 | 20 |
| 合計 | 627 | 865 |
3、接口設計
3.1 輸入輸出
提供的接口:
IOController(String fileName) IOController類的自定義構造函數,需要傳入String類型的fileName參數String readLine() 即每次調用都會返回文件的一行void writeFile(HashMap<String, Integer> wordMap) 傳入一個HashMap,將結果按照要求寫入到文件中3.2 詞頻統計
提供的接口:
void countWord(String input) 傳入String類型的參數input,統計input中單詞的數量,并存入HashMap中4、測試設計
4.1 白盒測試
因為是使用正則表達式來對單詞進行匹配,沒有使用詞法分析,所以程序結構簡單,沒有太多分支。
| case.txt(單詞數小于100) | 將統計好的單詞詞頻寫入result.txt | 正確寫入文件 |
| case2.txt(單詞數大于100) | 將統計好的前100個單詞詞頻寫入result.txt | 正確寫入文件 |
| case2.c | "wrong file format!" | "wrong file format!" |
4.2 黑盒測試
4.2.1 首先是對WordCounter類的測試
| 等價類1 | 無連字符,無常見字符和數字 |
| 等價類2 | 無連字符,帶常見字符和數字 |
| 等價類3 | 帶連字符,無常見字符和數字 |
| 等價類4 | 帶連字符且位于單詞間,無常見字符和數字 |
| 等價類5 | 帶連字符且位于單詞后,無常見字符和數字 |
| 等價類6 | 帶連字符且位于數字間,無常見字符 |
| 等價類7 | 帶兩個連字符且位于單詞后,無常見字符和數字 |
| 等價類8 | 帶連字符,帶常見字符和數字 |
| 等價類9 | 輸入為空 |
4.2.2 對IOControllerTest的測試類
public class IOControllerTest {@Testpublic void testReadLine(){IOController input = new IOController("case2.txt");String line = input.readLine();String expected = "a-b-c f s d d";assertEquals(expected, line);}@Testpublic void testWriteFile(){HashMap<String, Integer> map = new HashMap<>();IOController input = new IOController("result.txt");map.put("k",1);input.writeFile(map);String result = input.readLine();String expected = "k 1";assertEquals(expected, result);} }5、測試運行
6、開發規范說明(擴展任務)
選定的開發規范是阿里巴巴的Java開發規范,參考資料為《阿里巴巴Java開發手冊》,具體可見第8部分的說明。
7、交叉代碼評審(擴展任務)
說明代碼評審對象,分析結論清晰,有理有據。
8、靜態代碼掃描(擴展任務)
使用的掃描工具是Alibaba Java Coding Guidelines,下載地址https://github.com/alibaba/p3c
運行截圖
分析掃描結果
1.正則表達式的預編譯問題
改進前的寫法:
void countWord(String input) {...Pattern wordPattern = Pattern.compile("[a-zA-Z]+(-[a-zA-Z]+)*-?");Matcher m = wordPattern.matcher(input);... }這種寫法存在的問題是:每調用一次countWord()函數,都會編譯一次正則表達式,產生了很多不必要的開銷。而且通過查閱資料,還了解到正則表達式需要使用預編譯來提高效率。
改進后的寫法:
public Class WordCounter {...private static Pattern WORD_PATTERN = Pattern.compile("[a-zA-Z]+(-[a-zA-Z]+)*-?");void countWord(String input){...Matcher m = WORD_PATTERN.matcher(input);...}... }2.if/else/while/do一行語句的大括號問題
大括號這種東西,從代碼易讀性,出bug的可能性,調試難易度上來說,都是需要加的。
不加大括號,代碼修改的時候,如果需要在if語句中插入若干代碼,則必須記著加上括號,忘掉則是bug;不加括號的話,設置斷點比較麻煩,單步執行也不太容易看到是否執行到了if語句內部;加上絕對沒有任何壞處,但是不加,就有可能造成問題(轉載自知乎https://www.zhihu.com/question/37578053/answer/72753923來源:知乎著作權歸作者所有)
所以我就直接按照規范進行了修改
3.所有的類都要添加創建者信息:也是話不多說,直接加上了。創建者信息無論是對于代碼審查還是代碼重構,都更容易將功能和開發者對應起來。
修改之后的運行截圖
9.性能測試與優化(高級任務)
我們小組使用了big_case.txt文件進行性能測試,文件大小為24.8M,行數為8246行
以下是運行結果:
我們分析了之后覺得主要開銷應該在兩個方面
1.I/O時間
2.詞頻統計時間
對于這兩個時間的權衡問題,我們進行了以下分析:
因為輸出的文本量并不大,輸出時間耗時影響很小,瓶頸應該是輸入時間。我們采用了兩種方法:第一種是將輸入文本全部讀入內存的字符數組中,并直接在字符數組中進行詞頻統計,這樣的優點是I/O次數較少,缺點是內存占用量太大,而且在詞頻分析時開銷也因數組規模太大而增大。第二種是每次只讀一行,并對這一行進行詞頻統計,循環該步驟,直到讀到文本的末尾,這種方法的優點是內存占用少,每次統計的開銷較小,缺點是I/O次數較多,更新數據的次數也更多。我們嘗試了兩種方法并編碼進行了對比,最終選擇執行時間較少的第二種方法。
10. 小組貢獻
0.3
轉載于:https://www.cnblogs.com/liuqianx/p/8748089.html
總結
以上是生活随笔為你收集整理的第四周作业 wcPro的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中二维数组的建立,输入和输出
- 下一篇: DIV水平方向居中的几种方法