PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | ||
· Estimate | 估計這個任務須要多少時間 | 900 | 935 |
Development | 開發 | ||
· Analysis | · 需求分析 (包括學習新技術) | 360 | 120 |
· Design Spec | · 生成設計文檔 | 0 | 0 |
· Design Review | · 設計複審 (和同事審覈設計文檔) | 0 | 0 |
· Coding Standard | · 代碼規範 (爲目前的開發制定合適的規範) | 0 | |
· Design | · 具體設計 | 30 | 20 |
· Coding | · 具體編碼 | 300 | 480 |
· Code Review | · 代碼複審 | 120 | 180 |
· Test | · 測試(自我測試,修改代碼,提交修改) | 180 | 120 |
Reporting | 報告 | ||
· Test Report | · 測試報告 | 5 | 5 |
· Size Measurement | · 計算工做量 | 5 | 5 |
· Postmortem & Process Improvement Plan | · 過後總結, 並提出過程改進計劃 | 0 | 5 |
合計 | 1000 | 935 |
在設計之初,考慮到爲下降代碼單元的耦合度,咱們將需求簡單拆分爲3個類,分別是輸入,輸出,和單詞處理。使各個代碼單元之間的耦合度儘可能最低,不須要與其餘代碼糾纏不清。將類封裝,數據以接口的形式傳入。git
在最初分析需求時,咱們將代碼分紅4個類,分別是負責輸入數據的input,輸出須要數據的output,對需求處理的wordHandler,和統合的main。
input類含函數:FIleInput(); 用於提取文件中的單詞信息。
output類含函數:_output(); 用於輸出要求的計算結果數據。
wordHandler類含函數:get_chain_word(); 用於尋找最多單詞數的最長鏈。
get_chain_char(); 用於尋找最多字母數的最長鏈。
這三個類每一個類都是很獨立的代碼單元,三者間並無什麼關係,使得程序的耦合度很低。github
算法的關鍵是:蠻力求解。算法
UML圖
編程
計算模塊接口部分的性能改進
由於查找的最長鏈爲無序數組,因此在進行查找比較時並沒有優化可說,查找的時間複雜度仍未O(n)。
數組
這促使咱們組在結對工做時按時按點準時開始工做,每次工做都儘可能不拖延按時完成計劃好的工做進度。app
TEST_METHOD(TestMethod1) { FileInput fin; fin.readFile("D:\\word_chain\\01.txt"); wordHandler wh(fin); char *words[20]; vector<string> result; wh.gen_chain_word(words, 0, result, 0, 0, false); Assert::IsTrue(result.at(0) == "apple"); Assert::IsTrue(result.at(1) == "elephant"); Assert::IsTrue(result.at(2) == "toad"); } TEST_METHOD(TestMethod2) { FileInput fin; fin.readFile("D:\\word_chain\\02.txt"); wordHandler wh(fin); char *words[20]; vector<string> result; wh.gen_chain_char(words, 0, result, 0, 0, false); Assert::IsTrue(result.at(0) == "pseudonym"); Assert::IsTrue(result.at(1) == "moon"); }
測試數據
在測試數據上,咱們除了邊界數據和錯誤數據外,還測試了以同一單詞重複出現的狀況函數
測試覆蓋率截圖
性能
按指導書中的命令行參數,設計瞭解釋程序。如出現'-r',則將對應的bool型變量置爲true,'-h'則按順序讀入下一個命令行參數,將其複製給char型變量,'-t'同上。'-w'先按順序讀入下一命令行參數做爲文件路徑,調用gen_chain_word()接口;'-c'同上,不一樣在於調用gen_chain_char()接口。讀到文件路徑後完成對命令行的解析。單元測試
while (true) { con = false; switch (ptr[1]) { case 'r': recur = true; con = true; break; case 'h': ptr++; head = *ptr; con = true; break; case 't': ptr++; tail = *ptr; con = true; break; case 'w': fun = 'w'; break; case 'c': fun = 'c'; break; default: break; } if (con) { i++; ptr = argv[i]; continue; } else { break; } } try { fin.readFile(argv[i + 1]); } catch (FINException& fine) { fine.what(); return 0; } if (fun == 'w') { wordHandler whword(fin); whword.gen_chain_word(_words, _len, result, head, tail, recur); } else if (fun == 'c') { wordHandler whchar(fin); whchar.gen_chain_char(_words, _len, result, head, tail, recur); } else { cout << "Invalid command!" << endl; }
兩我的結對編程有助於提高代碼質量,隨時複審,能儘早發現和解決一些問題,兩我的能夠拓寬思路,避免一我的陷入死衚衕。
學習