C#开发规范

来源:互联网 发布:程序员被前妻 编辑:程序博客网 时间:2024/05/03 18:59

一、 项目开发模式

1.开发架构(三层架构)

1) 表现层(UI)

2) 业务逻辑层(BLL)

3) 数据访问层(DAL)


二、 命名规范

1.数据库设计

数据库字段默认值 ( default ) 非必要不设定

 

1) 数据库名称:系统名称+DB     EX: play_data

2) 表:T + 功能模块名          EX: t_member

3) 字段:f + _字段名,          EX: f_accounts

3) 视图:view_视图功能名称     EX: view_reports

4) 方法:fun_功能名称          EX: fun_sum

5) 存储过程:pro_功能名称      EX: pro_show_total

6) 触发器:trg_功能名称        EX: trg_update_record

7) 任何牵涉的数据库结构变动/或修改都要在群里面讨论

2.程序集开发

CompanyName.TechnologyName 这样,我们看到的名称空间应该是这样的: Microsoft.OfficePowerSoft.PowerBuilder 注意:这只是一个原则。第三方公司可以选择其它的名字。 避免用公司名称或其它著名品牌的名称作为名称空间的前缀,这样会造成两个公布的名称空间有同一个名称的可能性。例如: 将微软提供的Office自动类命名为Microsoft.Office 使用Pascal大写方式,用逗号分隔逻辑成分。

例如:Microsoft.Office.PowerPoint

如果你的品牌使用的是非传统大写方式,那么一定要遵循你的品牌所确定使用的大写方式,即使这种方式背离了通常的名称空间大写规则。例如:Macrowing.WebObjects ee.cummings

3.类名称

类的命名原则是用名词或名词短语命名类,使用Pascal大写。减少类名中缩写的使用量量。不要使用任何类前缀(比如C,不要使用带下划线的字符,系统生成类库除外。 例如:

public class FileStream { }                  

public class Button { }

public class String { }

4.接口命名

使用名词或名词短语,或者描述行为的形容词来命名接口,使用Pascal大写。 减少接口名中缩写的使用量,在接口名前加前缀I,以表示这个类型是一个接口。

例如:

IComponent(描述性名词)

ICustomAttributeProvider(名词短语)

IPersistable(形容词)

5. 函数命名

函数和方法的命名应该以动词开始,使用Pascal大写。不要使用带下划线的字符。例如:InitNameArray CloseDialog

6.参数命名

使用描述性参数名。参数名应该具有足够的描述性,这样在大多数情况下参数名和它的种类可以用来确定它的意思。根据参数的意思来命名参数,而不是根据参数的种类来命名。我们希望开发工具可以用很方便的方式提供关于参数种类的信息,这样参数名可以得到更好的使用,可以对语义而不是对种类进行描述。不要使用保留参数。如果在下一个版本中需要更多的数据,可以增加进来。例如:

publicType GetType (string typeName) { ......}

public string Format (string format,object [ ] args) { ...... }

如果该参数是 out 类型,则请在加上 o_ 前缀,例如:

public bool TryGetUserID(out string o_UserID) { ...... }

如果该参数是 ref 类型,则请在加上 r_ 前缀,例如:

public bool TryGetUserName(ref string r_UserName) { ...... }

 

加上 o_ 与 r_ 的目的是为了提示作用,提醒程序员若修改该参数内容,将会同步改变叫用端传入的引数。

7.属性命名

使用名词定义属性,属性使用Pascal规则,首字符大写。属性和相应字段名称要关联,可以使用“重构”菜单来生成属性。

8.全局变量

静态(static):

s + 下划线 + 名称中各单词首字母均为大写,单词之间需要大写. 例如: s_ProgName

非静态(member  field):

m + 下划线 + 名称中各单词首字母均为大写,单词之间需要大写. 例如: m_UserName

举例:

public class LogicInfor

{

    private static string s_ProgName;

    private string m_UserName;

}

 

使用 s 与 m 前缀的目的是为了方便识别该变量的作用范围。

9.局部变量

名称中各单词首字母均为小写,单词与单词需大写。 例如:对于string类型定义,使用s前缀 +Pascal命名的方式,int 比如

string sSQL = string.Empty;

int iTotal = 0;

bool bFlag = true;

 

这是一种典型的命名SQL语句字符串的方式 而对于此外的类型对象定义,

可以使用代表该类的前缀 +Pascal命名的方式,比如:

StringBuilder sbWebAddress = new StringBuilder();

在以下情形下,通常不加代表该类的前缀:

10. 枚举命名

使用 E + Pascal规则命名,名称中各单词首字母均为大写, 枚举值从小到大顺序定义。例如:

public enum  ETableType

使用 E前缀 是为了能让后续维护人员能一眼就看出 ETableType 是一个枚举。

11. 常量命名

全大写,各单词以下划线隔开

EX : public const int ADJUST_MULTIPLE_FACTOR = 3;

12. 控件命名

控件前面必须加上代表该控件类之缩写。缩写方式请参考“名称缩写” 之章节

1) asp:HiddenField        àhdf +名称 例:hdfUserID

