编码规范

   1. 项目管理规范

1.1.  研发平台以及工具

    开发平台Microsoft Visual Studio 2008

    开发语言 C#

    数据库 Microsoft SqlServer 2005

    版本管理 SVN

    数据库操作模型 Grove 2008  

    Ajax控件集 AjaxControlToolkit.dll 3.0

    工作流开发组件  Microsoft Workflow

    报表 Microsoft Report

    数据库开发  数据库中联合查询必须使用视图,不允许使用SQL语句查询。基于数据库兼容性的考虑,一般情况下不允许使用存储过程,函数等可编程性数据库对象,若有功能需求必须用到的有软件部门开会通过后才可使用。

    注:如有其它的第3方控件集经过项目点经理批准后可以使用。

1.2.项目结构

    数据层:基于Grove的数据库访问模型 完成对数据库的所有操作

    实体层:基于Grove生成的数据库实体对象以及自定义对象模型

    逻辑操作层:按模块封装处理项目逻辑流程的方法,属性,接口等等,通过数据层访问数据库,进行逻辑,流程处理,为用户层提供数据。

    用户层:接收用户操作命令交由逻辑操作层处理,处理后的结果呈现给用户。

注:在用户层中不允许出现数据库操作以及工作流程,逻辑的处理。

2. 项目开发流程

2.1.  项目整体流程

需求调研->项目结构设计->模块功能点确定->制定开发计划->数据库设计->项目结构框架搭建->界面设计->代码开发->单元测试->系统集成->整体测试->实施与维护

2.2.  研发人员工作流程

了解系统整体需求->接受任务->了解功能点以及工作流程->页面设计->代码开发->代码级测试->上传源代码->提交工作日志->接受项目经理检查->接受新的任务

 

3. 代码规范
3.1.  命名规范
3.1.1. 命名空间

(1)命名空间命名采用Pascal风格,取名规则如下。

公司名称英文简写.项目名称英文简写.______

例如:

YG.SCM.Food

另外,需要用复数的时候要使用复数的名称空间名。例如,使用System.Collections而不是System.Collection。但是,当遇到缩写形式时,不使用复数。例如:使用System.IO而不是System.IOs。

(2)名称空间和类不能使用同样的名字。例如,有一个类被命名为Student后,就不允许再使用Student作为一个名称空间。

3.1.2. 类

C#中的类命名采用Pascal命名风格,取名的规则如下。

(1)在为类命名前首先要知道该类的作用,以名词或名词短语命名,能够通过类名了解类的基本功能。

(2)不使用缩写,而用全写。例如:使用CollegeStudent而不用CollegeStu。

(3)不使用任何类前缀(例如C)和后缀(例如Class)。

(4)不使用带下划线的字符(例如College_Student)。

下面是一个合理的类名的示例。

代码19-1  类命名示例

/// <summary>

/// 类名:Pascal命名风格,形如SomeClass。

/// </summary>

pulibc class CollegeStudent

{

      …

}

3.1.3. 私有成员

类的成员变量采用Camel风格,并使用前缀_。下面是一些合理的私有成员示例。

class CollegeStudent

{

      /// <summary>

      /// 私有成员命名:Camel命名风格,形如member。

      /// </summary>

      private string _name;

      private int _age;

}

另外,不使用数据类型前缀来确定参数的数据类型。例如strName、nAge等。

3.1.4. 属性

类的属性采用Pascal风格。下面是一些合理的属性示例。

Class CollegeStudent

{

      /// <summary>

      /// 属性命名:Pascal命名风格,形如Name。

      /// </summary>

      Public string Name

      {

            Set

            {

                     If (value!=null)

                            this.m_name=value;

            }

            Get

            {

                     Return this.m_name;

            }

      }

}

3.1.5. 方法

通常每个方法都是执行类的一个“动作”,所以对方法的命名应该清楚地说明该方法是做什么的,用“动词+名词”的结构清晰的表达方法的含义。例如,用ShowInfo()代替Info(),用LoadData()代替DataLoad(),这样做的目的是更加明确这个方法的功能。

下面是一些合理的方法名示例。

代码19-4  方法命名示例

Class CollegeStudent

{

      /// <summary>

      /// 方法名:Pascal命名风格,形如SomeMethod。

      /// </summary>

      public void EnterSchool() {…}

}

另外,使用一些前缀来表达方法的含义,如下。

(1)Is的含义为问一个关于某样事物的问题。例如:IsMale()。

(2)Get的含义为取得一个数值。例如:GetInfo()。

(3)Set的含义为设定一个数值。例如:SetInfo()。

3.1.6. 方法参数

C#中,方法的参数采用camel风格。

3.1.7. 接口

同方法相似,接口采用Pascal命名规范,取名的规则如下。

(1)使用I作为前缀,表示其为一个接口。

