@H_403_3@
第2章 命名规范2.1. 大小写约定
2.1.1. 标识符的大小写规则
ü @H_403_3@用PascalCasing命名多个单词构成的命名空间、类型以及成员的名字。
@H_403_3@例如:使用TextColor而不使用Textcolor,单个单词(Button)的首字母大写,当一个单词为复合词(endpoint)作为一个单词,只有第一字母大写。
ü @H_403_3@用camelCasing命名参数的名字。
ü @H_403_3@不同类型标识符的大小写规则,如下表:
标识符 |
命名法 |
例子 |
命名空间 |
Pascal |
nameSpace System.Scurity{...} |
类型 |
Pascal |
public class StreamReader{...} |
接口 |
Pascal |
public interface IEnumerable{...} |
Pascal |
public class Object{ |
|
Pascal |
public class String{ |
|
事件 |
Pascal |
public class Process{ |
字段(静态) |
Pascal |
public class MessageQueue{ |
Pascal |
FileMode{Append,...} |
|
参数 |
Camel |
public class Convert{ |
2.1.2. 缩写词首字母的大小写
ü @H_403_3@要把缩写词首字母为两个字母全部大写,当是camelCasing风格的参数名的作为第一单词来使用。
@H_403_3@例如:
System.IO
Public void StartIO(Stream ioStream)
ü @H_403_3@把缩写词首字母为三个或三个以上字母第一字母大写,当是camelCasing风格的标识符作为第一单词来命名。
@H_403_3@例如:
System.Xml
Public void processHtmlTag(string htmlTag)
ü @H_403_3@不要把camelCasing风格的标识符头部的任何首字母缩写词的任何字母大写,无论首字母缩写词的长度是多少。
2.1.3. 复合词和常用术语的大小写
ü @H_403_3@在涉及大小写时,大多数复合词术语要作为单个单词处理。
ü @H_403_3@不要把闭合形式的复合词中每个单词的首字母大写。
ü @H_403_3@常用的复合词和常用术语的大小写及拼写。如下表:
Pascal |
Camel |
Not |
BitFlag |
bitFlag |
Bitflag |
Callback |
callback |
CallBack |
Canceled |
canceled |
Cancelled |
DoNot |
doNot |
dont |
|
|
|
Endpoint |
endpoint |
EndPoint |
FileName |
fileName |
Filename |
Gridline |
gridline |
GridLine |
Hashtable |
hashtable |
HashTable |
Id |
id |
ID |
Indexes |
indexes |
Indices |
logoff |
logoff |
logout |
logon |
logon |
LogIn |
Metadata |
Metadata |
|
Multipanel |
multipanel |
MultiPanel |
Multiview |
multiview |
MultiView |
Namespace |
namespace |
NameSpace |
Ok |
ok |
OK |
Pi |
pi |
PI |
Placehoder |
placehoder |
PlaceHoder |
Signln |
signln |
SignOn |
SignOut |
signOut |
SignOff |
UserName |
userName |
Username |
WhiteSpace |
whiteSpace |
Whitespace |
Writable |
writable |
Writeable |
2.1.4. 是否区分大小写
ü @H_403_3@任何外部可访问的API不应该仅通过大小写来区分位于同一个上下文中的两个名字。
ü @H_403_3@区分大小写只有一条规范:不要以为所有的编程语言都是区分大小写的,实际情况并非如此。不应该仅仅通过大小写来区分名字。
2.2. 通用命名的约定
2.2.1. 单词的选择
ü @H_403_3@为标识符选择易于阅读的名字。
ü @H_403_3@要更看重可读性,而不是更看重简短性。如属性名CanScrollHorizontally要胜过ScrollableX。
û @H_403_3@不要使用下划线、连字符以及其他任何既非字母也非数字的字符。
û @H_403_3@不要使用匈牙利命名法。
û @H_403_3@避免使用与广泛使用的编程语言的关键字有冲突的标识符。
2.2.2. 使用单词缩写和首字母缩写词
û @H_403_3@不要使用缩写词和缩约词作为标识符名字的一部分。
@H_403_3@例如:要用GetWindow,而不用GetWin。
û @H_403_3@不要使用未被广泛接受的首字母缩写词,即使是被广泛接受的首字母缩写词,也只应该在必需的时候才使用。
@H_403_3@例如:UI用来表示User Interface,HTML用来表示Hypertext Markup Language。虽然
@H_403_3@许多框架设计师认为一些新近的首字母缩写词很快就会被广泛接受,但在框架的标识
@H_403_3@符中使用它们仍是不好的做法。
2.2.3. 避免使用语言特有的名字
ü @H_403_3@要给类型名使用语义上有意义的名字,而不要使用语言特有的关键字。
@H_403_3@例如:GetLength这个名字比GetInt要好。
ü @H_403_3@要使用CLR的通用类型名,而不要使用语言特有的别名——如果除了类型之外,标识符没有其他的语义。
@H_403_3@例如:一个把类型转换为System. Int64的方法应该被命名为ToInt64,而不是ToLong
@H_403_3@(因为System. Int64是CLR类型名,它对应于C#特有的别名long)。
ü @H_403_3@语言特有的类型名及对应的CLR类型名,如下表:
C# |
Visual Basic |
C++ |
CLR |
sbyte |
SByte |
char |
SByte |
byte |
Byte |
unsigned char |
Byte |
short |
Short |
short |
Int16 |
ushort |
UInt16 |
unsigned short |
UInt16 |
int |
Integer |
int |
Int32 |
uint |
UInt32 |
unsigned int |
UInt32 |
long |
Long |
_int64 |
Int64 |
ulong |
UInt64 |
unsigned_int64 |
UInt64 |
float |
Single |
float |
Single |
double |
Double |
double |
Double |
bool |
Boolean |
bool |
Boolean |
char |
Char |
wchar_t |
Char |
string |
String |
String |
String |
object |
Object |
Object |
Object |
ü @H_403_3@如果除了类型之外,标识符没有其他的语义,而且参数的类型不重要,要使用常见的名字,比如value或item,而不要重复类型的名字。
@H_403_3@例如:下面是一个很好的例子,类提供的这些方法可以把各种不同的数据类型写入流中。
void Write(double value);
void Write(float value);
void Write(short value);
2.2.4. 为已有API的新版本命名
ü @H_403_3@要在创建已有API的新版本时使用与旧API相似的名字。
@H_403_3@例如:
@H_301_2490@ class AppDomain
@H_301_2490@ [Obsolete(" AppDomain . SetCachePath@H_301_2490@ has@H_301_2490@ been@H_301_2490@ deprecated .@H_301_2490@ @H_301_2490@please use@H_301_2490@ AppDomainSetup . CachePath@H_301_2490@ instead. ")]
@H_301_2490@ public void SetCachePath(String path) { }
@H_301_2490@ }
@H_301_2490@ class AppDomainSetup
@H_301_2490@ {
@H_301_2490@ public string CachePath
@H_301_2490@ {
@H_301_2490@ get;
@H_301_2490@ set;
@H_301_2490@ }
}
ü @H_403_3@要优先使用后缀而不是前缀来表示已有API的新版本。
ü @H_403_3@考虑使用全新但有意义的标识符,而不是简单地给已有标识符添加后缀或前缀。
ü @H_403_3@要使用数字后缀来表示已有API的新版本——如果已有API的名字是唯一有意义的名字(也就是说,它是一个工业标准),不适宜添加后缀(或改名.)。
@H_403_3@例如:
//old API
[ Obsolete("This@H_301_2490@ type@H_301_2490@ is@H_301_2490@ obsolete.@H_301_2490@ Please use@H_301_2490@ the new version of@H_301_2490@ the sarne class,X509Certificate2.") ]
public class X509Certificate@H_301_2490@ {@H_301_2490@ }
//new API
public class X509Certificate2 { }
û @H_403_3@不要在标识符中使用“Ex”(或类似的)后缀来区分相同API的不同版本。
@H_403_3@例如:
[Obsolete("This@H_301_2490@ type@H_301_2490@ is@H_301_2490@ obsolete.@H_301_2490@ …")]
@H_301_2490@ public class Car { }
@H_301_2490@ //new API
@H_301_2490@ public class CarEx { }@H_301_2490@ @H_301_2490@@H_301_2490@@H_301_2490@// the wrong way
@H_301_2490@ public class CarNew { }@H_301_2490@ @H_301_2490@// the wrong way
@H_301_2490@ public class Car2 { }@H_301_2490@ // the right way
public class Automobile { }@H_301_2490@ @H_301_2490@// the right way
ü @H_403_3@要在引入对64位整数(long)而非32位整数进行操作的新版API时使用“64”后缀只有当已经存在32位的API时才需要采用这种方法,对只有64位版本的全新API则不需要这样做。
@H_403_3@例如:System.Diagnostics.Process中有许多API返回Int32值来表示内存大小,比如PagedMemorySize或PeakWorkingSet。为了在64位系统上也支持这些API,一些有相同名字但是带“64"后缀的API被加了进来。
public class Process
@H_301_2490@ {
@H_301_2490@ // old APIs
@H_301_2490@ public int PeakWorkingSet { get; }
@H_301_2490@ public int PagedMemorySize { get; }
@H_301_2490@ // new APIs
@H_301_2490@ public long PeakWorkingSet64 { get; }
@H_301_2490@ public long PagedMemorySize64 { get; }
@H_301_2490@ }
2.3. 程序集和DLL的命名
ü @H_403_3@要为程序集和DLL选择提示性的名字,比如System.Data,这样很容易就知道它的大致功能。程序集和DLL的名字不一定要和名字空间相对应,但在给程序集命名时遵循名字空间的名字也是合情合理的。.
ü @H_403_3@考虑按照下面的模式给DLL命名:<Company>.<Component>.dll
@H_403_3@其中<Component>包含一个或多个以点号分隔的子句。
@H_403_3@例如:
Microsoft.VisualBasic.dll
Microsoft.VisualBasic.Vsa.dll
Fabrikarn.Security.dll
Litware.Controls.dll
2.4. 命名空间的命名
ü @H_403_3@要用公司名称作为命名空间的前缀,这样就可以避免与另一家公司使用相同的名字。
@H_403_3@例如:微软提供的Microsoft Office自动化API应该放在Microsoft .Office命名空间中。
ü @H_403_3@要用稳定的、与版本无关的产品名称作为命名空间的第二层。
û @H_403_3@不要根据公司的组织架构来决定命名空间的层次结构,因为公司内部组织的名称一般来说不会持续太长的时间。
ü @H_403_3@要使用PascaICasing大小写风格,并用点号来分隔名字空间中的各部分(例如Microsoft .Office.PowerPoint)。如果商标使用了非传统的大小写风格,那么即使该风格与常规的大小写风格相背,也还是应该遵循商标的大小写风格。
ü @H_403_3@考虑在适当的时候在名字空间中使用复数形式。
@H_403_3@例如:要用System.Collections,而不要用System.Collection。
@H_403_3@例如:要用System.IO,而不要用System.IOs。
û @H_403_3@不要用相同的名字来命名命名空间与位于该命名空间中的类型。
@H_403_3@例如:不要先将命名空间命名为Debug,然后又在该命名空间中提供一个名为Debug的类。许多编译器都要求用户在使用这样的类型时要加上完整的限定符。
2.5. 类、结构和接口的命名
@H_403_3@下面的命名规范适用于一般的类型命名:
ü @H_403_3@要用名词或名词词组来给类型命名,在少数情况下也可以用形容词词组来给类型命名。在命名时要使用PascalCasing大小写风格。这要与方法命名区分开,方法命名用动词词组来命名。
û @H_403_3@不要给类名加前缀(例如“C”)。
ü @H_403_3@考虑让派生类的名字以基类的名字结尾。这样可读性会非常好,而且能清楚地解释它们之间的关系。
@H_403_3@例如:
Ø ArgumentOutOfRangeException@H_403_3@,它是一种Exception,以“Exception”结尾。
Ø SerializableAttribute@H_403_3@,它是一种Attribute,以“Attribute”结尾。
@H_403_3@但是,在运用这一条时,很重要的一点是要做出合理的判断。例如:即使Button类的名字中没有出现Control字样,它仍是一种Control事件。
@H_403_3@下面是一些正确命名的例子:
@H_301_2490@ public class FileStream : Stream { }
@H_301_2490@public class Button : Control { }
ü @H_403_3@要让接口的名字以字母I开头,这样可以显示出该类型是一个接口。
@H_403_3@例如:IComponent(描述性的名词)、ICustomAttributeProvider(名词短语)以及IPersistable(形容词)都是恰当的接口名字。同其他类型名一样,要避免使用单词缩写。
ü @H_403_3@要确保一对类或接口的名字只相差一个“I”前缀,如果该类是该接口的标准实现。
@H_403_3@下面以IComponent接口及其标准实现-Component类为例来说明本条规范。
@H_403_3@例如:
@H_301_2490@ public interface IComponent { }
@H_301_2490@ public class Component : IComponent { }
2.5.1. 泛型类型参数的命名
ü @H_403_3@要用描述性的名字来命名泛型类型参数。如果泛型参数用一个字母即可清晰描述,就无需使用描述性名字命名。
@H_403_3@例如:
@H_301_2490@ public interface ISessionChannel<TSession> { }
public delegate TOutput Converter<TInput,TOutput> {TInput@H_301_2490@ from};@H_301_2490@
public class List<T> { }
ü @H_403_3@如果类型只有一个类型参数,且类型参数只有一个字母,考虑用T来命名参数类型。
@H_403_3@例如:
public int IComparer<T> { }
public@H_301_2490@ delegate bool@H_301_2490@ Predicate<T> {T@H_301_2490@ item} ;
public struct Nullable<T> where T:struct { }
@H_403_3@例如:
@H_301_2490@ public interface ISessionChannel<TSession> where TSession : ISession
@H_301_2490@ {
@H_301_2490@ TSession Session { get; }
}
ü @H_403_3@考虑在类型参数名中显示出施加于该类型参数上的限制。
@H_403_3@例如:可以把一个被限制为ISession的类型参数命名为TSession。
2.5.2. 常用类型的命名
ü @H_403_3@要遵循下表中描述的规范——如果要从.NET框架的类型派生新类,或者要实现.NET
@H_403_3@框架中的类型。
ü @H_403_3@派生自或实现某些特定的核心类型的命名规则,如下表:
基类 |
派生类型/实现类型的规范 |
System.Attribute |
|
System.Delegate |
要给用于事件处理的委托添加"EventHandler"后缀 |
要给用于事件处理之外的那些委托添加"Callback"后缀 |
|
不要给委托添加"Delegate"后缀 |
|
System.EventArgs |
要添加"EventArgs"后缀 |
System.Enum |
不要派生自该类,要用编程语言提供的关键字来代替。 |
不要添加"Enum"或"Flag"后缀 |
|
Sytem.Exception |
要添加"Exception"后缀 |
System.Collections.IDictionary |
要添加"Dictionary"后缀。 |
System.Collections.Generic. |
|
System.Collections.IEnumerable |
要添加"Collection"后缀 |
System.Collections.ICollection |
|
System.Collections.IList |
|
System.Collections.Generic. |
|
System.Collections.Generic. |
|
System.Collections.Generic.IList<T> |
|
System.IO.Stream |
要添加Stream后缀 |
System.Security.CodeAccessPermission |
添加Permission后缀 |
System.Security.IPermission |
2.5.3. 枚举类型的命名
ü @H_403_3@要用单数名词来命名枚举类型,除非它表示的是位域( bit field)。
@H_403_3@例如:
@H_301_2490@ public enum ConsoleColor
@H_301_2490@ {
@H_301_2490@ @H_301_2490@Black,
@H_301_2490@ Blue,
@H_301_2490@ Cyan
}
ü @H_403_3@要用复数名词来命名表示位域的枚举类型,这样的枚举类型也称为标记枚举( flag enum)。
@H_403_3@例如:
@H_301_2490@ [Flags]
@H_301_2490@ public enum ConsoleModifiers
@H_301_2490@ {
@H_301_2490@ Alt,
@H_301_2490@ Control,
@H_301_2490@ Shift
@H_301_2490@ }
û @H_403_3@不要给枚举类型的名字添加“Enum”后缀。
@H_403_3@例如,下面的命名就不好:
// Bad naming
@H_301_2490@ @H_301_2490@public enum ColorEnum
@H_301_2490@ {}
û @H_403_3@不要给枚举类型的名字添加“Flag”或“Flags”后缀。
@H_403_3@例如,下面的命名就不好:
@H_301_2490@ //Bad@H_301_2490@ naming
@H_301_2490@ [Flags]
@H_301_2490@ public enum ColorFlags
@H_789_5025@{} @H_789_5025@@H_403_3@例如:
@H_301_2490@ public enum ImageMode
@H_301_2490@ {
@H_301_2490@ ImageModeBitmap = 0,
@H_301_2490@ ImageModeGrayScale = 1,
@H_301_2490@ ImageModeIndexed = 2,
@H_301_2490@ ImageModeRgb = 3,
}
@H_403_3@下面的命名会更好:
@H_301_2490@ public enum ImageMode
@H_301_2490@ {
@H_301_2490@ Bitmap = O,
@H_301_2490@ GrayScale = 1.
@H_301_2490@ Indexed = 2,
@H_301_2490@ Rgb = 3,
@H_301_2490@ }
2.6. 类型成员的命名
2.6.1. 方法的命名
@H_403_3@例如:
@H_301_2490@ public class String
@H_301_2490@ {
@H_301_2490@ public int CompareTo();
@H_301_2490@ public string[] Split();
@H_301_2490@ public string Trim();
@H_301_2490@ }
2.6.2. 属性的命名
ü @H_403_3@要用名列、名词词组或形容词来命名属性。
@H_301_2490@ public class String
@H_301_2490@ {
@H_301_2490@ public int Length { get; }
@H_301_2490@ }
û @H_403_3@不要让属性名看起来与“Get”方法的名字相似,
@H_403_3@例如:
public string TextWriter{get{} set{}}
public string GetTextWriter(int value){}
ü @H_403_3@要用肯定性的短语(CanSeek而不是CantSeek)来命名布尔属性。如果有帮助,还可以有选择性地给布尔属性添加“Is”、“Can”或“Has”等前缀。
@H_403_3@例如:CanRead要比Readable更容易理解,但Created却比IsCreated的可读性更好。前缀通常是多余的,也没有必要,尤其是在有Intellisense的代码编辑器中。输入“MyObj ect.Enabled=”与输入“MyObject.IsEnabled=”一样清楚,两种情况下Intellisense都会提示你选择true或false,但后者更为冗长一些。
@H_403_3@例如:下面这个属性的作用是取得和设置一个名为Color的枚举值,因此它被命名为Color。
public enum Color{}
@H_301_2490@ public class Control
@H_301_2490@ {
@H_301_2490@ public Color Color{get{} set{}}
@H_301_2490@ }
2.6.3. 事件的命名
ü @H_403_3@要用动词或动词短语来命名事件。
@H_403_3@例如:包括Clicked、Painting、DroppedDown等等。
ü @H_403_3@要用现在时和过去时来赋予事件名以之前和之后的概念。
@H_403_3@例如:在窗口关闭之前发生的close事件应该命名为Closing,而在窗口关闭之后发生
@H_403_3@的应该命名为Closed。
û @H_403_3@不要用“Before”或“After”前缀或后缀来区分前置事件和后置事件。
ü @H_403_3@要在命名事件处理函数(用作事件类型的委托)时加上”EventHandler”后缀,
@H_403_3@例如:
public@H_301_2490@ delegate@H_301_2490@ void@H_301_2490@ ClickedEventHandler (object@H_301_2490@ sender,@H_301_2490@ ClickedEventArgs@H_301_2490@ e) ;
ü @H_403_3@要在事件处理函数中用sender和e作为两个参数的名字。参数sender表示触发该事件的对象。虽然参数sender可以是一个更为具体的类型,但一般来说其类型就是object。整个.NET框架一致地使用了这种模式。
@H_301_2490@ public@H_301_2490@ delegate void <EventName>EventHandler (object@H_301_2490@ sender,@H_301_2490@ <EventName>EventArgs@H_301_2490@ e);
ü @H_403_3@要在命名事件的参数类时加上“EventArgs”后缀.
@H_403_3@例如:
public class ClickedEventArgs : EventArgs
@H_301_2490@ {
@H_301_2490@ int x;
@H_301_2490@ int y;
@H_301_2490@ public ClickedEventArgs(int x,int y)
@H_301_2490@ {
@H_301_2490@ this.x = x;
@H_301_2490@ this.y = y;
@H_301_2490@ }
@H_301_2490@ public int x { get { return x; } }
@H_301_2490@ public int y { get { return y; } }
@H_301_2490@ }
2.6.4. 字段的命名
ü @H_403_3@要在命名字段时使用PascalCasing大小写风格。
@H_403_3@例如:
@H_301_2490@ public class String
@H_301_2490@ {
@H_301_2490@ public static readonly string Empty;
@H_301_2490@ }
ü @H_403_3@要用名词或名词短语来命名字段。
@H_403_3@例如:不要用“g_”或“s_”来区分静态和非静态字段
2.7. 参数的命名
ü@H_403_3@在命名参数时使用cameICasing大小写风格
@H_403_3@例如:
@H_301_2490@ public class String
@H_301_2490@ {
@H_301_2490@ public bool Contains(string value);
@H_301_2490@ public string Remove(int startIndex,int count);
}
ü @H_403_3@要使用具有描述性的参数名。
@H_403_3@说明:参数名应该具备足够的描述性,使得在大多数情况下,用户根据参数的名字和类型就能够确定它的意思。
ü @H_403_3@考虑根据参数的意思而不是参数的类型来命名参数。
@H_403_3@说明:开发工具必须向用户提供关于类型的有用信息,这样用户就能更好地利用参数名来描述语义,而不是描述类型。偶尔使用基于类型的参数名是完全可以的,但在采用这些规范时再回到匈牙利命名法则是绝对不应该的
2.8. 资源的命名
ü @H_403_3@要在命名资源关键字( resource key)时使用PascalCasing大小写风格。
ü @H_403_3@要使标识符的名字具有描述性而不是使名字变短。
û @H_403_3@不要使用各主要CLR编程语言特有的关键字。
ü @H_403_3@要在命名资源时仅使用字母、数字和下划线。
ü @H_403_3@要用点号来给标识符清楚地划分层次。
@H_403_3@例如,如果要设计菜单系统的资源,那么可以考虑按下面的方式来命名它们:
Menus.FileMenu.Close.Text
Menus.FileMenu.Close.Color
Menus.FileMenu.SaveAs.Text
Menus.HelpMenu.About.Text
ü @H_403_3@要在为异常的消息资源命名时遵循下面的命名约定。
@H_403_3@例如,资源标识符应该是异常的类型名加J-一个简短的异常标识符,之间以点号分隔:
ArgumentException.IllegalCharacters
ArgumentException.InvalidName
ArgumentException.FileNameIsMalformed
原文链接:https://www.f2er.com/javaschema/287295.html