团队项目开发"编码规范"之五:命名规范
发布日期:2011年3月18日星期三作者:EricHu
勤能补拙、笨鸟先飞。
5.1 命名概述
名称应该说明“什么”而不是“如何”。通过避免使用公开基础实现(它们会发生改变)的名称,可以保留简化复杂性的抽象层。例如,可以使用 GetNextStudent(),而不是 GetNextArrayElement()。 
命名原则是:
选择正确名称时的困难可能表明需要进一步分析或定义项的目的。使名称足够长以便有一定的意义,并且足够短以避免冗长。唯一名称在编程上仅用于将各项区分开。表现力强的名称是为了帮助人们阅读;因此,提供人们可以理解的名称是有意义的。不过,请确保选择的名称符合适用语言的规则和标准。
以下几点是推荐的命名方法。
1、避免容易被主观解释的难懂的名称,如方面名 AnalyzeThis(),或者属性名 xxK8。这样的名称会导致多义性。
2、在类属性的名称中包含类名是多余的,如 Book.BookTitle。而是应该使用 Book.Title。
3、只要合适,在变量名的末尾或开头加计算限定符(Avg、Sum、Min、Max、Index)。
4、在变量名中使用互补对,如 min/max、begin/end 和 open/close。 
5、布尔变量名应该包含 Is,这意味着 Yes/No 或 True/False 值,如 fileIsFound。
6、在命名状态变量时,避免使用诸如 Flag 的术语。状态变量不同于布尔变量的地方是它可以具有两个以上的可能值。不是使用 documentFlag,而是使用更具描述性的名称,如 documentFormatType。 (此项只供参考)
7、即使对于可能仅出现在几个代码行中的生存期很短的变量,仍然使用有意义的名称。仅对于短循环索引使用单字母变量名,如 i 或 j。 可能的情况下,尽量不要使用原义数字或原义字符串,如
For i = 1 To 7。而是使用命名常数,如 For i = 1 To NUM_DAYS_IN_WEEK 以便于维护和理解。
8、用于事件处理的委托添加“EventHandler”后缀
9、用于事件处理之外的那些委托添加“Callback”后缀
10、不要给委托添加“Delegate”后缀
11、用名词或名词词组来给类型命名,在少数情况下也可以用形容词词组来给类型命名
12、用动词或动词词组来命名方法
13、用名词、名词词组或形容词来命名属性
14、要用动词或动词短语来命名事件
15、要用名词或名词短语来命名字段
5.2 大小写规则
大写
标识符中的所有字母都大写。仅对于由两个或者更少字母组成的标识符使用该约定。例如:
System.IO
System.Web.UI
下表汇总了大写规则,并提供了不同类型的标识符的示例。
| 标识符 | 大小写 | 样例 | 
| 名字空间 | Pascal | namespace System.Security { … } | 
| 类型 | Pascal | public class StreamReader { … } | 
| 接口 | Pascal | public interface IEnumerable { … } | 
| 方法 | Pascal | public class Object { public virtual string ToString(); } | 
| 属性 | Pascal | public class String { public int Length { get; } } | 
| 事件 | Pascal | public class Process{ public event EventHandler Exited; } | 
| 字段(私有实例) | Camel | private string userName; | 
| 字段(公共静态) | Pascal | public static readonly string UserId; | 
| 枚举 | Pascal | enum FileMode { Append, … } | 
| 参数 | Camel | public class Convert { public static int ToInt32(string userId); } | 
5.3 缩写
      为了避免混淆和保证跨语言交互操作,请遵循有关区缩写的使用的下列规则: 
      1 不要将缩写或缩略形式用作标识符名称的组成部分。例如,使用 GetWindow,而不要使用 GetWin。 
      2 不要使用计算机领域中未被普遍接受的缩写。 