(2)使用名词或名词短语,或者描述行为的形容词来命名接口。例如IComponent(描述性名词)、ICustomAttributeProvider(名词短语)和IPersistable(形容词)。

(3)尽量不使用缩写,而用全写。例如:使用IComponent而不用IComp。

(4)不要使用带下划线的字符(例如ICustom_AttributeProvider)。

例如:

代码19-6  接口命名示例

class CollegeStudent

{

      /// <summary>

      /// 接口名:Pascal命名风格,形如ISomeInterface。

      /// </summary>

      public interface IPlay{};

}

3.1.8. 变量

局部变量采用Camel风格,并尽量使用描述性强的名词或名词短语,并且不使用缩写,如使用number,而不使用num。下面是一些变量命名的示例。

int number=0;

string sqlString=””;

double averageScore=0.0;

CollegeStudent collegeStudent=new CollegeStudent();

3.1.9. 控件

    控件命名使用名词或动词+名词,描述控件用途。采用Camel风格, 并使用前缀 ‘控件类型_’,而不要使用系统自动生成的名字。下面是一些合理的控件示例。下面是一些控件命名的示例。

txt_name

lb_name

gv_userList

3.1.10.  数据库对象

(1) 数据库表的命名使用名词或名词短语,用以描述表的用途,使用Pascal风格并使用前缀‘项目简称_‘  下面是一些表命名的示例。

PL_User

F_Food

(2)视图的命名使用名词或名词短语,用以描述表的用途,使用Pascal风格,并使用前缀‘ 项目简称_View_’。下面是一些视图命名的示例。

 PL_View_ UserMessage

F_FoodDetail

3.2.  编程规范

3.2.1. 不可将多个类放在一个文件里面。

3.2.2. 一个文件只能有一个命名空间,不可将多个命名空间放在同一个文件里面。

3.2.3. 一个文件最好不要超过500行的代码(不包括机器产生的代码)。

3.2.4. 一个方法的代码长度最好不要超过25行。

3.2.5. 方法的参数不可超过5个,若有超过5个的需要,定义结构体来传递参数。

3.2.6. 每行代码不要超过80个字符。

3.2.7. 不要手工的修改机器产生的代码,如果必须要编辑机器产生的代码,编辑格式和风格要符合该编码标准。

3.2.8. 在设计到算法,流程的代码旁用‘//’对代码进行注释。

3.2.9. 避免使用方法级的文档。

        a)  使用‘//’在代码旁注释。

        b)  只有在该方法需要被其他的开发者使用的时候才使用方法级的注释。(在C#中就是///)

3.2.10.  只有是自然结构才能直接使用const,比如一个星期的天数。

3.2.11.  不要在只读的变量上使用const。如果想实现只读,直接使用readonly。

        public class MyClass

        {

            public readonly int Number;

            public MyClass(int  someValue)

            {

                Number = someValue;

            }

            Public const int DaysInWeek = 7;

        }

3.2.12.  代码的每一行都应该通过白盒方式的测试。

3.2.13.  只抛出已经显示处理的异常。

3.2.14.  在捕获(catch)语句的抛出异常子句中(throw),总是抛出原始异常维护原始错误的堆栈分配。

    Catch (Exception exception)

{   

    MessageBox.Show (exception. Message);

throw ;  //和throw exception一样。

}

3.2.15.  避免方法的返回值是错误代码。

3.2.16.  尽量避免定义自定义异常类。

3.2.17.  当需要定义自定义的异常时:

    a)  自定义异常要继承于ApplicationException。

    b)  提供自定义的序列化功能。

3.2.18.  避免在单个程序集里使用多个Main方法。

3.2.19.  只对外公布必要的操作,其他的则为internal。

3.2.20.  不允许给枚举变量提供显式的值。

//正确方法

public enum Color

{

    Red, Green, Blue

}

//不允许

Public enum Color

{

Red = 1, Green = 2, Blue = 3

}

3.2.21.  不允许指定特殊类型的枚举变量。

//不允许

Public enum Color: long

{   

Red, Green, Blue

}

3.2.22.  即使if语句只有一句,也要将if语句的内容用大括号扩起来。

3.2.23.  不允许在条件语句中调用返回bool值的函数。可以使用局部变量并检查这些局部变量。

    Bool IsEverythingOK ()

    {…}

    //不允许

    If (IsEverythingOK ())

    {…}

    //正确方法

    Bool ok = IsEverythingOK ();

    If (ok)

    {…}

3.2.24.  总是使用基于0开始的数组。

3.2.25.  在循环中总是显式的初始化引用类型的数组。

    Public class MyClass

    {}

    MyClass [] array = new MyClass [100];

    For (int index = 0; index < array. Length; index++)

    {

    Array [index] = new MyClass ();

    }

