編程規範

維基教科書,自由的教學讀本
編程規範[編輯]
第一章 術語定義[編輯]
 * **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
第九章 其他[編輯]
 - 尽量不要在生产服务器添加测试数据,若有必要这样做,要在测试后,立即删除测试数据