3 在适当的时候,使用众所周知的缩写替换冗长的词组名称。例如,用 UI 作为 User Interface 缩
写,用 OLAP 作为 On-line Analytical Processing 的缩写。 
4在使用缩写时,对于超过两个字符长度的缩写请使用 Pascal 大小写或 Camel 大小写。例如,使用 HtmlButton 或 HTMLButton。但是,应当大写仅有两个字符的缩写,如,System.IO,而不是 System.Io。
5 不要在标识符或参数名称中使用缩写。如果必须使用缩写,对于由多于两个字符所组成的缩写请
使用Camel 大小写,虽然这和单词的标准缩写相冲突。
5.4 命名空间
      1、给命名空间命名时的一般性规则是使用公司名称,后跟技术名称和可选的功能与设计,如下所示。
            CompanyName.TechnologyName[.Feature][.Design]
        例如:
         namespace JadeBird.StudentManager             //学员系统
         namespace JadeBird.StudentManager.Register       //北学员注册模块
      2、命名空间使用Pascal大小写,用点号分隔。
3、TechnologyName 指的是该项目的英文缩写,或软件名。
4、命名空间和类不能使用同样的名字。例如,有一个类被命名为Debug后,就不要再使用Debug作为一个名称空间名。
5.5 文件命名
1 文件名遵从Pascal命名法,无特殊情况,扩展名小写。
2 使用统一而又通用的文件扩展名:
| 文件类型 | 扩展名 | 
| C#类 | .cs | 
| Asp.net页面 | .aspx | 
| … | 使用默认扩展名 | 
5.6 类
1、使用 Pascal 大小写。
2、用名词或名词短语命名类。
3、使用全称避免缩写,除非缩写已是一种公认的约定,如URL、HTML    
4 、不要使用类型前缀,如在类名称上对类使用 C 前缀。例如,使用类名称 FileStream,而不是 
CFileStream。 
5 、不要使用下划线字符 (_)。 
6 、有时候需要提供以字母 I 开始的类名称,虽然该类不是接口。只要 I 是作为类名称组成部分的整个单词的第一个字母,这便是适当的。例如,类名称 IdentityStore 是适当的。在适当的地方,使用复合单词命名派生的类。派生类名称的第二个部分应当是基类的名称。例如,ApplicationException 对于从名为 Exception 的类派生的类是适当的名称,原因ApplicationException 是一种Exception。请在应用该规则时进行合理的判断。例如,Button 对于从 Control 派生的类是适当的名称。尽管按钮是一种控件,但是将 Control 作为类名称的一部分将使名称不必要地加长。
public class Button
public class String
    
5.7 接口
      以下规则概述接口的命名指南: 
      1、用名词或名词短语,或者描述行为的形容词命名接口。例如,接口名称 IComponent 使用描述性
名词。接口名称 ICustomAttributeProvider 使用名词短语。名称 IPersistable 使用形容词。 
2、使用 Pascal 大小写。 
      3、少用缩写。 
4、给接口名称加上字母 I 前缀,以指示该类型为接口。在定义类/接口对(其中类是接口的标准
实现)时使用相似的名称。两个名称的区别应该只是接口名称上有字母 I 前缀。 
5、不要使用下划线字符 (_)。 
6、当类是接口的标准执行时,定义这一对类/接口组合就要使用相似的名称。两个名称的不同之处
只是接口名前有一个I前缀。
          以下是正确命名的接口的示例。
                public interface IServiceProvider
                public interface IFormatable
          以下代码示例阐释如何定义 IComponent 接口及其标准实现 Component 类。
              
{
// Implementation code goes here.
}
public class Component: IComponent
{
// Implementation code goes here.
}
5.8 枚举 (Enum)
       枚举 (Enum) 值类型从 Enum 类继承。以下规则概述枚举的命名指南: 
           1 对于 Enum 类型和值名称使用 Pascal 大小写。 
           2 少用缩写。 
           3 不要在 Enum 类型名称上使用 Enum 后缀。 
           4 对大多数 Enum 类型使用单数名称,但是对作为位域的 Enum 类型使用复数名称。 
           5 总是将 FlagsAttribute 添加到位域 Enum 类型。 
           6不要命名“Reserved”枚举值。
