NET编码规范之二----编码规范

 文件命名

  规则:

  1) 出了系统要求之外的文件名的长度没有限制。然而一个有意义的名称来描述内容始终是最容易接收的。

  2) 在文件名和扩展名之间应该只有一个英文句号“.”来分开,像后台代码文件名[DescriptiveName].aspx.cs 或者[DescriptiveName].aspx.vb 的除外。

  3) 源文件名称应该用以下格式:
    [FileName] = [DescriptiveName].[Extension]

  备注:

    [DescriptiveName] 是描述文件内容的有意义的名字

    [Extension] 是程序默认的自己产生的或者与现有程序兼容的扩展名。例如:一个文本文件应该对应的扩展名是 .txt 而不是 .exe

  示例:

  C#

    ConfigDataReader.cs

  C# Project files:

Files

Convention

Example

Class file

[DescriptiveName].vb

Authentication.vb

VB.NET Project file

[DescriptiveName].vbproj

BusinessObjects.vbproj

Solution files

[DescriptiveName].sln

BusinessObjects.sln

Executable

[DescriptiveName].exe

ChartMaintenence.exe

Dynamic link library

[DescriptiveName].dll

DataAccess.dll

  VB.NET

    ConfigDataReader.vb

  

  VB.NET Project files:

Files

Convention

Example

Class file

[DescriptiveName].vb

Authentication.vb

VB.NET Project file

[DescriptiveName].vbproj

BusinessObjects.vbproj

Solution files

[DescriptiveName].sln

BusinessObjects.sln

Executable

[DescriptiveName].exe

ChartMaintenence.exe

Dynamic link library

[DescriptiveName].dll

DataAccess.dll

文件头(FILE HEADER INFORMATION)

  规则:

  任何可编辑的文本编辑器(非二进制文件)的文件必须包含一个文件头信息,包括:

  1) 一个文件内容的简短描述

  2) 作者信息,例如:作者姓名

  3) 创建日期

  4) 文件修改日志,包括:作者,修改日期,修改描述

  示例:

  C#  

C# 文件注释
////////////////////////////////////////////////////////////////////////////////
//
// File Description :
// -----------------------------------------------------------------------------
// Date Created : DD MMM YYYY (e.g. 01 Dec 2005)
// Author : <author name>, <company name>
// -----------------------------------------------------------------------------
// CHANGE HISTORY
// Date Modified : DD MMM YYYY (e.g. 01 Dec 2005)
// Changed By :
// Log ID :
// Change Description :
//
////////////////////////////////////////////////////////////////////////////////

  VB.NET

VB 文件注释
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
''
'' File Description :
'' ------------------------------------------------------------------------------
'' Date Created : DD MMM YYYY (e.g. 01 Dec 2005)
'' Author : <author name>, <company name>
'' ------------------------------------------------------------------------------
'' CHANGE HISTORY
'' Date Modified : DD MMM YYYY (e.g. 01 Dec 2005)
'' Changed By :
'' Log ID :
'' Change Description :
''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

命名空间

  规则:

  1)应该以整个项目的缩写作为开头,跟着是层次(分层结构的项目)的缩写,然后是模块名称或者命名空间。

  2)命名空间应用于定义或者生命新的类型,类,接口 等。

  3)命名空间应该是一个有意义的名字,最好给出功能提示。

  4)应该定义命名空间层次的方式,避免引起歧义。

  5)始终要声明实现文件顶部使用的命名空间。

  示例:

  C#

  namespace OA.UserInfo.UI 

  {
    ......
  }
  namespace OA.DocInfo.UI
  {
    ......
  }

  VB.NET

  Namespace OA.UserInfo.UI 

  ......
  End Namespace
  Namespace OA.DocInfo.UI
  ......
  End Namespace

  示例2:

  C#

  using OA.UserInfo.UI; 

  VB.NET

  Imports OA.UserInfo.UI

  规则:
  1) 类名应该有意义,最好是给出一个类的功能提示

  2) 以一个大写字母开头,其余文字首字母大写。例如:UIController ,EmployeeManager

  3) 类的名字应该是描述生活中的实体,这样可以很容易的识别类,提高代码的可读性。

  4) 如果一个类派生自另一个类,那么应该将基类名作为后缀名。
    例如:StudentFrom是从From 类派生的。
                EmployeeDataSet 是从DataSet类派生的。

  5) Public,protect,private,internal 不同的访问修饰符修饰的方法或者类应该分开,分为不同的组。

  6) 在类名中使用下划线是不允许的。

  7) 在类名前不要使用任何前缀。

