日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第四周作业 wcPro

發布時間:2025/7/14 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第四周作业 wcPro 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、github地址

https://github.com/ChAnYaNG97/wcPro.git

2、psp表格

PSP2.1PSP階段預估耗時(分鐘)實際耗時(分鐘)
Planning計劃2530
· Estimate· 估計這個任務需要多少時間3040
Development開發6070
· Analysis· 需求分析 (包括學習新技術)6060
· Design Spec· 生成設計文檔1010
· Design Review· 設計復審 (和同事審核設計文檔)4045
· Coding Standard· 代碼規范 (為目前的開發制定合適的規范)3030
· Design· 具體設計4040
· Coding· 具體編碼100120
· Code Review· 代碼復審6060
· Test· 測試(自我測試,修改代碼,提交修改)120180
Reporting報告6060
· Test Report· 測試報告6070
· Size Measurement· 計算工作量10090
· Postmortem & Process Improvement Plan· 事后總結, 并提出過程改進計劃3020
合計627865

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輸入為空
public class WordCounterTest {WordCounter wc;HashMap<String, Integer> expected;@Beforepublic void before(){wc = new WordCounter();expected = new HashMap<>();}//test1:無連字符,無常見字符和數字@Testpublic void testCountWord1(){wc.countWord("this is a test a a a ");expected.put("this",1);expected.put("is",1);expected.put("a",4);expected.put("test",1);assertEquals(expected, wc.countList);}//test2:無連字符,帶常見字符和數字@Testpublic void testCountWord2(){wc.countWord("this]]'$'is'a123test");expected.put("this",1);expected.put("is",1);expected.put("a",1);expected.put("test",1);assertEquals(expected, wc.countList);}//test3:帶連字符,無常見字符和數字@Testpublic void testCountWord3(){wc.countWord("this-is-a-test is is");expected.put("this-is-a-test",1);expected.put("is",2);assertEquals(expected, wc.countList);}//test4:帶連字符且位于單詞間,無常見字符和數字@Testpublic void testCountWord4(){wc.countWord("this is a test this-is-a-test");expected.put("this",1);expected.put("is",1);expected.put("a",1);expected.put("test",1);expected.put("this-is-a-test",1);assertEquals(expected, wc.countList);}//test5:帶連字符且位于單詞后,無常見字符和數字@Testpublic void testCountWord5(){wc.countWord("this- is a-test");expected.put("this",1);expected.put("is",1);expected.put("a-test",1);assertEquals(expected, wc.countList);}//test6:帶連字符且位于數字間,無常見字符@Testpublic void testCountWord6(){wc.countWord("this is1-2 a-test");expected.put("this",1);expected.put("is",1);expected.put("a-test",1);assertEquals(expected, wc.countList);}//test7:帶連字符,帶常見字符和數字@Testpublic void testCountWord7(){wc.countWord("(see Box 3–2).8885d_c01_016");expected.put("see",1);expected.put("box",1);expected.put("d",1);expected.put("c",1);assertEquals(expected, wc.countList);}//test8:輸入為空@Testpublic void testCountWord8(){wc.countWord("");assertEquals(expected, wc.countList);}//test9:帶兩個連字符的單詞@Testpublic void testCountWord9(){wc.countWord("this is a--simple-test.");expected.put("this",1);expected.put("is",1);expected.put("a",1);expected.put("simple-test",1);assertEquals(expected, wc.countList);} }

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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。