5.9 参数
       以下规则概述参数的命名指南: 
           1、使用描述性参数名称。参数名称应当具有足够的描述性,以便参数的名称及其类型可用于在大多数情况下确定它的含义。 
       2、对参数名称使用 Camel 大小写。 
           3、 使用描述参数的含义的名称,而不要使用描述参数的类型的名称。开发工具将提供有关参数的类型的有意义的信息。因此, 通过描述意义,可以更好地使用参数的名称。少用基于类型的参数名称,仅在适合使用它们的地方使用它们。 
           4、不要使用保留的参数。保留的参数是专用参数,如果需要,可以在未来的版本中公开它们。相反,如果在类库的未来版本中需要更多的数据,请为方法添加新的重载。 
           5、不要给参数名称加匈牙利语类型表示法的前缀。 
       以下是正确命名的参数的示例。
               Type GetType(string typeName)
string Format(string format, args() As object)
5.10    方法
       以下规则概述方法的命名指南: 
           1 使用动词或动词短语命名方法。 
           2 使用 Pascal 大小写。 
           3 以下是正确命名的方法的实例。
              RemoveAll()
              GetCharArray()
  Invoke()
        以下规则概述属性的命名指南: 
            1 使用名词或名词短语命名属性。 
            2 使用 Pascal 大小写。 
            3 不要使用匈牙利语表示法。 