2) asp:TextBox                 àtxb+名称   例:txbUserName

3) asp:DropDownList       àddl +名称  例:ddlUserType

4) asp:CheckBox              àckb+名称  例:ckbUserType

5) asp:CheckBoxList       àcbl +名称  例:cblUserLanguage

6) asp:RadioButtonList   àrbl +名称  例:rblUserLanguage

7) asp:Image                      àimg +名称  例:imgUserIcon

8) asp:ListBox                  àltb +名称  例:ltbGames

 

13.名称缩写

在一般情况下,我们都不要使用缩写命名,我们从来不害怕长的变量命名,而却担心看不懂的命名。变量命名的原则是,尽最大努力让其他人在看到我们的变量/函数/„等的第一时间,大概能猜出它是做什么的,以及它属于什么类。 比如:

int  iProductTypeCount= 0;

我们在第一时间就能知道它是记录产品数量的变量

 

而对于糟糕的命名方式:

int  ptc = 0;  

它是productTypeCount的简写,但是其他人或者我们在长时间以后还能知道它是做什么的吗?也许我们不得不查阅相关文档或跟踪代码前后文以明白其意义。

 

我们应该认为:最优秀的代码它本身就是注释。我们需要做的,并不在于当时潦草的去实现些什么,而是要让我们的代码具备让他人维护或今后扩充的能力

 

但经常使用的单词是可以缩写的,因为大家都知道,若不能确保大家都知道,则必须加上注释,或者就不要使用缩写,缩写时必须遵守以下原则:

a.     长单词缩写方式有三种:

I.            去掉母音,比如:passwordà pwd,listà lst

II.         取前几个字母,比如:

command à comm, connectionà conn,arrayà arr, dictionaryà dict

III.     取首尾字母,中间加 x ,比如: transactionà txn

b.   多个单词组合缩写:去每个单词的首字,比如:CheckBoxListà cbl

三、 注释规范

1.文件头注释

在代码文件的头部进行注释,标注出创始人、创始时间、修改人、修改时间、功能描述,这在团队开发中必不可少,它们可以使后来维护/修改的同伴在遇到问题时,在第一时间知道他应该向谁去寻求帮助,并且知道这个文件经历了多少次迭代、经历了多少个程序员的手。样本: /***************************************************************************

** 作者: 大明

** 创始时间:2010-10-20

** 描述:主要用于产品信息的资料录入,„

**

** 修改时间:2010-10-21

** 修改人:小明

** 修改描述XXXXXXXX

*************************************************************************/

我们甚至可以在这段文件头注释中加入版权信息、文件名、版本信息等。

2.类、函数、属性、接口等注释

请使用///三斜线注释,这种注释是基于XML的,不仅能导出XML制作帮助文档,而且在各个函数、属性、类等的使用中,编辑环境会自动带出注释,方便你的开发。以protectedprotectedInternalpublic声明的定义注释请都以这样命名方法。例如:

/// <summary>

/// 比赛结果

/// 创建人:lzy

/// </summary>

public classTS_GameResult_Ajax : AjaxBase

{

}

3.逻辑点注释

注釋 統一都加 code 裡  不加在 html 裡。

在逻辑性较强的地方需加入注释,说明这段程序的逻辑是怎样的,以方便我们自己后来的理解以及其他人的理解,并且这样还可以在一定程度上排除BUG。在注释中写明我们的逻辑思想,对照程序,判断程序是否符合我们的初衷,如果不是,则我们应该仔细思考耀修改的是注释还是程序了„

 

4. 善用 #region  #endregion

