WordCount(結對程式設計)
結隊學號:
201631062215、201631062116
專案地址:https://gitee.com/nasi96/codes/0oh63ispudrec8zf49tnq63
一 專案介紹
本次是在滴一次WordCount的基礎上,採取結對程式設計方式進行擴充套件功能的編寫。
二 專案要求
wc.exe -s //遞迴處理目錄下符合條件的檔案
wc.exe -a file.c //返回更復雜的資料(程式碼行 / 空行 / 註釋行)
wc.exe -e stopList.txt // 停用詞表,統計檔案單詞總數時,不統計該表中的單詞
[file_name]: 檔案或目錄名,可以處理一般萬用字元。
其中,
程式碼行:本行包括多於一個字元的程式碼。
空 行:
註釋行:本行不是程式碼行,並且本行包括註釋。一個有趣的例子是有些程式設計師會在單字元後面加註釋:
}//註釋
在這種情況下,這一行屬於註釋行。
三 程式設計情況
1 命名方式不規範
2 程式碼註釋過少,少於百分之20
3 程式碼格式不規範。
4 程式碼可讀性較差。
四 程式設計情況與說明
本次為了完成擴充套件功能重新添加了兩個類分別是LineOfCode類與DirectoryList類
1 public class DirectoryList 2 { 3 private static ArrayList directorysList = new ArrayList(); 4 public static ArrayList DirectorysList 5 { 6 get { return DirectoryList.directorysList; } 7 set 8 { 9 DirectoryList.directorysList = value; 10 } 11 } 12 private static ArrayList fileList = new ArrayList(); 13 public static ArrayList FileList 14 { 15 get { return DirectoryList.fileList; } 16 set { DirectoryList.fileList = value; } 17 } 18 public static void GetDirectory(string sourcePath) 19 { 20 if (Directory.Exists(sourcePath)) 21 22 { 23 string[] tmp = Directory.GetFileSystemEntries(sourcePath); 24 for (int i = 0; i < tmp.Length; i++) 25 { 26 if (File.Exists(tmp[i])) 27 { 28 FileList.Add(tmp[i]); 29 } 30 else 31 { 32 if (Directory.GetDirectories(tmp[i]).Length == 0) 33 { 34 DirectorysList.Add(tmp[i]); 35 } 36 } 37 GetDirectory(tmp[i]); 38 } 39 } 40 }DirectoryList
遞迴處理目錄下適合條件的檔案
1 public class LineOfCode 2 { 3 public static bool isLine = false; //一行中擁有有效字元時為true,該行可記入程式碼行數 4 public static bool isCommitLf = false; //註釋/*...*/中出現至少一個折行時為true 5 public static int nuines; 6 public static int notlines; 7 public static int LinesOfCode(string filename) 8 { 9 int lines = 0; 10 int nulines=0; 11 int notelines = 0; 12 System.IO.StreamReader sr = System.IO.File.OpenText(filename); 13 string s = sr.ReadToEnd(); 14 sr.Close(); 15 16 for (int i = 0; i < s.Length; i++) 17 { 18 //無效字元 19 if (s[i] == ' ' || s[i] == '\r' || s[i] == '\t') 20 { 21 continue; 22 } 23 //搜尋到換行,若該行有有效字元 24 if (s[i] == '\n') 25 { 26 if (isLine) 27 { 28 lines++; 29 isLine = false; 30 } 31 else if(!isLine) 32 nulines++; 33 34 35 continue; 36 } 37 //字串,佔多少行按多少行算 38 if (s[i] == '\"') 39 { 40 while (true) 41 { 42 i++; 43 //如果檔案遍歷完畢則強行中止 44 if (i >= s.Length) 45 { 46 break; 47 } 48 //再次遇到字元'"'且前方沒有或有偶數個'//'時,中止迴圈並退出 49 if (s[i] == '\"') 50 { 51 int sign = 0, counter = 0; 52 while (true) 53 { 54 sign++; 55 if (i - sign < 0) 56 { 57 break; 58 } 59 else if (s[i - sign] == '\\') 60 { 61 counter++; 62 } 63 else 64 { 65 break; 66 } 67 } 68 if (counter % 2 == 0) 69 { 70 break; 71 } 72 } 73 //字串中的換行,直接算作一行程式碼 74 if (s[i] == '\n') 75 { 76 lines++; 77 isLine = true; 78 } 79 } 80 isLine = true; 81 continue; 82 } 83 //遇到形如 /*...*/ 的註釋 84 if (s[i] == '/' && i < s.Length - 1) 85 { 86 if (s[i + 1] == '*') 87 { 88 i++; 89 while (true) 90 { 91 i++; 92 //如果檔案遍歷完畢則強行中止 93 if (i >= s.Length) 94 { 95 break; 96 } 97 if (s[i] == '\n') 98 { 99 notelines++; 100 if (isCommitLf == false) 101 { 102 if (isLine == true) 103 { 104 lines++; 105 isLine = false; 106 } 107 isCommitLf = true; 108 } 109 } 110 if (s[i] == '*' && i < s.Length - 1) 111 { 112 notelines--; 113 if (s[i + 1] == '/') 114 { 115 i++; 116 break; 117 } 118 } 119 } 120 isCommitLf = false; 121 continue; 122 } 123 } 124 //遇到形如 // 的註釋 125 if (s[i] == '/' && i < s.Length - 1 && s[i + 1] == '/') 126 { 127 notelines++; 128 if (isLine == true) 129 { 130 lines++; 131 isLine = false; 132 } 133 while (true) 134 { 135 i++; 136 if (i >= s.Length || s[i] == '\n') 137 { 138 break; 139 } 140 } 141 continue; 142 } 143 //該行有了有效字元,算作一行 144 isLine = true; 145 } 146 //最後一行可能沒有字元'\n'結尾 147 if (isLine) 148 { 149 lines++; 150 } 151 //return lines; 152 nuines = nulines; 153 notlines = notelines; 154 return lines; 155 156 } 157 } 158 }LineOfCode
統計檔案中的程式碼行 ,空行,註釋行
五 測試情況
此次主要對DirectoryList類進行了單元測試
測試用例達到了語句覆蓋
六 總結
通過此次專案的結對程式設計,充分體會到了團隊的好處,可以使程式碼更加完善,可讀性還有其他方面更加優秀,並且在結對的過程中通過不斷學習可以使我們的一些能力也得到提高.
參考文獻:
www.baidu.com