1、
結對使用的Github項目地址 | https://github.com/Cherish599/WordCount.git |
作業地址 | https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2/homework/2879 |
結對伙伴的作業地址 |
2、我這次結對編程是和我室友胡楊帥一起進行的。我主要負責代碼的編寫部分,他負責測試部分。
PSP表格
PSP2.1 |
Personal Software Process Stages |
預估耗時(分鍾) |
實際耗時(分鍾) |
Planning |
計划 |
20 | 22 |
· Estimate |
· 估計這個任務需要多少時間 |
||
Development |
開發 |
270 | 320 |
· Analysis |
· 需求分析 (包括學習新技術) |
20 | 20 |
· Design Spec |
· 生成設計文檔 |
||
· Design Review |
· 設計復審 (和同事審核設計文檔) |
||
· Coding Standard |
· 代碼規范 (為目前的開發制定合適的規范) |
20 | 20 |
· Design |
· 具體設計 |
||
· Coding |
· 具體編碼 |
240 | 260 |
· Code Review |
· 代碼復審 |
20 | 25 |
· Test |
· 測試(自我測試,修改代碼,提交修改) |
20 | 20 |
Reporting |
報告 |
||
· Test Report |
· 測試報告 |
10 | 10 |
· Size Measurement |
· 計算工作量 |
||
· Postmortem & Process Improvement Plan |
· 事后總結, 並提出過程改進計划 |
20 | 15 |
合計 |
400 | 432 |
3、計算模塊接口的設計與實現過程:
首先,我們倆先對這個項目進行了分工。我主要負責代代碼編寫這一塊。經過我們倆的討論,我們倆列出了一個程序的整體框架。對於程序的基本功能部分,由於比較簡單,實現起來也不復雜。就分別寫了幾個函數,然后在Main()函數中調用即可。如下圖所示:
對於解題思路:
在CountChars()這個函數中,我們把整個文檔遍歷了一遍,然后篩選每個Ascii碼字符,並統計總的字符個數;
在Countlines()這個函數中,我們統計文章中的換行符,每統計一個,lines++;
在CountWords()這個函數中,我們先去掉了文檔中的所有的特殊符號,然后把所有的字符轉換成了小寫,這樣就不用區分大小寫的問題了,然后遍歷以空格來分隔每個單詞;最后看每個單詞是否至少以4個英文字母開頭,跟上字母數字符號,如果滿足條件,words++;
在CoutWords()這個函數中,因為要輸出的是單詞出現的頻率,並且要輸出前幾個出現頻率最高的單詞和相應的頻率,因為之前我做過相同功能的程序,上次做的就是用的字典類型,所以這次做這個功能有點經驗。至於排序的問題,我之前是寫了一個排序的方法,不過這次我了解到,原來C#的字典類型中有自帶的排序的方法,這次就直接用了自帶的方法。比上次實現好了很多。
我們使用了著名的戲劇作品《哈姆雷特》英文版作為測試。運行結果如下:
接下來就是作業的第二個要求,用一個接口來封裝不同功能的函數:
1 interface library 2 { 3 string ReadFile(string path); //用於打開文件 4 int CountChars(string text); //用於統計文檔中的字符個數 5 int CountLines(string text); //用於統計文檔行數 6 int CountWords(string Text); //用於統計文檔中單詞的個數 7 Dictionary<string, int> Countphrase(string text, int n); //用於統計文檔中的短語的頻率 8 Dictionary<string, int> CoutWords(string text, int n); //用於統計文檔中的單詞的頻率 9 void WreteFile(string path); //用於創建一個文件,將統計結果保存在文件中 10 11 }
在第二步的基礎上,我們便開始了第三個要求的編碼。第三個要求是在cmd命令行中傳入參數,然后按照不同的參數,實現不同的功能。並且在第一步的基礎上增加了詞組統計和自定義輸出兩個新的功能。詞組的統計其實是和單詞的統計是差不多的,還是要用到字典類型。我在Countphrase()中新增了一個數組,用來記錄每一定長度的詞組,然后統計它出現的頻率。至於自定義輸出功能,是比較簡單的文件操作,就不在詳細說明了。
同樣選著名戲劇作品《哈姆雷特》英文版,運行結果如下:(由於文本較長,沒有將所有的詞組全部截屏)
4、代碼規范與代碼復審過程 :
當我寫完代碼給胡楊帥看的時候,他看了之后給我提了幾個意見。第一個就是代碼空的行數太多的問題,使得代碼看起來不怎么美觀;其次就是代碼的命名有一些不妥,尤其體現在變量名的命名上面。就像這樣:
之后我對所有的代碼進行了規范,嚴格按照鄒欣老師書中的代碼規范與代碼復審的方法,把所有的代碼都改了一遍。
5、 測試運行通過:
測試部分由胡楊帥完成
單元測試:(這次我們倆測試了幾個重要的函數,可以看到全部通過)
性能測試:
從上面的分析可以看到主程序和CoutWords()這個函數所消耗的CPU是最大的。這個也可以理解,一方面是因為CoutWords()這個函數是用來統計hamlet.txt中的所有單詞的出現頻率的,要不停的遍歷整個文檔,並且這個函數用到了字典類型。我暫時還沒有想到更佳的優化方法。另一方面是因為hamlet.txt中有着數萬個的單詞,本身單詞數量比較多。
6、git提交部分:(有了以上一次的經驗之后,對git的使用相對還是比較熟練了)
這是對基礎功能部分的提交:
這是增加新功能的一部分的提交:
7、總結:
結對編程確實能夠在一定程度上提高兩個人編程的效率。提高了更好的設計質量,畢竟兩個人考慮的要比一個人全面一點。不過由於是第一次結對編程,我們倆在配合的過程中還出現了一點問題,比如說溝通方面的問題,有時候會為了一個不一致的意見爭論半天。總體來說,本次結對編程還是比較成功的,確實是1+1>2。