当一段相当复杂的逻辑使用多行源代码实现时,除了必要的注释外,若没有将该段代码整理独立成一函数时,则必须使用 #region #endregion 来示意该段代码是一完整之逻辑。

四、 代码规范

1.排版

1)每行语句至少占一行,如果语句过长(超过一屏),则该语句断为两行显示

2)把同一个功能模块或者同一功能的内容放在一起,比如数据成员、属性、方法、事件等,

并适当的使用#region„#endregion.

3) 使用空格

a)双目操作符的前后加空格(+,=, && 等),index = index + 1;

b) 单目操作符前加空格(!, ++, ~)index ++;

c)逗号、分号只在后面加空格

4) 使用空行,在一段功能代码、或者函数、属性之间只能插入一行空行.

2. 代码可读性规划

1)注意运算符的优先级,我们应该尽量使用括号明确表达式的操作顺序,避免使用默认优先级,给我们以及维护人带来困扰.

2) 避免使用不易理解的数字,用有意义的标识来替代(枚举和常量)

例如: if (intProductType == 0)

elseif (intProductType == 1)

 

需要替换成:

if  (productType == EProductType.Normal)

else  if  (ProductType == EProductType.Customize)

3) 代码中关系较为紧密的代码应尽可能相邻.

例如:使用objProductType.Name,而不是objProductType. Name

4) 在界面层中尽量使用异常处理try语句,不要将错误的消息直接暴露给用户,而更应该的是把系统抛出的错误信息记录到LOG日志文件中去,告诉用户友好的提示信息

3.  if , for 条件式皆必须使用 { } ,即使内容只有一行。

    比如: if  (productType !=  EProductType.Normal)

          {

                 DoAlarmAction();

           }

           for (inti = 0; i < lstUsers.Count;++i)

           {

                 LogUser(lstUsers[i]);

           }

4.  全局变数(static data) 或 类成员(field)不可为public,比如:

public class VIPUser : UserBase

{

    // 不可为 public

    protected override  string  m_UserName;   

 

    // 此方法可让外界间接修改 field: m_UserName 之值

    public  string UserName

    {

         get {  return m_UserName; }

         set {  m_UserName = value;}

    }

}

此目的是为了防止外界直接修改该类成员(field),因此而丧失了扩充性。

如果想让外界间接修改该类成员(field),则可以搭配使用属性的方式来进行变更。

5. 函数内容必须与函数名称一致

函数内容不可以做出函数名称未表达的其他事,比如:

 

// 检查指定使用者是否有指定权限

public boolCheckUserAuthority(string sUserID, string sProgramID)

{

List<string> lstAuth = GetUserAuthorityList(sUserID);

for (int i = 0; i < lstAuth.Count; ++i)

{

if (lstAuth[i].ProgramID == sProgramID)

{

RecordUserAccessProgram(sUserID, sProgramID); ß 不可做出函数名称未表达的事

   return true;

        }

}

return  false;

}

 

如同上例,当使用者有权限执行指定程序时,会额外 记录使用者存取该权限,但此记录动作并没有体现到函数名称上面!正确的方式可采用

a. 修改函数名称以体现 记录使用者存取该权限 之动作

b.让叫用此 CheckUserAuthority(…) 之呼叫端 来进行此记录动作,比如:

    bool isUserHavingAuth = CheckUserAuthority(sUserID,sProgID);

    if (isUserHavingAuth)

{

        RecordUserAccessProgram(sUserID,sProgramID);

}

如此,各个函数名称就完整体现出各自的功用,这样才能带来后续便利的维护与有弹性的扩充。

五、 JS说明

1. JS命名规范

1) 方法: 大写字母开头,多个单词第一个字母大写。 例(ProductName)

2) 变量:小写,多个单词取各单词第一字母大写,首字母小写。例(sProductName)

3) 类:用大写开头,多个单词第一个字母大写。例(BrowerType)

4) 全局变量:用大写字母,多个单词用下划线隔开。 例(PRODUCT_ARGS)

 

1、定义变量或者常量应分行定义,避免一行定义多个变量造成混淆:

Var iNumberA = 1;

Var iNumberB = 2;

2、在if 语句中,即使只有一行也要包含在大括号中;

大括号在使用时要单独占一行,例如:

IF (iNumber > 100){

iNumber =100;

}

ELSE{

iNumber =200;

}

0 0
原创粉丝点击