結對編程-wc.exe
結對學號:
201631062215、201631062116
項目地址:https://gitee.com/nasi96/codes/0oh63ispudrec8zf49tnq63
一 、項目介紹
本次是在滴一次WordCount的基礎上,采取結對編程方式進行擴展功能的編寫。
在擴展功能中,用戶通過輸入命令行的方式與程序實現交互。並且在基本功能的基礎上新增了2個命令參數;實現統計所有文件名是txt文件的字符數與單詞數的統計。實現文件空行數、代碼行數、註釋行數以及字符數和單詞數的統計。
二 、項目要求
wc.exe -s //遞歸處理目錄下符合條件的文件
wc.exe -a file.c //返回更復雜的數據(代碼行
wc.exe -e stopList.txt // 停用詞表,統計文件單詞總數時,不統計該表中的單詞
[file_name]: 文件或目錄名,可以處理一般通配符。
其中:
代碼行:本行包括多於一個字符的代碼。
空行:本行全部是空格或格式控制字符,如果包括代碼,則只有不超過一個可顯示的字符,例如“{”。
註釋行:本行不是代碼行,並且本行包括註釋。一個有趣的例子是有些程序員會在單字符後面加註釋:
}//註釋,在這種情況下,這一行屬於註釋行。
三 、編程情況
1 命名方式不規範
2 代碼註釋過少,少於百分之20
3 代碼可讀性較差
四
本次為了完成擴展功能重新添加了兩個類分別是LineOfCode類與DirectoryList類
public class DirectoryList { private static ArrayList directorysList = new ArrayList(); public static ArrayList DirectorysList { get { return DirectoryList.directorysList; } set { DirectoryList.directorysListDirectoryList= value; } } private static ArrayList fileList = new ArrayList(); public static ArrayList FileList { get { return DirectoryList.fileList; } set { DirectoryList.fileList = value; } } public static void GetDirectory(string sourcePath) { if (Directory.Exists(sourcePath)) { string[] tmp = Directory.GetFileSystemEntries(sourcePath); for (int i = 0; i < tmp.Length; i++) { if (File.Exists(tmp[i])) { FileList.Add(tmp[i]); } else { if (Directory.GetDirectories(tmp[i]).Length == 0) { DirectorysList.Add(tmp[i]); } } GetDirectory(tmp[i]); } } } DirectoryList
遞歸處理目錄下適合條件的文件
public class LineOfCode { public static bool isLine = false; //一行中擁有有效字符時為true,該行可記入代碼行數 public static bool isCommitLf = false; //註釋/*...*/中出現至少一個折行時為true public static int nuines; public static int notlines; public static int LinesOfCode(string filename) { int lines = 0; int nulines=0; int notelines = 0; System.IO.StreamReader sr = System.IO.File.OpenText(filename); string s = sr.ReadToEnd(); sr.Close(); for (int i = 0; i < s.Length; i++) { //無效字符 if (s[i] == ‘ ‘ || s[i] == ‘\r‘ || s[i] == ‘\t‘) { continue; } //搜索到換行,若該行有有效字符 if (s[i] == ‘\n‘) { if (isLine) { lines++; isLine = false; } else if(!isLine) nulines++; continue; } //字符串,占多少行按多少行算 if (s[i] == ‘\"‘) { while (true) { i++; //如果文件遍歷完畢則強行中止 if (i >= s.Length) { break; } //再次遇到字符‘"‘且前方沒有或有偶數個‘//‘時,中止循環並退出 if (s[i] == ‘\"‘) { int sign = 0, counter = 0; while (true) { sign++; if (i - sign < 0) { break; } else if (s[i - sign] == ‘\\‘) { counter++; } else { break; } } if (counter % 2 == 0) { break; } } //字符串中的換行,直接算作一行代碼 if (s[i] == ‘\n‘) { lines++; isLine = true; } } isLine = true; continue; } //遇到形如 /*...*/ 的註釋 if (s[i] == ‘/‘ && i < s.Length - 1) { if (s[i + 1] == ‘*‘) { i++; while (true) { i++; //如果文件遍歷完畢則強行中止 if (i >= s.Length) { break; } if (s[i] == ‘\n‘) { notelines++; if (isCommitLf == false) { if (isLine == true) { lines++; isLine = false; } isCommitLf = true; } } if (s[i] == ‘*‘ && i < s.Length - 1) { notelines--; if (s[i + 1] == ‘/‘) { i++; break; } } } isCommitLf = false; continue; } } //遇到形如 // 的註釋 if (s[i] == ‘/‘ && i < s.Length - 1 && s[i + 1] == ‘/‘) { notelines++; if (isLine == true) { lines++; isLine = false; } while (true) { i++; if (i >= s.Length || s[i] == ‘\n‘) { break; } } continue; } //該行有了有效字符,算作一行 isLine = true; } //最後一行可能沒有字符‘\n‘結尾 if (isLine) { lines++; } //return lines; nuines = nulines; notlines = notelines; return lines; } } } LineOfCodeLineOfCode
統計文件中的代碼行 ,空行,註釋行
五 測試情況
此次主要對DirectoryList類進行了單元測試
測試用例達到了語句覆蓋
六、 總結
通過本次項目中對wc.exe的結對編程,我更加知道了團隊合作的重要性,不只是在編程方面,更是在項目的其他方面,各方面的協作能夠節省大量的時間,以及可以使得代碼更加的完整,錯誤率被大大地減少,使得代碼更加的完善,可讀性也更加優秀。並且這樣的結對編程,更加符合標準的項目開發過程,開發過程中的錯誤可以及時的被發現然後解決,而且不會影響日後的編程。很棒!
參考文獻:
www.baidu.com
C# 語言的規範:簡版, 討論版
結對編程-wc.exe