此次結對編程很是榮幸可以和編程大佬羅偉誠組隊。我在羣裏面問了一下有沒有人還沒組隊,而後他就回我了,問我要不要組隊,我說要得,而後咱們就正式結對。肯定結對以後爲了之後更好的溝通合做,咱們先是制定了編碼規範,而後就開始寫代碼,羅偉誠對於編程很是積極,咱們三下五除二就把程序編好了,跟他合做也很是愉快。
1.命名規範:整體採用駝峯命名法,類名首字母大寫,變量和方法名首字母小寫,常量所有大寫,禁止拼音命名。
2.佈局:採用vs自動縮進,大括號不於代碼同行,註釋單獨在一行,位於註釋部分的上方。
3.接口:方法的形參和傳輸的參數命名相同,必要時在上方備註參數類型
4.代碼規範:
適當使用空行,來增長代碼的可讀性
方法的命名,通常將其命名爲動賓短語,一個方法只完成一個任務
經常使用縮進和換行,使代碼層次清晰,明瞭
對泛型進行循壞時,儘可能foreach
縮進和間隔:縮進用TAB,不用 SPACES
註釋需和代碼對齊
避免寫太長的方法。一個典型的方法代碼在1~25行之間。html
PSP2.1 | Personal Software Process Stages | 估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
·Planning | ·計劃 | 40 | 55 |
·Estimate | · 估計這個任務須要多少時間 | 90 | 90 |
·Development | ·開發 | 60 | 75 |
· Analysis | · 需求分析 (包括學習新技術) | 30 | 35 |
· Design Spec | · 生成設計文檔 | 15 | 18 |
· Design Review | · 設計複審 (和同事審覈設計文檔) | 20 | 20 |
· Coding Standard | · 代碼規範 (爲目前的開發制定合適的規範) | 5 | 5 |
· Design | · 具體設計 | 30 | 40 |
· Coding | · 具體編碼 | 120 | 150 |
· Code Review | · 代碼複審 | 40 | 60 |
· Test | · 測試(自我測試,修改代碼,提交修改) | 50 | 70 |
·Reporting | ·報告 | 100 | 120 |
· Test Report | · 測試報告 | 50 | 55 |
· Size Measurement | · 計算工做量 | 20 | 20 |
· Postmortem & Process Improvement Plan | · 過後總結, 並提出過程改進計劃 | 15 | 10 |
___ | 合計 | 685 | 823 |
-對於這種類型的編程我也是第一次接觸,首先百度這種程序該怎麼寫。知道這種程序的寫法後就開始想算法。首先肯定功能,在博客要求中功能已經列舉的很詳細通過咱們整理,主要要如下功能
1.統計文件字符
這個功能比較好實現,由於Windows自帶的函數庫就能夠解決。這個功能的要求是統計全部字符,包括空格,換行,因此咱們只須要讀取文件,把內容轉化爲字符串,而後再用CharactersNum()方法就能夠統計全部的字符數
2.統計單詞數
對於這個功能,咱們首先想到的是計算文本里面的空格數。可是題目要求:至少以4個英文字母開頭,跟上字母數字符號,單詞以分隔符分割,不區分大小寫。因此這裏須要用到正則表達式進行限制。按行讀取文本,存入集合中,再用正則表達式進行篩選。
3.統計行數
這個也簡單,直接統計換行符便可
4.統計單詞頻率
在統計單詞數的基礎上,將肯定爲單詞的字符串存入一個集合中,而後再從第一個單詞開始進行匹配,並計數。
5.寫入文件
首先輸入文件路徑,而後用StreamWriter()建立一個對象,再用裏面的write方法,就能夠將內容寫入文件。
6.篩選定長單詞
在統計單詞個數的基礎上,將肯定爲單詞的字符串存入一個列表中,而後依次遍歷每一個單詞,再用string.len()能夠獲得每一個單詞的長度,然篩選出指定長度的單詞便可git
首先類的設計就兩個,第一個數函數類,第二個方法類。主函數類調用方法,而方法類中包含了全部須要用到的方法。方法類就七個函數,其中有一個公共方法getDic 這個方法用於得到字典,存入字典中的是長度大於四且不以數
字開頭的單詞以及他們出現的次數,這個方法會返回一個Hashtable,方法getWordFre()方法將字典按照單詞出現的次數進行排序,並返回一個動態數組。
其餘的,能夠直接調用,getWordFre這個方法利用返回的數組進行相應功能的實現。
流程圖
github
部分測試代碼
測試結果
測試文件
如圖所示,結果符合預期。
單元測試2
測試文件
結果
測試文件
正則表達式
代碼互審咱們進行得比較模糊,就是每一個人完成了一個功能模塊,再交給另外一我的測試,審覈,看看有沒有錯誤,或者有沒有更好的算法。
剛開始咱們都不知道用正則表達式,我也是經過百度才瞭解正則表達,而後咱們就改進了之前寫的算法,大幅度縮短了代碼量並且出錯率低算法
性能分析如圖所示
編程
性能分析是咱們完成代碼以後一塊兒作的,因此這張圖是和羅偉誠同樣的。
這裏的代碼改進主要有兩點,第一點使用字典,第二點使用正則表達式。
剛開始寫代碼的時候,首先想到的使用數組,或者字符串類型封裝的一
寫方法。可是這樣編寫起來代碼冗長,並且容易出錯,最後咱們採用了
比較高效的正則表達式和字典。數組
1.獲取字典
提取文本中的單詞並放入列表中,同時統計出每一個詞詞頻放到Hashtable中,最後返回一個Hashtable
2.計算單詞頻率
getWordFre(string pathName, ref Hashtable wordList)將傳遞過來的wordList進行按頻率排序,並將Hashtable轉換成動態數組並返回
函數
public void write(string outputPath, ref Hashtable wordList, int lines, int words, int characters, int wordsOutNumFla, int wordsOutNum, int m, string inputPath)
{
getFile Wordlist = new getFile();
ArrayList keysList = new ArrayList();
ArrayList keysList1 = new ArrayList();佈局
keysList1 = Wordlist.getPhrase(inputPath, outputPath, ref wordList, m); keysList = Wordlist.getWordFre(outputPath, ref wordList); StreamWriter sw = new StreamWriter(outputPath); sw.WriteLine("characters:{0}", characters); sw.WriteLine("words:{0}", words); sw.WriteLine("lines:{0}", lines); if (wordsOutNumFla == 1) { wordsOutNum = wordsOutNum; } else wordsOutNum = 10; for (int i = 0; i < wordsOutNum; i++) { sw.WriteLine("<{0}>:{1}", keysList[i], wordList[keysList[i]]); } sw.WriteLine("如下是長度爲{0}的詞組:\n", m); foreach (string j in keysList1) { sw.WriteLine("<{0}>:{1}", j, 1); } sw.Flush(); sw.Close(); }
4.統計行數
按行讀取,每讀取一行加一,最後得出行數
5.統計單詞數,讀取文件,用正則表達式進行篩選
6.統計字符數,這個比較簡單,按行讀取文件,累加每行的長度便可
7.獲取定長單詞數量
性能
首先看到題目要求的時候就以爲腦袋大,想了半個小時才把邏輯相同。而後在編寫代碼的時候也比較頭疼,由於我是第一次接觸這種命令行的程序。之前寫的都先運行程序,而後再一個一個輸入參數運行。經過羅偉誠的科普,我才知道,原來主函數的參數 args[]數組是用來存放嗎命令的。我讓羅偉誠寫了一段,示範給我看一下,這才理解了。此次的結對編程,不只體驗到了兩個寫代碼的優越性,還讓我學會了使用字典和正則表達式。最後感謝羅偉誠的合做和幫助。