编程规范

维基教科书,自由的教学读本
编程规范[编辑]
第一章 术语定义[编辑]
 * **Pascal 大小写**

将标识符的首字母和后面连接的每个单词的首字母都大写。可以对三字符或更多字符的标识符使用Pascal 大小写。例如: BackColor

 * **Camel 大小写**

标识符的首字母小写,而每个后面连接的单词的首字母都大写。例如: backColor


第二章 命名规范[编辑]

代码[编辑]

除了参数、私有的实例字段、方法内的变量使用Camel命名;其它情况,如类、公有字段、方法名、属性名等都使用Pascal;与共有字段相配对的私有字段以m_开始 如:

 * 参数

public void SampleMethod(Int32 testVar1,Int32 testVar2) { }

 * 私有的实例字段

class SampleClass {

   private String sampleString;

}

 * 方法内的变量

public void SampleMethod(Int32 testVar1,Int32 testVar2) {

   String sampleMethod;

}

 * 与共有字段相配对的私有字段

private Int32 m_Handle; public Int32 Handle {

   get
   {
       return handle;
   }

}

控件[编辑]

主要控件名简写对照表\\ 控件名简写+英文描述,英文描述首字母大写 ^ 控件名 ^ 简写 ^ 控件名 ^ 简写 ^ 控件名 ^ 简写 ^ 控件名 ^ 简写 ^ | Label | **lbl** | TextBox | **txt** | RadioButtonList | **rdl** | Image | **img** | | Button | **btn** | LinkButton | **lnkbtn** | Panel | **pnl** | Repeater | **rpt** | | ImageButton | **imgbtn** | DropDownList | **ddl** | Table | **tbl** | HyperLink | **lnk** | | ListBox | **lst** | DataGrid | **dg** | RequiredFieldValidator | **rfv** | CompareValidator | **cv** | | DataList | **dl** | CheckBox | **chk** | RangeValidator | **rv** | RegularExpressionValidator | **rev** | | CheckBoxList | **chl** | RadioButton | **rdo** | ValidatorSummary | **vs** | SqlDataReader | **sdr** | | DataRow | **dr** | DataSet | **ds** | DataTable | **dt** | | |

样式表[编辑]

 * 类名遵循Pascal大小写
 * 类取名的原则是通过类名,能够看得出此样式的用处或者基本样式特性:
   * 指出样式的特性,如:.Section__Blue__(蓝色区块),.Main__Center__Div(居中的主区块)
   * 指出样式的用途,如:.LatestNews(最新新闻),.WeeklyReport(一周报告),这样的命名适用于某个频道或者页面,其名字在一个页面上一般是唯一的
   * 价值中国的通用样式
     * span.LiTitle, span.LiDate(li中左右两列样式)
     * div.clearer(样式清除器,因修改成本太大,目前只有这个没有遵循Pascal命名规则)
     * .HSpace0x(x一般为5,这是间隔x像素的横条)
 * 适用于特定标签的类名前要加上标签名:

div.SectionBlue{ } td.Alternating{ } li#HighLight{ }

 * 样式的类定义遵循HTML标签的层次关系(通用样式除外)

如:

样式表定义: div.SectionBlue{ } div.SectionBlue ul#LatestNews{ } div.SectionBlue ul#LatestNews li.Alternating{ } span.LiTitle{ } /*通用样式*/ span.LiDate{ } /*通用样式*/

文件、目录、URL[编辑]

文件、目录命名均遵循Pascal;\\ 如:

 * /User/UpdateInfo.aspx
 * /UserControls/User/UserInfo.ascx

URL(包括参数)遵循Pascal\\ 如:

 * /User/Message.aspx?UserID=n
 * /Search.aspx?Keyword=x&Source=s




数据库[编辑]

    • 表、字段**\\

遵循Pascal命名规则

 * 表,如:Blog、BlogComment
 * 字段,如:UserID、MdyTime、Content
    • 索引**\\

非聚集索引:IX_表名_索引字段\\ 如:

 * IX_BlogEntry_Passed_AddTime
 * IX_UserInfo_LastLoginTime
    • 存储过程**\\

pr_表名_动作\\

 * 比如你要删除一本书:pr_Book_Delete;
 * 或者你要修改一篇文章:pr_Boke_Modify(或update);
 * 或者你要列出一本杂志的信息:pr_Mag_Select(或Show);
    • 视图**\\

vi_Pascal命名规则,如:vi_Boke、vi_BokeComment

    • 触发器**\\

tr_表名_Insert[Update|Delete],如:

 * tr_Book_Insert
 * tr_BlogEntry_Delete
    • 注意:除非没有替代解决方案,严禁使用触发器**

如果这个存储过程并不是通用的,你可以在存储过程的末尾增加这个存储过程使用的场合,

 * 比如你要在个人主页列表书籍:pr_Book_List_AuthorIndex
    • 常用字段命名规范**\\
 AddTime:添加时间,MdyTime:修改时间,Adder:添加者,Mdyer:修改者,IsXXX:是否XXX(如IsElite:是否推荐,IsHide:是否隐藏),XXXs:XXX数量(如Hits:点击数,Comments:评论数,Elites:推荐数,Digs:推荐数)

8-o **注意:表、字段的命名必须以英文字母开始**

第三章 空行[编辑]