类摘要和方法头(CLASS SUMMARY AND FUNCTION HEADER)

  规则:

  1) 一个类必须有一个和文件头信息一样的摘要。请参考文件头信息。

  2) 任何一个方法必须有一个摘要描述。请参考,注释、摘要和Region。

 方法

  规则:

  1)一个方法名应该是一个有意义的名字,通常情况下应该以动词开始名词结束。

        例如:CalculateInvoiceTotal()。

  2)方法名中的每一个单词都应该以大写字母开头,其余的字母小写。
          例如:GetEmployeeDetails(), GetPassword() 等等。

  3)方法体包括注释,变量声明在内的所有行,应该不超过100行。

  4)如果方法是bool类型的计算,或者返回值为bool类型应该以Is 作为前缀。
          例如:IsWorkStationLocked()。

  5) 不要使用.NET方法库中已经存在的名称。

  6)每一行代码从开始到结束不应该超过100个字符,包括标签和空格。如果有超过请换行。增加可读性。

  7)方法与方法之间添加一行空行。

属性

  规则:

  1) 一个C#中成员属性,应该有一个有意义的名称,比如描述功能或者适用于哪个领域。

  2) 通常情况下,属性的名称应该是它适用的字段名称相同或描述的功能,它应该是一个有意义的名词。

  3) 名称中每个单词都应该大写首字母,其余小写。

  4) 重复是多余的,我们应该省去。
       例如:Book.BookTitle错误,应该使用Book.Title。

  5) 属性应该都有注释。请参考,注释、摘要和Region。

  示例:

属性
public class Employee 
{
private string strName;
public string Name
{
get
{
return strName;
}
set
{
strName = value;
}
}
}

常量

  规则:

  1) 所有的数值应该被定义为符号常量。所有的其他常量(字符串,bool)都应该被定义为符号常量。

  2) 常量名字都应该大写,单词之间应该用下划线分割,例如:NUM_DAYS_IN_WEEK

  3) 所有常量的定义都在类文件的顶部。使用配置文件在存储应用程序级的常量。

  4) 使用的常量应该给以适当的注释。

  示例:

  const int NUM_DAYS_IN_WEEK = 7;

变量

  一般规则:

  1) 变量应该声明在尽量小的范围内以增强代码的可读性。

  2) 每个变量都应该在声明或者第一次使用的时候初始化。

  3) 由于大多数名称都是由多个单词组成,变量名应该以小写字母开始,其余单词应该大些首字母。

  4) 最好不要用.NET 关键字或者方法库中的方法名称。

  5) 根据他们的数据类型,应该参考下表作为前缀。

  变量名及其前缀表格

SR No. Data Type Prefix Example
1. Boolean bln blnActiveFlag
2. Byte byt bytAccountType
3. Char chr chrRegistrationCode
4. Currency cur curSalesAmount
5. Date dte dteIssueDate
6. Decimal dec decGameScore
7. Double dbl dblMilleage
8. Integer int intRenewalCount
9. Long lng lngFileCount
10. Object obj objPeople
11. Short shr shrAccountType
12. Single sgl sglRevenue
13. String str strCompanyName

  备注:

  1) 变量名能够很好的表示其功能。

  2) 在变量名结尾追加计算限定符(Avg, Sum, Min, Max, Index)

  3) 使用习惯中相反的词语,如开始/结束,最大/最小,打开/关闭。

  4) 避免用术语‘Flag’来命名状态变量,应为状态变量可能有两个以上的值。例如:我们不用DocumnetFlag ,用DocumentFormatFlag。

  5) 即使只有几行代码的临时变量,我们也要使用有意义的名称。

类成员变量

  规则:

  1) 所有的变量都应使用有意义的名称,不同访问修饰符的应该分开,请参考2.2.1。

  2) 所有的非公共成员都应该以小写字母开头,其他单词首字母大写。

  3) 成员变量应该合理的分组,提高可读性。

  4) 通常情况下在类中是没有公共成员变量的,如果有请参照 类中的详细要求。

  示例:

类成员变量
public class Employee 
{
private string strFirstName;
private string strLastName;
private string strPassword;
protected string strSalary;

public bool GetEmployeeDetails(int intEmpId)
{
string strName = "";
}
}