4 考虑用与属性的基础类型相同的名称创建属性。例如,如果声明名为 Color 的属性,则属
性的类型同样应该是 Color。请参阅本主题中后面的示例。 
          以下代码示例阐释正确的属性命名。
{
public Color BackColor
{
// Code for Get and Set accessors goes here.
}
}
            以下代码示例阐释提供其名称与类型相同的属性。
{
// Insert code for Enum here.
}
public class Control
{
public Color Color
{
get
{
// Insert code here.
}
set
{
// Insert code here.}
}
}
           以下代码示例不正确,原因是 Color 属性是 Int 类型的。
              public enum Color
{
// Insert code for Enum here. 
}
                public class Control 
                {
                    public int Color 
                    { 
                        // Insert code here 
                     }
                }
           在不正确的示例中,不可能引用 Color 枚举的成员。Color.Xxx 将被解释为访问一个成员,
该成员首先获取 Color 属性( C# 中为 int 类型)的值,然后再访问该值的某个成员(该成
员必须是 System.Int32 的实例成员)。
5.12    事件
        以下规则概述事件的命名指南: 
            1、对事件处理程序名称使用 EventHandler 后缀。 
2、指定两个名为 sender 和 e 的参数。sender 参数表示引发事件的对象。sender 参始
终是object 类型的,即使在可以使用更为特定的类型时也如此。与事件相关联的状态封装
在名为 e 的事件类的实例中。对 e 参数类型使用适当而特定的事件类。 
3、用 EventArgs 后缀命名事件参数类。 
    4、考虑用动词命名事件。 
5、使用动名词(动词的“ing”形式)创建表示事件前的概念的事件名称,用过去式表示事
件后。例如,可以取消的 Close 事件应当具有 Closing 事件和 Closed 事件。不要使用
BeforeXxx/AfterXxx 命名模式。 
            6、不要在类型的事件声明上使用前缀或者后缀。例如,使用 Close,而不要使用 OnClose。 
  7、通常情况下,对于可以在派生类中重写的事件,应在类型上提供一个受保护的方法(称为 
OnXxx)。此方法只应具有事件参数 e,因为发送方总是类型的实例。 
    以下示例阐释具有适当名称和参数的事件处理程序。
            public delegate void MouseEventHandler(object sender, MouseEventArgs e);
      以下示例阐释正确命名的事件参数类。
                public class MouseEventArgs : EventArgs 
                {
                   int x;
               int y;
                  public MouseEventArgs(int x, int y) 
                  {
this.x = x;
this.y = y; 
}
                  public int X
                  {
                      get
                      {
                          return x;
                      }
                  } 
                  public int Y
                  {
                 get
                       {
                           return y;
                       }
                  } 
                }
5.13    常量 (const)
        以下规则概述常量的命名指南: 
        所有单词大写,多个单词之间用 "_" 隔开。 如
                 public const string PAGE_TITLE = "Welcome";
           
5.14    字段
        以下规则概述字段的命名指南: 
            1、private、protected 使用 Camel 大小写。
            2、public 使用 Pascal 大小写。
3、拼写出字段名称中使用的所有单词。仅在开发人员一般都能理解时使用缩写。字段名称不
要使用大写字母。下面是正确命名的字段的示例。 
                class SampleClass 
                {
                    string url;
            string destinationUrl;
}
            4、不要对字段名使用匈牙利语表示法。好的名称描述语义,而非类型。 
5、不要对字段名或静态字段名应用前缀。具体说来,不要对字段名称应用前缀来区分静态和非静态字段。例如,应用 g_ 或 s_ 前缀是不正确的。 
6、对预定义对象实例使用公共静态只读字段。如果存在对象的预定义实例,则将它们声明为
对象本身的公共静态只读字段。使用 Pascal 大小写,原因是字段是公共的。下面的代码
示例阐释公共静态只读字段的正确使用。 
                  public struct Color
                  {
                      public static readonly Color Red = new Color(0x0000FF);
                      public Color(int rgb)
{
 // Insert code here.}
                          public Color(byte r, byte g, byte b)
                          {
// Insert code here.
                           }
                      public byte RedValue 
                      { 
                           get
                           {
                                return Color;
                           }
                       }
                   }
5.15    静态字段
       以下规则概述静态字段的命名指南: 
           1、使用名词、名词短语或者名词的缩写命名静态字段。 
           2、使用 Pascal 大小写。 
           3、对静态字段名称使用匈牙利语表示法前缀。 
           4、建议尽可能使用静态属性而不是公共静态字段。 
5.16    集合
     集合是一组组合在一起的类似的类型化对象,如哈希表、查询、堆栈、字典和列表,集合的命名
建议用复数。
5.17    措词
避免使用与常用的 .NET 框架命名空间重复的类名称。例如,不要将以下任何名称用作类名称:
System、Collections、Forms 或 UI。有关 .NET 框架命名空间的列表,请参阅类库。
另外,避免使用和以下关键字冲突的标识符。
| AddHandler | AddressOf | Alias | And | Ansi | 
| As | Assembly | Auto | Base | Boolean | 
| ByRef | Byte | ByVal | Call | Case | 
| Catch | CBool | CByte | Cchar | CDate | 
| CDec | CDbl | Char | Cint | Class | 
| CLng | CObj | Const | Cshort | CSng | 
| CStr | CType | Date | Decimal | Declare | 
| Default | Delegate | Dim | Do | Double | 
| Each | Else | ElseIf | End | Enum | 
| Erase | Error | Event | Exit | ExternalSource | 
| False | Finalize | Finally  | Float | For | 
| Friend | Function | Get | GetType | Goto | 
| Handles | If | Implements | Imports | In | 
| Inherits | Integer | Interface | Is | Let | 
| Lib | Like | Long |  | Me | 
| Mod | Module | MustInherit | MustOverride | MyBase | 
| MyClass | Namespace | New | Next | Not | 
| Nothing | NotInheritable | NotOverridable | Object | On | 
| Option | Optional | Or | Overloads | Overridable | 
| Overrides | ParamArray | Preserve | Private | Property | 
| Protected | Public | RaiseEvent | ReadOnly | ReDim | 
| Region | REM | RemoveHandler | Resume | Return | 
| Select | Set | Shadows | Shared | Short | 
| Single | Static | Step | Stop | String | 
| Structure | Sub | SyncLock | Then | Throw | 
| To | True | Try | TypeOf | Unicode | 
| Until | volatile | When | While | With | 
| WithEvents | WriteOnly | Xor | Eval | extends | 
| instanceof | package | var |     |     | 
------------------------------------------------
cnBlobs:http://www.cnblogs.com/huyong/
CSDN: http://blog.csdn.net/chinahuyong
 
             
                            
 
                             
                             
                     
                     
                 
                         
                 
                         
                 
                    