第一次个人项目【词频统计】——需求分析,代码规范,设计思路

需求分析

  • 由于程序需要在Windows平台和Linux平台都能运行,因此对代码的可移植性有一定的要求
  • 由于需要对文件夹进行遍历,因此数据量相对较大,需要选择合适的数据结构,在此项目中,树和哈希表都是可供选择的数据结构
  • 由于对字符串的处理很多,因此需要选择一种合适的字符串表达方式,char* or string?

代码规范

  核心要求:用代码做到“卒章显志”的作用,代码能说清楚的事情就不要用注释,注释仅提示思路或者注意事项。因此变量名和函数名的设置尤为关键,比如函数名isSamePhrase(),又比如变量名bool isStringStart.

  以下根据常用的C/C++编码规范列举了如下要求:

  【通用】

  • 系统头文件应用:#include <xxx.h>
  • 自定义同文件应用:#include "xxx.h"
  • 函数体类体之间原则上用2个空行,特殊情况下可用一个或者不需要空行。

  【注释】

  • 调试的代码,加上注释 // only for DEBUG
  • 需要引起关注的代码,加上注释 // NOTE ...
  • 对于较大的代码块结尾,如for,while,do等,可加上 // end for|while|do

  【命名规范】

  • 同一性:在编写一个子模块或派生类的时候,要遵循其基类或整体模块的命名风格,保持命名风格在整个模块中的同一性。
  • 标识符组成:标识符采用英文单词或其组合,应当直观且可以拼读,可望文知意,用词应当准确,避免用拼音命名。
  • 最小化长度 && 最大化信息量原则:在保持一个标识符意思明确的同时,应当尽量缩短其长度。
  • 避免过于相似:不要出现仅靠大小写区分的相似的标识符,例如"i""I""function""Function"等等。
  • 避免在不同级别的作用域中重名:程序中不要出现名字完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但容易使人误解。
  • 正确命名具有互斥意义的标识符:用正确的反义词组命名具有互斥意义的标识符,如:"nMinValue""nMaxValue""GetName()""SetName()" ….
  • 避免名字中出现数字编号:尽量避免名字中出现数字编号,如Value1,Value2等,除非逻辑上的确需要编号。这是为了防止程序员偷懒,不肯为命名动脑筋而导致产生无意义的名字(因为用数字编号最省事)。

  【代码风格】

  • 每一行开始处的缩进只能用Tab
  • 在代码行的结尾部分不能出现多余的空格
  • 除了特别情况,函数体内不能出现两个空行
  • "if"、"for"、"while"、"do"、"try"、"catch" 等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加 "{ }" 。这样可以防止书写和修改代码时出现失误
  • if语句如果有else语句,用 } else { 编写为一行,不推荐用 3 行代码的方式。
  • 多行变量定义,为了追求代码排版美观,可将变量竖向对齐。
  • 对于switch语句,若某个case不需要break一定要加注释声明。

设计思路(概述)

  • 遍历给定的文件夹,并将文件的绝对路径存在vector中
  • 遍历vector,逐文件统计信息
  • 为了提高效率,采用边读文件变统计信息的方式
  • 由于单词量很大,因此采用平衡二叉树作为数据组织结构
  • 由于对单词进行重定义,所以不能直接使用fgets或者fscanf读字符串,而应该逐字符扫描判断是否为单词。
  • 由于需要统计词组,因此可以用一个char *存储上次读过的字符串
原文地址:https://www.cnblogs.com/ustctp/p/8672045.html