.NET 设计规范--.NET约定、惯用法与模式--3.命名规范
1.大小写约定
1.1标示符的大小写规则
为了区分一个标示符中的多个单词,把标示符中每个单词的首字母大写。不要用下划线来区分单词,或者在标示符中的任何地方使用下划线。
PascalCasing约定被用于处理参数名以外的所有标示符,它把标示符中每个单词的首字母(包括长度为两个字符以上的首字母缩写词)大写,两个字母长的首字母缩写词是一个特例,在这种情况下两个字母都要大写,例如IOStream.
camelCasing约定仅用于参数的名字,它把标示符中除了第一个单词之外的所有单词的首字母大写,如果camelCasing风格的标示符以两个字母长的首字母缩写词开始,那么两个字母都要小写。
要把PascalCasing用于有多个单词构成的命名空间、类型以及成员名字。始终作为一个单词的复合词(比如endpoint)视为一个单词,只有第一个字母大写。要把camelCasing用于参数名字。
1.2 首字母缩写词的大小写
避免在标示符的名字中使用首字母缩写词是很重要的,除非它们是很普遍使用的,能够立刻被使用框架的人所理解。首字母缩写是由一个短语的首字母组成的,而单词缩写则仅仅把一个单词的长度变短。要把两个字母的首字母缩写全部大写,除非他是camelCasing风格的参数名的第一个单词。要把由三个或三个以上字母组成的首字母缩写词的第一个字母大写。只有第一个字母大写,除非首字母缩写词是camelCasing风格的标示符的第一个单词。例如Xml。不要吧camelCasing风格的标示符头部的任何首字母缩写词的任何字母大写,无论首字母缩写词的长度是多少。
1.3复合词和常用术语的大小写
在涉及大小写,大多数复合词术语要作为单个词处理。不要把所谓闭合形式的复合词中每个单词的首字母大写。
1.4 不要以为所有的编程语言都是区分大小写的,实际情况并非如此,不应该仅仅通过大小写区分名字。
2.通用命名约定
2.1单词的选择
要为标示符选择易于阅读的名字。要更看重可读性,而不是更看重简短性。不要使用下划线、连字符以及其他任何既非字母也非数字的字符。不要使用匈牙利命名法。避免使用与广泛使用的编程语言的关键字有冲突的标示符。
2.2 使用单词缩写和首字母缩写单词
不要使用缩写词和缩约词作为标示符名字的一部分。不要使用未被广泛接受的首字母缩写词即使是被广泛接受的首字母缩写词,也只应该在必需的时候才使用。
2.3避免使用语言特有的名字
要给类型名使用语义上有意义的名字,而不要使用语言特有的关键字。要使用CLR的通用类型名,而不要使用语言特有的别名---如果出了类型名之外,标示符没有其他的语义。要使用常见的名字,比如value或item,而不重复类型的名字----如果除了类型之外,标示符没有其他的语义,而且参数的类型不重要。
2.4 为已有API的新版本命名
要在创建已有API的新版本时使用与旧API相似的名字。要优先使用后缀而不是前缀来标示已有API的新版本,考虑使用全新但有意义的标示符,而不是简单地给已有标示符添加后缀或前缀。要使用数字后缀来标示已有API的新版本如果已有的API的名字是唯一有意义的名字(它是一个工业标准),不宜添加后缀。要在引入对64位整数(long)而非32位整数进行操作的新版API时使用“64”后缀。
3.3 程序集和DLL的命名
程序集命名规范和DLL命名规范一样,这里选择DLL为代表。要为程序集合DLL选择提示性的名字
考虑按照下面的模式给DLL命名<Company>.<Componet>.dll其中<Component>包含一个或东哥以点号分割的字句。
3.4 命名空间的命名
命名空间的一般规则:
<Company>.(<Product>|<Technology>)[.<Feature][.<Subnamespace>]
要使用公司名称作为名字空间的前缀,这样可以避免与另一家公司使用相同的名字。、
要用稳定的、与版本无关的产品名称作为名字空间的第二层
不要根据公司的组织架构类决定名字空间的的层次结构,因为公司内部组织的名称一般来说不会持续太长的时间。
要使用PascalCasing大小写风格,并以点号来分割命名空间中断各个部分。
考虑在适当的时候在名字空间中使用复数形式。
不要用相同的名字来命名名字空间与位于改名字空间中的类型。
不要引入太一般化的类型名。比如Element、Node、Log以及Message.这样的名字很可能会在常见的常见中一起类型名的冲突。应该给这些一般化的类型名加上修饰语。
名字空间可以分为下面的类别:
1.应用程序模型名字空间(application model namespace)
不要给位于同一个应用程序模型的名字空间中的类型起相同的名字。
2.基础设施名字空间(infrastructure namespace)
3.核心名字空间(core namespace)
不要给类型起于核心名字空间中的任何类型产生冲突的名字。
4.技术名字空间组(technology namespace group)
这个类别包括所有那些以相同的连个前缀(<Company>.<Technology>*)开头的名字空间。
不要给类型起会在位于同一技术中的其他类型产生冲突的名字
不要在技术名字空间和应用程序模型名字空间的类型之间引入类型名冲突
3.5 类、结构和接口的命名
一般来说,类型名应该是名词词组,它们代表系统中的实体。一条很好的经验法则是,如果无法为类型找到一个名词词组,那么可能应该重新考虑该类型的总体设计。
最易于识别的名字应该用于最常用的类型
最常用的类型名称应该反映出使用场景,而不是继承层次
要用名词或名词词组来给类型命名,在少数情况下我们也可以用形容词词组来给类型命名,在命名时要使用PascalCasing大小风格。
不要给类名家前缀(例如"C")。唯一的前缀是用于接口的"I"
考虑让派生类的名字以基类的名字结尾
要让接口的名字以字母I开头,这样可以显示出该类型是一个接口。
要确保一对类/接口的名字只差一个"I"前缀,如果该类是该接口的标准实现。
5.1 泛型类型参数的命名
要用描述性的名字来命名泛型类型参数---除非一个字母就足够了,而且描述性的名字并不能添加什么价值
考虑有T来命名参数类型----如果类型只有一个类型参数,且类型参数只有一个字母
要给描述性的类型参数加上T参数
考虑在类型参数名中显示出施加于该类型参数上的限制
5.2常用类型的命名
派生自或实现某些特定的核心类型的命名规则
基类 派生类型/实现类型的规范
System.Attribute 要给自定义的attribute类添加“Attribute”后缀
System.Delegate 要给用于事件处理的委托添加“EventHandler”后缀
要给用于事件处理之外的那些委托添加“Callback”后缀
不要添加‘Delegate“后缀
System.EventArgs 添加”EventArgs“后缀
System.Enum 不要派生自该类:要用编程语言提供的关键字来代替。例如在C#中,要用
enum关键字
不要添加”Enum“或”Flag“后缀
System.Exception 要添加”Exception“后缀
System.Collections.IDictionary 要添加”Dictionary“后缀。
System.Collections.Generic.
IDictionary<TKey,TValue>
System.Collections.IEnumerable 要添加”Collection“后缀
System.Collections.ICollection
System.Colections.IList
System.Collections.Generic.
IEnumerable<T>
System.Collections.Generic
ICollection<T>
System.Collections.Generic.IList<T>
System.IO.Stream 要添加Stream后缀
System.Security.IPermission 要添加Permission后缀
5.3 枚举类型的命名
要用单数名词来命名枚举类型,除非它表示的是位域(bit field)
要用复数名词来命名表示位域的枚举类型,这样的枚举类型也称为标记枚举(flage enum)
不要给枚举类型的名字添加”Enum“后缀
不要给枚举类型的名字添加”Flag“或”Flages“后缀
不要给枚举类型值的名字添加前缀
3.6 类型成员的命名
6.1 要用动词或动词词组来命名方法
6.2 属性的命名
在命名属性时要始终使用PascalCasing大小写风格
要用名词、名词词组或形容词来命名属性
不要让属性名看起来与”Get“方法的名字相似
要用肯定行的短语来命名布尔属性。如果有帮助,还可以有选择行的给布尔属性添加"Is"、"Can"或者”Has“等前缀
考虑用属性的类型名来命名属性
6.3 事件的命名
要用动词或动词短语来命名事件
要用现在是和过去时来赋予事件名以前和之后的概念。Closing和Closed
不要用”Before“或”After“前缀或后缀来区分前置事件和后置事件
要在命名事件处理函数时加上"EventHandler"后缀
要在事件处理函数中用sender和e做为两个参数的名字
要在命名事件的参数类时加上"EventArgs"后缀
6.4 字段的命名
要在命名字段时使用PascalCasing大小写风格
要用名词或名词短语来命名字段
不要给字段名称添加前缀
3.7 参数的命名
要在命名参数时使用camelCasing大小写风格
要使用具有描述性的参数名
考虑根据参数的意思而不是参数的类型来命名参数
3.8 资源的命名
要在命名资源关键字时使用PascalCasing大小写风格
要是标示符的名字具有描述性而不是使名字变短
不要使用各主要CLR编程语言特有的关键字
要在命名资源时仅用字母、数组和下划线
要用点号来给表示符清楚地划分层次
在为异常的消息资源命名时,标示符应该是异常的类型名加上一个简短的异常标示符,之间以点号分割。