下面是对结对编程队友12061166 宋天舒的code review
五个优点:
1.代码的风格优秀,注释不多,但是必要的注释还是有的,比如:
// 三种模式
// mode1仅统计单个单词
// mode2额外统计连续的两个单词
// mode3额外统计连续的三个单词
enum modes { mode1, mode2, mode3 };
// 指示模式的静态变量,供各个函数使用
static modes mode;
// 简单模式中收集单词-词频信息的容器
static ArrayList words = new ArrayList();
// 扩展模式中搜集单词-词频信息的容器
static ArrayList wordsEx = new ArrayList();
// 在简单模式中存储Word对象的哈希表
static Dictionary<Word, Word> hashWords = new Dictionary<Word, Word>();
// 单词-单词映射,其中键是单词的大写形式,值是忽略大小写的单词中字典序最前的形式
static Dictionary<Word, Word> hashWordsEx = new Dictionary<Word, Word>();
// 目录路径
static string directoryPath;
2.代码健壮性良好,能够对多种特殊情况进行错误处理并输出错误信息,比如:
// 命令行格式错误的退出函数
static void oops1()
{
System.Console.WriteLine(usage);
Environment.Exit(-1);
}
// 命令行参数错误的退出函数
static void oops2()
{
System.Console.WriteLine("Invalid directory path");
Environment.Exit(-2);
}
3.Main函数短小精悍,函数之间耦合度底,聚合度高,一个函数尽量只处理一种情况
// 入口函数
static void Main(string[] args)
{
// 先检查格式
checkFormat(args);
// 再检查参数
config(args);
// 再统计单词
countWords();
// 再对统计结果进行排序
// 第一关键字是出现次数,从大到小,第二关键字是string,字典序
sortWords();
// 再写到文件中
writeFile();
}
4.对正则表达式的使用驾轻就熟。
5.最终版程序放弃了之前用多线程完成的一版代码,明智的选择!
三个小瑕疵:
1.有的函数虽然被定义了但是从没有被引用过,也没有加相应注释表面函数无用
public int Compare(Object wa, Object wb) { if (((Word)wa).times == ((Word)wb).times) { return ((Word)wa).word.CompareTo(((Word)wb).word); } else { return ((Word)wb).times - ((Word)wa).times; } }
2.命名规则基本能够遵从帕斯卡命名范式,但是有的地方略有瑕疵,比如:
static Regex re1p = new Regex(" [a-zA-Z]{3}[a-zA-Z0-9]*"); // 模式2,单词+一个空格+单词 static Regex re2 = new Regex(@"(_|\b)[a-zA-Z]{3}[a-zA-Z0-9]* [a-zA-Z]{3}[a-zA-Z0-9]*"); // 模式2前加一个空格,供模式3寻找连续单词时使用 static Regex re2p = new Regex(" [a-zA-Z]{3}[a-zA-Z0-9]* [a-zA-Z]{3}[a-zA-Z0-9]*");
re2和re2p无法顾名思义,好在有注释,但是命名规范不好
3.同样对于上面的代码,可以看出想要在extend模式中按照空格来找下一个匹配的短语,但是由于正则匹配效率比较低下,没有必要再开一个Regex来匹配带空格的单词+空格+单词,只需将匹配下标转移到一家匹配到的字符串中的空格处继续向下寻找匹配短语即可,使用正则的机会降低了一半,可以提升一定的时间性能。
4.Word类的定义一条注释也没有,建议补充必要注释
两个小建议:
1.没必要再造一个函数来完成排序,只需将相应compare函数重载之后用下列语句就可以简洁的完成排序输出操作中的排序操作,大大减少代码量:
var collection = from word in a orderby word descending select new StringBuilder(word.wordtodisplay).Append(": ").Append(word.Frequency);
2.工程完成之后,已经注释掉的无用代码可以考虑删去,使代码风格更加优美,方便维护人员查看代码