3.2.26.  不要提供public 和 protected的成员变量,使用属性代替。

3.2.27.  不可在继承中使用new而使用override替换。

3.2.28.  在不是sealed的类中将public 和 protected的方法标记成virtual的。

3.2.29.  除非使用interop(COM+ 或其他的dll)代码否则不要使用不安全的代码(unsafe code)。

3.2.30.  不要显示的转换,使用as操作符进行兼容类型的转换。

    Dog dog = new GermanShepherd();

    GermanShepherd shepherd = dog  as  GermanShepherd;

    If (shepherd! = null)

    {…}

3.2.31.  当类成员包括委托的时候 在调用委托之前一定要检查它是否为null

    Public class MySource

    {

        Public event EventHandler MyEvent;

        Public void FireEvent()

        {

            EventHandler temp = MyEvent;

            If (temp! = null)

            {

                Temp (this, EventArgs.Empty);

            }

        }

    }  

3.2.32.  不要提供公共的事件成员变量,使用事件访问器替换这些变量。

    public class MySource

    {

        MyDelegate m_SomeEvent ;

        Public event MyDelegate SomeEvent

        {

            Add

            {

                m_SomeEvent += value;

            }

            Remove

            {

                m_SomeEvent -= value;

            }

        }

    }

3.2.33.  类和接口中的方法和属性至少为2:1的比例。

3.2.34.  一个接口中不可只有一个成员。

3.2.35.  尽量使每个接口中包含3-5个成员。

3.2.36.  接口中的成员不应该超过20个。 实际情况可能限制为12个。

3.2.37.  接口成员中不要包含事件。

3.2.38.  不要使用抽象方法,使用接口替换。

3.2.39.  使用显式的接口实现。

3.2.40.  从不假设一个类型兼容一个接口。

Defensively query for that interface.

SomeType obj1;

IMyInterface obj2;

/* 假设已有代码初始化过obj1,接下来 */

obj2 = obj1 as IMyInterface;

If (obj2! = null)

{

 obj2.Method1 ();

}

Else

{

//处理错误

}

3.2.41.  表现给最终用户的字符串不要使用硬编码而要使用资源文件替换。

3.2.42.  不要硬编码可能更改的基于配置的字符串,比如连接字符串。

3.2.43.  当需要构建长的字符串的时候,使用StringBuilder不要使用string

3.2.44.  在结构里面不可提供方法。

3.2.45.  如有需要尽量使用参数化构造函数

3.2.46.  必须给静态变量提供静态构造函数。

3.2.47.  不要使用Goto语句。

3.2.48.  在非必要的情况下,不要使用this, base指针。

3.2.49.  避免有从System. Object转换来和由System. Object转换去的代码,而使用强制转换或者as操作符替换。

class SomeClass

{}

//避免:

class MyClass<T> 

{   

void SomeMethod(T t)   

{

object temp = t;      

SomeClass obj = (SomeClass)temp;    

}

}

// 正确:

Class MyClass<T> where T: SomeClass

void SomeMethod(T t)   

{

SomeClass obj = t;   

}

}

3.2.50.  不要定义有限制符的接口。接口的限制级别可以用强类型来替换。

public class Customer

{…}

//避免:

public interface IList<T> where T : Customer 

{…}

//正确:

public interface ICustomerList : IList<Customer> 

{…}

4. 页面设计规范

4.1.  页面项目结构

    一个页面项目必须且只允许存在一个Resource文件夹。Resource文件夹下包含images,css,js三个子文件夹,分别存储图片文件,样式文件,脚本文件。如有其他资  源文件可添加子文件夹。

4.2.  页面风格统一美观

    页面中的样式必须引用界面设计人员设计的样式表,相同功能的控件引用的样式表必须一致。页面布局尽量自适应浏览器大小。

4.3.  页面操作简单合理。

5. 源代码管理

5.1.研发人员只允许下载本人所在项目组的项目源文件。

5.2.研发人员只允许维护本人的源代码以及数据库视图,在特殊情况下需要修改他人源代码或数据库视图,需要经过项目经理同意才可操作,并通知源代码或视图的开发人员。

5.3.研发人员在完成一个单元功能后,必须及时上传源代码到源代码管理服务器。

5.4.研发人员在下班之前无论工作是否完成,都必须上传所有源代码到源代码管理服务器,当天代码必须当天上传。

5.5.研发人员在上传源代码时必须保证源代码编译正确,不允许上传错误代码(编译不通过)。若特殊情况下有未完成的源代码需要上传,必须屏蔽掉错误。

5.6.在上传源代码时不允许上传项目文件以及Debug文件夹。删除文件后必须在文件夹中上传删除信息。

5.7.项目经理必须在每月5号前,将自己所管理项目的源代码以及数据库刻盘备份,交给公司制定负责人统一管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来杯水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值