可识别的标示符

  下面的表格中提到了一些容易识别的前缀,当我们起名字的时候应该参考以下2点:

  1)描述功能的有意义的名称

  2)每一个单词首字母都应该大写

  标示符及其前缀表格

Identifier Prefix\Suffix Example
Class None AppDomain
Enum type None ErrorColor
Enum values None Red
EventHandler Suffix EventHandler MouseOverEventHandler
EventArgs Suffix EventArgs KeyEventArgs
Exception class Suffix Exception AppException, Note Always ends with the suffix Exception.
Interface Prefix I IBanking,Note Always begins with the prefix I.
Custom Attributes Suffix Attribute MyCustomAttribute
Method None IsCustomerIDMissing
Namespace None MyProject
Function Parameter None EmployeeName
Property None BackColor

命名类型

  在其名称的时候大小写应该参照以下类型:

  1)Pascal Casing-每个单词的首字母大写,例如:BackColor

      2)Camel Casing-除了第一个单词外,其他单词的首字母大写,例如:backColor

  3) Upper Casing-所有字母都要大写

Identifier Case Example
Class Pascal AppDomain
Enum type Pascal ErrorColor
Enum values Pascal Red
Variables Camel backColor,empId,phoneNo,personNRIC
Property Pascal BackColor
Method Pascal IsCustomerIdMissing
Function Parameter Camel employeeAge
Constant Variable Upper Case MATH_PI

注释、摘要和Region

  规则:

  1) 有需要就加注释,如:有Flags 需要修改或者检查。

  2) 不要在行尾加注释,在行尾加注释更不容易阅读。在发布之前移除所有的无关的注释。

  3) 如果今天来不及完成的代码,请注释,明天可以继续,方便我们以后阅读。

  4) 使用注释来解释代码的意思。

  5) 在分支或者虚幻上边加注释,协助以后的读者阅读。

  6) 在所有的比较困难或者复杂的代码块前使用注释。

  7) 添加注释可以用‘//’,‘/*……*/’可能注释掉代码块外的内容。在方法头使用‘///’来添加注释。

  8) 整个应用程序使用统一的风格,常量命名和结构。

  9) 类,方法,属性 前面必须添加注释,增加可读性。

  10)每个类应该有4个默认的Region
     Member Variables
     Private Method
     Protect Method
     Public Method
     也可以由额外的region。

  11)你可以在Visual Stdio 中生成XML文档说明,如果你用‘///’然后VS就能找到,这些特定元素。如果需要产生XML文档,则Rebuild 项目就可以生成。

  12)尽量不要注释代码,除非这些代码你今后还打算用到。(如果注释今后打算用到的代码请在注释中添加 TODO)

   示例:

  C#

C#文件
////////////////////////////////////////////////////////////////////// 
//
// File Description : Data Access Object for Employee.
// ----------------------------------------------------------------
// Date Created : 28 Jan 2012
// Author : XYZ, ADF
// ----------------------------------------------------------------
// CHANGE HISTORY
// Date Modified :
// Changed By :
// Log ID :
// Change Description :
//
//////////////////////////////////////////////////////////////////////

using System;
using System.Data;

namespace ASPTest
{

/// <summary>
/// This class contains all functionality and data related to an
/// employee.
/// </summary>
public class Employee : IHuman

{
#region Member Variables

private string strFirstName;
private string strLastName;
private string strPassword;
protected decimal decSalary;

#endregion

#region Public Methods

/// <summary>
/// This constructor initializes....
/// </summary>
public Employee()

{
// Code Implementation
}


/// <summary>
/// This constructor does....
/// </summary>
/// <param name="intEmpId">Employee Id</param>
public Employee(int intEmpId)

{
// Code Implementation
}


/// <summary>
/// This will remove the objects from memory.
/// </summary>
~Employee()

{
// Code Implementation
}


/// <summary>
/// Gets or Sets Password.
/// </summary>
public string Password

{
get
{
return strPassword;
}
set
{
strPassword = value;
}
}

/// <summary>
/// To get all the details of an employee.
/// </summary>
/// <param name="intEmpId">Employee Id</param>
/// <returns>Returns true/false.</returns>
public bool GetEmployeeDetails(int intEmpId)

{
// Code implementation
}


/// <summary>
/// To get all Employees from the database.
/// </summary>
/// <returns>Returns true/false.</returns>
public bool GetAllEmployees()

{
// Code Implementation
}


#endregion

}
}



  

posted on 2012-01-29 13:34  David Lee  阅读(321)  评论(0)    收藏  举报

导航