空行是为了将逻辑上相关联的代码分块,以便提高代码的可阅读性。

    • 在以下情况下使用两个空行**
 - 接口和类的定义之间。
 - 枚举和类的定义之间。
 - 类与类的定义之间。        
    • 在以下情况下使用一个空行**
 * 方法与方法之间。

public void SampleMethod1(Int32 testVar1, Int32 testVar2) { }

public void SampleMethod2(Int32 testVar1, Int32 testVar2) { }

 * 方法中变量声明与语句之间。

public void SampleMethod1(Int32 testVar1, Int32 testVar2) {

   String sampleVar1;
   String sampleVar2;
   Response.Write("Sample");

}

 * 属性与属性之间。

public String SampleProperty1 {

   get { }
   set { }

}

public String SampleProperty2 {

   get { }
   set { }

}

 * 方法中不同的逻辑块之间。

public void SampleMethod1(Int32 testVar1, Int32 testVar2) {

   Int32 multiplyResult = testVar1 * testVar2;
   Response.Write(multiplyResult);
   Int32 plusResult = testVar1 + testVar2;
   Response.Write(plusResult);

}

 * 方法中的返回语句与其他的语句之间。

public Int32 SampleMethod1(Int32 testVar1, Int32 testVar2) {

   Int32 multiplyResult = testVar1 * testVar2;
   Response.Write(multiplyResult);
   return multiplyResult;

}

 * 属性与方法、属性与字段、方法与字段之间。

public String SampleField1;

public String SampleProperty1 {

   get { }
   set { }

}

public void SampleMethod2(Int32 testVar1, Int32 testVar2) { }

 * 注释与它注释的语句间不空行,但与其他的语句间空一行。

public void SampleMethod1(Int32 testVar1, Int32 testVar2) {

   //将两数相乘
   Int32 multiplyResult = testVar1 * testVar2;
   //输出相乘结果
   Response.Write(multiplyResult);

}



第四章 注释[编辑]
    • 注释原则**
 * 为了防止问题反复出现,对错误修复和解决方法代码总是使用注释;
 * 注释代码中不十分明显的任何内容;
 * 修改代码时,总是使代码周围的注释保持最新;
 * 在声明接口、类、方法、属性、字段时,都应该用.Net的XML型文档注释

/// <summary> /// 示例类 /// </summary> class SampleClass {

   /// <summary>
   /// 字体颜色代码,16进制
   /// </summary>
   public String FontColor;
   /// <summary>
   /// 新闻数量
   /// </summary>
   public String Counts
   {
       get { }
       set { }
   }
   /// <summary>
   /// 计算两个整数相乘的结果并输出
   /// </summary>
   /// <param name="testVar1">乘数</param>
   /// <param name="testVar2">被乘数</param>
   public void SampleMethod1(Int32 testVar1, Int32 testVar2)
   {
       //将两数相乘
       Int32 multiplyResult = testVar1 * testVar2;
       //输出相乘结果
       Response.Write(multiplyResult);
   }

}



第五章 申明[编辑]
 - 一行只做一个申明
 - 建议在申明时就做初始化
 - 申明建议放在代码块的开始,而不要在使用时才申明,循环中的i,j等除外
 - 不要使用public 或 protected 的实例字段。避免将字段直接公开给类以外的开发人员。考虑为字段提供 get 和set 属性访问器,而不是使它们成为公共的。 get 和 set 属性访问器中可执行代码的存在使得可以进行后续改进。示例:

private Int32 m_Handle; public Int32 Handle {

   get
   {
       return m_Handle;
   }

}


第六章 语句[编辑]

本章就一句话:即使if else的代码段中只有一个语句,也要加大括号




第七章 数据库约定[编辑]
 * **新建表、存储过程等数据库对象时,对象名一定要写上其所有者**,例:

正确: CREATE TABLE [dbo].[SpiderNewsDigRelation] CREATE PROCEDURE [dbo].pr_Common_Delete 错误: CREATE TABLE SpiderNewsDigRelation CREATE PROCEDURE pr_Common_Delete

 * **SQL语句的关键词一律大写**

正确: SELECT Field1, Field2 FROM Table1 WHERE Field1 = 'Condition' AND Field2 = 2 ORDER BY Field3 DESC SELECT A.Field1 FROM Table1 A INNER JOIN Table2 B ON A.ID = B.ID 错误: select Field1, Field2 from Table1 where Field1 = 'Condition' and Field2 = 2 order by Field3 desc Select A.Field1 From Table1 A Inner Join Table2 B On A.ID = B.ID



第八章 协作[编辑]
 - 修改文件之前,要在  StarTeam 里先**刷新**,看有无其他同事锁定,如果有,要通知锁定该文件的同事解锁;
 - 如果要修改的文件没有被其他同事锁定,要先锁定,再修改
 - 当次的任务没有完成之前,**禁止** Check In 任何你锁定的文件
 - 当确认自己的任务**完成**(需要经过良好的测试),需要**部署**时,再根据部署文档逐一 **Check In 并 解锁** 自己修改的文件
 - 为了不至于自己长时间锁定某文件,影响其他同事的开发,请将自己的任务拆分为粒度较小的多个任务,使之能较短时间(不超过2天)开发、部署完毕
 - Template:Knowledge base:部署文档示范.rar
第九章 其他[编辑]
 - 尽量不要在生产服务器添加测试数据,若有必要这样做,要在测试后,立即删除测试数据