在软件开发过程中,一套定义完整、结构清晰明了的命名规范将大大提升源代码的可读性和软件的可维护性。没有一种命名规则可以让所有的程序员都满意,程序设计教科书一般也不会指定命名规则。但是制定一套统一的命名规则,并在项目中贯彻实施,是团队开发的产品质量一项必不可少的工作。
第一部分:文件结构
一个功能类封装在独立的cs文件里面。文件名称非必要时不要使用中文或其它双字节编码的文字代码。文件名称应该仅由字母和数字以及下划线组成。
第二部分:命名规则
【规则1】标识符应简单明了,望文知意。
标识符采用英文单词,不建议使用汉语拼音来命名,禁止使用汉字命名。程序中的英文单词一般不要太复杂,用词应当准确。例如不要把CurrentValue写成NowValue。
尽量不要使用单词缩写或首字母缩写。只有当标识符过长时才考虑使用单词缩写。在使用缩写时,不要自创缩写,尽量使用被广泛接受的缩写。
【规则2】标识符长度应当符合“min-length && max-information”原则。
一般的讲,长名字能更好地表达含义,所以函数名、变量名、类名长达十几个字符不足为怪。但是名字也不是越长越好。例如:变量名maxval就比maxValueUntilOverflow更好用。单字符的名字也是有用的,常见的如i,j,k,m,n,x,y,z等,它们通常用作函数内的局部变量。一般来讲:作用域越大,名字可以越长,作用域越小,名字可以越短。
【规则3】程序命名(函数名,变量名。类名等)尽量遵循匈牙利命名方法,即首字母大写的若干单词组成。
【规则4】程序中不要出现仅靠大小写区分的标识符。
例如:int x和int X;void foo() 和void FOO() 等。
【规则5】避免在不同级别的作用域中重名。
程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者因作用域的不同而不会发生语法错误,但会使人产生误解。类的函数重载除外。模块级变量或类级 变量加m_前缀。 全局变量(程序级)加g_变量。
【规则6】正确命名具有互斥意义的标识符。
使用正确的反义词组命名具有互斥意义的变量或相反动作的函数。
如:"MinValue"和"MaxValue","GetName()" 和 "SetName()"
【规则7】尽量避免名字中出现数字编号。
如Value1,Value2等,除非逻辑上的确需要编号。这是为了防止程序产生无意义的名字,降低程序的可读性。
总之,类型前缀是一个可选的命名规则。下面分类进行详细的规范。
一、 类和接口
1、 命名:类名都以大写字母 开头,后跟一个或多个单词。每个单词的首字母要大写。接口以大写"I"开头,代表Interface。
2、 组成形式:推荐用"名词"或"形容词+名词"的形式,例如:"Analyzer", "FastVector" ....
二、 函数
1、 命名:函数的名称由一个或多个单词组成。每个单词的首字母要大写。最长不得超过20个字符。
2、 组成形式:全局函数应当使用"动词"或者"动词+名词"(动宾词组)的形式。例如:"GetName()", "DrawBox()"。
类成员函数应当只使用“动词”,被省略掉的名词就是对象本身。例如:
" box->Draw();"。
3、 全局函数:以小写前缀"g"或”m”开头。
4、 回调和事件处理函数 :习惯以单词“On”开头。例如:"_OnTimer()", "OnExit()"
三、 变量
变量是程序中使用最多的标识符,变量的命名规范是一套C#命名规范中最重要的部分:
1、 命名:变量名由作用域前缀+类型前缀+一个或多个单词组成。变量用小写字母开头的单词组合而成,第二个单词的首字母要大写。例如:int nDrawMode。变量最长不得超过20个字符。
特殊的:对于某些用途简单明了的局部变量,也可以使用简化的方式,如:i, j, k, x, y, z
2、 组成形式:变量的名字应当使用"名词"或者"形容词+名词"。例如:"nCode", "m_nState","nMaxWidth"," oldValue "," newValue "。
3、 作用域前缀:作用域前缀标明一个变量的可见范围。作用域可以有如下几种:
| 前缀 | 说明 | 例子 |
| 无 | 局部变量 | |
| m_ | 类的成员变量(member) | Int m_width |
| g_ | 外部全局变量(global) | int g_howManyPeople; |
4、 类型前缀:作用域前缀标明一个变量的可见范围。类型前缀标明一个变量的类型,有如下几种:
| 前缀 | 说明 | 例子 |
| b | 布尔型变量(bool) | bEnable |
| ch | 字符型变量(char ) | chName |
| str | string | strName |
| n | 整型和位域变量(int, UINT,uint32,int64,float, double 等) | nLength |
| p | 指针型变量和迭代子(pointer) | pDoc |
| pfn | 特别针对指向函数的指针变量和函数对象指针(pointer of function) | |
| h | handle Windows对象句柄 | hWnd |
| lbl | Label控件 | WPF,winform |
| btn | Button控件 | WPF,winform |
| txb | Textbox控件 | WPF,winform |
| lsb | ListBox控件 | WPF,winform |
| cmb | Comobox控件 | WPF,winform |
| ckb | CheckBox控件 | WPF,winform |
| rab | RatioBox控件 | WPF,winform |
| pic | PictureBox控件 | WPF,winform |
| Form(或frm) | Form窗口 | winform |
| Page(或win) | WPF XAML窗口 | WPF |
四、常量
常量名由全大写字母组成,单词间通过下划线来界定,如: DELIMITER, MAX_BUFFER。类型前缀的定义与变量命名规则中的相同。
五、结构体和常量
全部由前缀+大写字母组成,单词间使用下划线界定。
结构体:大写字母开头。
例:
struct Point
{
int x;
int y;
};
六、函数里面的变量可以尽量简化,不主张较长的变量名,除非需要通过变量名增加可读性。函数参数前可以不用添加前缀。
如: Add(int a, int b)
或者
Add(int nA, int nB)
第三部分:代码风格与版式
代码风格的非常重要,需要遵顼下面基本原则:
1. 空行的使用
空行起着分隔程序段落的作用。空行得体(不过多也不过少)将使程序的布局更加清晰。空行不会浪费内存,虽然打印含有空行的程序是会多消耗一些纸张,但是值得。所以不要舍不得用空行。
· 在每个类声明之后、每个函数定义结束之后都要加2行空行。
· 在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。
2. 语句与代码行
· 一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。
· "if"、"for"、"while"、"do"、"try"、"catch" 等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加 "{ }" 。这样可以防止书写和修改代码时出现失误。
3. 缩进和对齐
· 程序的分界符 "{" 和 "}" 应独占一行并且位于同一列,同时与引用它们的语句左对齐。
· "{ }" 之内的代码块在 "{" 右边一个制表符(4个半角空格符)处左对齐。如果出现嵌套的 "{ }",则使用缩进对齐。
· 如果一条语句会对其后的多条语句产生影响的话,应该只对该语句做半缩进(2个半角空格符),以突出该语句。
例如:
| void Function(int x) { SessionLock iLock(mxLock); for (初始化; 终止条件; 更新) { // ... } try { // ... } catch (const exception& err) { // ... } catch (...)} |
4. 最大长度
代码行最大长度宜控制在70至80个字符以内。代码行不要过长,否则不便人工复查,也不便于打印。
5. 长行拆分
长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。
例如:
| if ((very_longer_variable1 >= very_longer_variable2) && (very_longer_variable3 <= very_longer_variable4) && (very_longer_variable5 <= very_longer_variable6)) { DoSomething(); } |
6. 空格的使用
1. 关键字之后要留空格。象 "const"、"virtual"、"inline"、"case" 等关键字之后至少要留一个空格,否则无法辨析关键字。象 "if"、"for"、"while"、"catch" 等关键字之后应留一个空格再跟左括号 "(",以突出关键字。
2. 函数名之后不要留空格,紧跟左括号 "(",以与关键字区别。
3. "(" 向后紧跟。而 ")"、","、";" 向前紧跟,紧跟处不留空格。
4. "," 之后要留空格,如 Function(x, y, z)。如果 ";" 不是一行的结束符号,其后要留空格,如 for (initialization; condition; update)。
5. 赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如"="、"+=" ">="、"<="、"+"、"*"、"%"、"&&"、"||"、"<<", "^" 等二元操作符的前后应当加空格。
6. 一元操作符如 "!"、"~"、"++"、"--"、"&"(地址运算符)等前后不加空格。
7. 象"[]"、"."、"->"这类操作符前后不加空格。
8. 对于表达式比较长的 for、do、while、switch 语句和 if 语句,为了紧凑起见可以适当地去掉一些空格,如 for (i=0; i<10; i++) 和 if ((a<=b) && (c<=d)) 等。
例如:
| void Func1(int x, int y, int z); // 良好的风格 void Func1 (int x,int y,int z); // 不良的风格 // =========================================================== if (year >= 2000) // 良好的风格 if(year>=2000) // 不良的风格 if ((a>=b) && (c<=d)) // 良好的风格 if(a>=b&&c<=d) // 不良的风格 // =========================================================== for (i=0; i<10; i++) // 良好的风格 for(i=0;i<10;i++) // 不良的风格 for (i = 0; I < 10; i ++) // 过多的空格 // =========================================================== x = a < b ? a : b; // 良好的风格 x=a<b?a:b; // 不好的风格 // =========================================================== int* x = &y; // 良好的风格 int * x = & y; // 不良的风格 // =========================================================== array[5] = 0; // 不要写成 array [ 5 ] = 0; a.Function(); // 不要写成 a . Function(); |
7. 修饰符的位置
为便于理解,应当将修饰符 "*" 和 "&" 紧靠数据类型。 例如:
| char* strName; int* x; int y; // 为避免y被误解为指针,这里必须分行写。 int* Function(void* p); |
8. 注释
· 注释的位置应与被描述的代码相邻,可以放在代码的上方或右方,不可放在下方。
· 边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。
· 注释应当准确、易懂,防止注释有二义性。错误的注释不但无益反而有害。
· 当代码比较长,特别是有多重嵌套时,应当在一些段落的结束处加注释,便于阅读。
1142

被折叠的 条评论
为什么被折叠?



