|
原动力FANS 超级版主
   
- UID
- 44138
- 帖子
- 10757
- 精华
- 16
- 积分
- 26053 分
- 威望
- 107 级
- 现金
- 114 元
- 活跃
- 10946 点
- 来自
- 北京
- 注册时间
- 2007-3-14
- 最后登录
- 2009-1-2
|
沙发
大 中
小 发表于 2007-8-6 17:21 只看该作者
泛型类型参数
如果泛型类只有一个类型参数,可以使用单字母“T”作为类型参数的名称,如List<T>。如果包含多个类型参数,则应分别使用描述性的名称,并使用“T”作为前缀,如Dictionary<TKey, TValue>。对于有特定类型约束的类型参数,可以使用约束类型的名称,如约束于ISession的类型参数可命名为TSession。
引用:public class BinaryTree<T>
// 正确的命名
{ ... }
public class Converter<TInput, TOutput>
// 正确的命名
{ ... }
public class Converter<T, U>
// 错误:T、U并没有描述出它的意义
{ ... }
public class Converter<Input, Output>
// 错误:类型参数必须具有“T”前缀
{ ... }
public interface ISessionChannel<TSession> where TSession : ISession
{ ... }
// 正确的命名 事件与委托
不要为委托添加“Delegate”前缀或后缀。对于用于事件处理的委托,应该加上“EventHandler”后缀;对于其它情况下的委托,应该加上“Callback”后缀。传递事件参数应使用System.EventArgs类,或由其派生,其名称因为事件名称加上“EventArgs”后缀。
引用:public delegate void ClickDelegate();
// 错误:不要为委托添加“Delegate”后缀
// 应为:Click或ClickCallback
public delegate void ProcessPhoto();
// 错误:非事件委托应加上“Callback”后缀
// 应为:ProcessPhotoCallback
// 这是一个正确使用事件及委托的例子
public class Transaction
{
// 事件名称使用Pascal大小写:Completed
public event CompletedEventHandler Completed;
...
}
// 为事件委托添加了“EventHandler”后缀
public delegate void CompletedEventHandler(...);
// 事件数据类从EventArgs类派生,并以“EventArgs”为后缀
public class CompletedEventArgs : EventArgs
{ ... } 不要为事件添加“Before”或“After”的前缀,而应使用其相应的分词形式。具体参看“措辞及用词选择”一节。
自定义属性类
为自定义属性类添加“Attributes”后缀。引用:// 正确的命名
[System.AttributeUsage(System.AttributeTargets.Class)]
public class AuthorAttributes : System.Attribute
{ ... }
// 错误:应为自定义属性添加“Attributes”后缀
[System.AttributeUsage(System.AttributeTargets.Class)]
public class Author : System.Attribute
{ ... } 枚举
不要为枚举添加“Enum”前缀或后缀。不要在枚举值中使用枚举类型的名称作为前缀或后缀。例如:在Weekday枚举中应该定义Monday而不是WeekdayMonday。
引用:public enum Color
// 正确的命名
{
Red,
// 正确的命名
Green,
Blue
}
public enum ColorEnum
// 错误:不要为枚举类型名称添加“Enum”后缀
{
RedColor,
// 错误:不要在枚举值名称中添加枚举类型的名称
GreenColor,
BlueColor
} 措辞及用词选择
无论是哪一种名称,都应尽可能地反映其准确含义,包括其中可能存在的隐喻。命名的目的是为了让类库的使用者更快更准确地了解该类库的用法,而不是解释该类库内部是如何工作的。命名要从使用者的角度出发,便于他们找到需要的东西。
命名空间
命名空间因指示其中包含的类型所提供的功能,应使用名词或名词短语作为命名空间的名称。为了避免冲突,命名空间应遵循下列命名格式:
<公司名称>.<产品或技术名称>[.<特性名称>][.<子命名空间>]
虽然通常认为命名空间名称应该使用Pascal大小写方式,但是如果您公司或品牌的名称有独特的大小写方式,那么当然应该遵照您公司或品牌原有的写法。例如:IBM虽然是首字母缩写词,但不宜写为 Ibm。AutoCAD也不宜写成AutoCad等等。
类
类通常用来表示实体或是某种概念,因此应用名词或名词短语作为命名空间和类的名称。
引用:public class PhotoExhibitor
// 正确的命名
{ ... }
public class ExhibitPhoto
// 错误:不要使用动词或者动词短词作为类名称
{ ... }
类名称不应与所在的命令空间名称相同(不考虑大小写差异),这在某些语言中会造成开发上的不便。类名称也不要与系统核心类库中的类名称相同。在尽可能已知的范围内(至少是Visual Basic.NET、Visual C++.NET和Visual C#.NET),类名称不应与这些语言的关键字相同。
引用:namespace PhotoExhibitor
{
public class Application
// 正确的命名
{ ... }
public class Photo
// 正确的命名
{ ... }
}
namespace PhotoExhibitor
{
public class PhotoExhibitor
// 错误:类名称不应与所在的命名空间名称相同
{ ... }
public class Image
// 错误:类名称与System.Drawing.Image相同
{ ... }
} 接口
接口通常表示类具有的某方面特性或共性。当接口主要用于标识类的某种身份时,应使用与该身份相关的名词或名词短语作为接口的名称。例如:IList、IPermission等。当接口用于表示该类支持某种特定的操作时,应使用表示其能力的形容词作为接口的名称,例如:IEnumerable、IComparable等。
引用:public interface IExpressionItem
// 正确的命名
{ ... }
public interface IDispatchable
// 正确的命名
{ ... }
public interface IPresentsAnItem
// 错误:不应使用动词短语作为接口名称
{ ... }
public interface ICanBeDispatched
// 错误:不应使用系表结构作为接口名称
{ ... } 法与参数
方法通常表示对数据进行操作,因此应使用动词或动词短语作为方法的名称。该动词描述应该让使用该方法的人理解它所执行的操作,而不需要解释方法具体是如何实施的,除非调用该方法的人必须知晓以便于区分多个方法。
引用:public string Name() { ... }
// 错误:不应使用名词作为方法的名称
// 应为:GetName
public void StoreUsingBinaryTree(...)
// 错误:不需要通过名称解释方法的细节
{ ... }
// 应为:Store
public void BubbleSort(...) { ... }
// 正确的命名:虽然它解释了方法的细节,
public void QuickSort(...) { ... }
// 但由于存在多个类似的方法,必须通过其
// 细节来进行区分。 重载函数的参数名应与基类中被重载函数的参数名称保持一致。例如在重载Object.EqualTo(Object obj) 方法的时候,也应该使用“obj”作为参数名称,以保持一致性。
引用:public abstract class Transaction
{
// 这是一个抽象函数,请注意它的参数名称
public abstract void Switch(Photo before, Photo after);
}
public class FadeInTransaction : Transaction
{
// 正确的命名。它使用了与基类中一致的参数名称
public override void Switch(Photo before, Photo after)
{ ... }
}
public class FadeInTransaction : Transaction
{
// 错误:应该使用与基类方法声明中一致的参数名称。
public override void Switch(Photo photo1, Photo photo2)
{ ... }
} 属性
属性通常用于描述状态,因此应使用名词、名词短语或者形容词作为属性的名称。对于逻辑类型的属性,可以为其添加“Is”、“Can”或“Has”的前缀,但应使用自然、得当。切勿使用否定式的表述方式,如CannotSeek、IsNotEnabled等等都是不合适的。
引用:class PhotoCollection
{
public int Count { get { ... } }
// 正确的命名
public int GetAmount { get { ... } }
// 错误:属性名称不应为动词短语
public bool IsEmpty { get { ... } }
// 正确的命名
public bool HasNoPhoto { get { ... } }
// 错误:逻辑类型属性不应使用否定式
} 可以使用与类型名称相同的名称作为属性名称。例如用于表示其颜色的属性,被定义为Color类型,属性的名称通常也可以命名为“Color”。
引用:class Photo
{
public ImageSource ImageSource { get { ... } }
// 正确的命名
如果提供了可读的属性(如Age),就不要再提供Get方法(如GetAge),这会使程序员对到底应该使用哪个产生疑惑。
引用:class Photo
{
public Size Size { get { ... } }
// 这本身没有问题
public Size GetSize()
// 错误:该方法与前一个属性的功能至少看
{ ... }
// 来类似,会使开发人员感到疑惑。
} 事件
事件表示一个状态的改变或者发生,它隐含着一个动作的发生,因此应使用动词或动词短语作为事件的名称。为了强调事件发生的时间前后关系,使用现在分词表示在动作准备开始时引发的事件,如Validating、Closing等;而使用过去分词表示动作结束之后引发的事件,如Validated、Closed、Changed等等。不要用“Before”或“After”作为前缀或后缀。
引用:class Table
{
public event EventHandler RecordRemoving;
// 正确的命名
public event EventHandler RecordRemoved;
public event EventHandler BeforeRemoveRecord;
// 错误:不要使用“Before”
public event EventHandler AfterRemoveRecord;
// 或“After”作为前后缀。
} 对于事件委托,坚持使用命名为“sender”和“e”的两个参数。“sender”的类型为Object,表示触发该事件的对象,“e”的类型为EventArgs或其派生类,带有与该事件相关的数据信息。事件委托总是以“EventHandler”为后缀,事件参数类总是以“EventArgs”为后缀。
引用:// 这是一个正确使用事件及委托的例子
public class Transaction
{
// 事件名称使用Pascal大小写:Completed
public event CompletedEventHandler Completed;
// 这是标准的用来引发事件的函数
protected virtual void OnCompleted(CompletedEventArgs e)
{
if(Completed != null)
{
Completed(this, e);
}
}
...
}
// 为事件委托添加了“EventHandler”后缀,并使用了标准的参数格式
public delegate void CompletedEventHandler(object sender,
CompletedEventArgs e);
// 事件数据类从EventArgs类派生,并以“EventArgs”为后缀
public class CompletedEventArgs : EventArgs
{ ... } 枚举
对于普通枚举的名称,请使用名词的单数形式。虽然枚举中包含了多种可能,但由于每个枚举类型的变量只会保存一种可能性(例如Color.Red等),因此使用复数是不恰当的。
反之,对于位域值的枚举(标志枚举),则应该使用名词的复数形式,因为这种类型的变量可能包含多个枚举值的复合值(例如FontStyles.Bold与FontStyles.Italic的复合)。
引用:public enum Color
// 正确的命名
{
Red,
Green,
Blue
}
public enum Colors
// 错误:每个枚举值在同一时间只会用到一次,因此不
{
// 应在枚举名称中使用名词的复数形式。
Red,
Green,
Blue
}
[Flags]
public enum Permissions
// 正确的命名
{
// 由于这是一个标识枚举,有可能复合使用,因此在名
None = 0,
// 称中使用名词的复数形式是正确的。
Read = 1,
Write = 2,
ReadWrite = Read | Write
}
|