e)类命名规则
类名应该为名词及名词短语,尽可能使用完整的词.
使用Pascal规则。
不要使用类前缀-。
不要使用下划线字符(_)。
不要使用任何类前缀(比如C)。
有时候需要提供以字母I开始的类名称,虽然该类不是接口。
只要I是作为类名称组成部分的整个单词的第一个字母,这便是适当的。
例如,类名称IdentityStore就是适当的。
在适当的地方,使用复合单词命名派生的类。
派生类名称的第二个部分应当是基类的名称。
例如,ApplicationException对于从名为Exception的类派生的类是适当的名称,原因是ApplicationException是一种Exception。
请在应用该规则时进行合理的判断。
例如,Button对于从Control派生的类是适当的名称。
尽管按钮是一种控件,但是将Control作为类名称的一部分将使名称不必要地加长。
publicclassFileStream{}
f)接口命名规则
接口名称应该为名词及名词短语或者描述其行为的形容词,尽可能使用完整的词.
(Example:
IComponentorIEnumberable)
使用Pascal规则。
使用字符I为前缀,并紧跟一个大写字母(即接口名的第一个字母大写)
publicinterfaceIComponent{}
g)枚举命名规则
对于Enum类型和值名称使用Pascal规则。
少用缩写。
不要在Enum类型名称上使用Enum后缀。
publicenumFileMode
{
Create,
CreateNew,
Open,
OpenOrCreate,
Truncate
}
h)静态常量使用名词及名词短语命名规则
使用Upper规则(全部大写,中间用下划线分隔)
intPI=3.1415926
i)参数及非常量变量命名举例
使用描述性的命名,名称应该明确表达参数的意义及类型,优先满足参数的意义描述
使用Camel规则
不要对字段名或静态字段名应用前缀。
具体说来,不要对字段名称应用前缀来区分静态和非静态字段。
例如,应用g_或s_前缀是不正确的。
j)WebUI类的变量命名可以通过特定的规则加入前缀
TypeGetType(stringtypeName)
使用Pascal规则
k)对方法名采用一致的动词/宾语或宾语/动词顺序。
例如,将动词置于前面时,所使用的名称诸如InsertWidget和InsertSprocket;将宾语置于前面时,所使用的名称诸如WidgetInsert和SprocketInsert。
推荐名称应该为动词或动词短语.例如Save,SaveCustomer,而不要使用CustomerSave。
不要在方法中重复类的名称。
例如,如果某个类已命名为Book,则不要将某个方法称为Book.CloseBook,而可以将方法命名为Book.Close。
l)属性命名规则
名称应该为名词及名词短语
使用Pascal规则
对于bool型属性或者变量使用Is(is)作为前缀,不要使用Flag后缀,例如应该使用IsDeleted,而不要使用DeleteFlag
publicenumColor{...}
m)集合命名规则
名称应该为名词及名词短语
使用Pascal规则
名称后面追加“Collection”
n)事件命名规则
eventhandlers命名使用EventHandler后缀.
两个参数分别使用sender及e
使用Pascal规则
事件参数使用EventArgs后缀
事件命名使用语法时态反映其激发的状态,例如Changed,Changing.
考虑使用动词命名.
publicdelegatevoidMouseEventHandler(objectsender,MouseEvente);
publicclassMouseEventArgs:
EventArgs
{
intx;
inty;
publicMouseEventArgs(intx,inty)
{
this.x=x;this.y=y;
}
publicintX
{
get{returnx;}
}
publicintY
{
get{returny;}
}
}
6.编码规则
6.1.错误检查规则
a)编程中要考虑方法的各种执行情况,尽可能处理所有流程情况。
b)检查所有的系统调用的错误信息,除非要忽略错误。
c)将方法分两类:
一类为与屏幕的显示无关,另一类与屏幕的显示有关。
对于与屏幕显示无关的方法,方法通过返回值来报告错误。
对于与屏幕显示有关的方法,方法要负责向用户发出警告,并进行错误处理。
d)错误处理代码一般放在方法末尾。
e)对于通用的错误处理,可建立通用的错误处理方法,处理常见的通用的错误。
6.2.大括号规则
将大括号放置在关键词下方的同列处,例如:
if(条件表达式) while(条件表达式)
{ {
... ...
} }
6.3.缩进规则
使用一个两个空格为每层次缩进。
例如:
voidfunc()
{
if(false)
{
if(true)
{
while(false)
{
}
}
}
}
6.4小括号规则
a)不要把小括号和关键词(if、while等)紧贴在一起,要用空格隔开它们。
b)不要把小括号和方法名紧贴在一起。
c)除非必要,不要在Return返回语句中使用小括号。
因为关键字不是方法,如果小括号紧贴着方法名和关键字,二者很容易被看成是一体的。
6.5 ifelse规则
如果你有用到elseif语句的话,通常最好有一个else块以用于处理未处理到的其他情况。
可以的话放一个记录信息注释在else处,即使在else没有任何的动作。
其格式为:
if(条件1) //注释
{
}
elseif(条件2) //注释
{
}
else //注释
{
}
注:
if和循环的嵌套最多允许4层
6.6比较规则
总是将恒量放在等号/不等号的左边。
一个原因是假如你在等式中漏了一个等号,语法检查器会为你报错。
第二个原因是你能立刻找到数值而不是在你的表达式的末端找到它。
例如:
if(6==errorNum)...
6.7Case规则
defaultcase总应该存在,如果不允许到达,则应该保证:
若到达了就会触发一个错误。
Case的选择条件最好使用int或string类型。
6.8 对齐规则
变量的申明和初始化都应对齐。
例如:
int m_iCount;
int i,j;
float m_fIncome,m_fPay;
m_iCount =0;
i =1;
m_fIncome=0.3;
6.9 单语句规则
除非这些语句有很密切的联系,否则每行只写一个语句。
6.10单一功能规则
原则上,一个程序单元(方法)只完成一项功能。
6.11简单功能规则
原则上,一个程序单元的代码应该限制在一页(25~30行)。
6.12独立赋值规则
嵌入式赋值不利于理解程序,同时可能回造成意想不到的副作用,应尽量编写独立的赋值语句。
例如:
使用“a=b+c; e=a+d;”而不用“e=(a=b+c)+d”。
6.13定义常量规则
对于代码中引用的常量(尤其是数字),应该申明一個const常量,在代码中引用名字而不直接引用值。
6.14模块化规则
某一功能,如果重复实现一遍以上,即应考虑模块化,将它写成通用方法。
并向小组成员发布。
同时要尽可能利用其它人的现成模块。
6.15交流规则
共享别人的工作成果,向别人提供自己的工作成果。
在具体任务开发中,如果有其它的编码规则,则在相应的软件开发计划中予以明确定义。
6.16当一个页面完成时,建议点击(或按Ctrl+E,D)重新编排文档。
(备注:
这适用于大部分文档类型,如html页面、cs页面、样式表等)
6.17建议当一个类页面完成时,应点击右键,选择“组织using”,点击“移除未使用的using”。
6.18编写代码时如要将数据类型转换,建议使用系统自定义的数据转换类进行相关转换,以免发生异常。
7.编程准则
7.1 变量使用
a) 一个变量只能有一个用途;变量的用途必须和变量的名称保持一致。
b) 变量定义就近原则。
7.2数据库操作
a)查找数据库表或视图时,建议只取出确实需要的那些字段,尽量避免使用*。
b)使用无关联子查询,而不要使用关联子查询。
c)清楚明白地使用列名,而不能使用列的序号。
d)用事务保证数据的完整性。
e)在Sql语句中使用除法时,为避免遇到以零作除数错误,建议除数写法为NULLIF(除数,0)。
7.3 对象使用
a)尽可能晚地创建对象,并且尽可能早地释放它。
7.4.模块设计原则。
a)不允许随意定义公用的方法和类。
b)方法功能单一,不允许一个方法实现两个及两个以上的功能。
c)尽量不要在方法部使用全局变量,如要使用全局变量,应转化为参数带入。
d)方法与方法之间只允许存在包含关系,而不允许存在交叉关系。
即两者之间只存在单方向的调用与被调用,不存在双向的调用与被调用。
e)模块与模块之间尽量为松耦合。
7.5 结构化要求
a) 禁止出现两条等价的支路。
例如:
voidfunc()
{
if(a==2)
{}
//
elseif(a==3){}
//
elseif(a==2){}
//
else{}
}
//
b) 避免使用goto语句
c) 用CASE实现多路分支
d) 不使用条件赋值语句。
e) 避免不必要的分支。
7.6方法返回值原则
1) 方法返回值
使用bool类型:
该方法只需要获得成功或者失败的返回信息时候
使用int类型:
错误代码用负数表示,成功返回0
7.7.使用region提高代码的可读性。
比如:
#region描述区域所实现的功能
//代码区域
#endregion
8.代码包规
本项目中,每个任务在完成一个稳定的版本后,都应打包并且归档。
8.1代码包的版本号
项目中,代码包的版本号由圆点隔开的两个数字组成,第一个数字表示发行号,第二个数字表示该版的修改号。
具体用法如下:
1)当代码包初版时,版本号为V1.00;
2)当代码包被局部修改或bug修正时,发行号不变,修改号第二个数字增1。
例如,对初版代码包作了第一次修订,则版本号为V1.01;
3)当代码包在原有的基础上增加部分功能,发行号不变,修改号第一个数字增1,例如,对V1.12版的基础上增加部分功能,则新版本号为V1.20;
4)当代码包有重要修改或局部修订累积较多导致代码包发生全局变化时,发行号增1。
例如,在V1.15版的基础上作了一次全面修改,则新版本号为V2.00。
8.2 代码包的标识
本项目所产生的代码包都有唯一、特定的编码,其构成如下:
S-项目标识-代码包类型-版本号/序号
其中:
1)S:
本项目的标识,表明本项目是“XXXX”。
2)项目标识:
简要标识本项目,此标识适用于整个项目的文档。
3)代码包类型:
取自以下表的两位字母编码。
4)版本号:
本代码包的版本号。
5)序号:
四位数字编码,指明该代码包在项目代码库的总序号。
例如:
一个Windows下RAR源码的压缩代码包命名为:
S-XXXX-WS-V1.02/0001
项目的代码包分类表
类型
编码
注 释
RAR包
(Windows)
源码文件
WS
源代码文件包
编译文件
WB
编译文件包
安装文件
WI
安装文件包
源码代码+安装文件
WA
源代码和安装文件包
项目中所有代码包的标识清单将在《项目开发计划》中予以具体定义。
9.源代码的管理
9.1.代码库/目录的建立
项目负责人在VSS中建立项目的文档库目录,即为“OldVersion”目录,以便快速查询。
9.2.代码归档
所有代码在完成一个稳定的版本后,项目负责人都应打包后,存放于VSS中该项目的“OldVersion”目录下,并且依据代码包的命名规为代码包分配一个唯一名称。
并在VSS中将项目打上版本标签,以便以后获取。
9.3.每天下班前要尽量把文件签入。
9.4.签出项目文件或解决方案时尽快签入,以免其他人员无法签出。
9.5.建议每天上班后立即获取最新版本,重新生成一次。
9.6.禁止将未编译通过的代码签入。
9.7.建议签入文件时填写注释,简要说明本次修改的容。
10.输入控制校验规则
10.1数据录入控制
a)TextBox输入
1、要保持用户输入和数据库接收的长度一致
2、必须用系统自定义的过滤方法进行非法字符过滤,特殊格式要进行输入合法性校验。
如:
E_mail格式 XXXXXX.XXX...
格式 8
(020)12345678
邮政编码是六位
11.数据库开发规则
11.1.数据表表名使用Pascal规则,尽量不使用下划线,字段名称也使用Pascal规则。
11.2.必须建立数据库字典,字典中每数据表都必须取一个相应中文名称,名称必须是唯一的,表中字段要取相应的中文名称,要有相应的中文注释来说明用途和规则。
11.3.在Sql语句中使用除法时,为避免遇到以零作除数错误,建议除数写法为NULLIF(除数,0)。
11.4.在编写视图时要用列名,禁止使用*。
(如:
要用SelectID,OrderIdFromOrder,而不能用Select*FromOrder)。
11.5.查找数据库表或视图时,建议只取出确实需要的那些字段,尽量避免使用*。
11.6.使用无关联子查询,而不要使用关联子查询。
11.7.用事务保证数据的完整性。
附录1:
服务器控件名缩写表
a、web控件
web控件名
缩写
AdRotator
art
Button
btn
Calendar
cal
CheckBox
cb
CheckBoxList
cbl
CompareValidator
cpv
CustomValidator
ctv
DataGrid
dg
DataList
dl
DropDownList
ddl
HyperLink
hl
Image
img
ImageButton
ibtn
Label
lbl
LinkButton
lbtn
ListBox
lb
Panel
pl
PlaceHolder
ph
RadioButton
rb
RadioButtonList
rbl
RangeValidator
rv
RegularExpressionValidator
rev
Repeater
rpt
RequiredFieldValidator
rfv
Table
tbl
TableCell
tcl
TableRow
tr
TextBox
txt
ValidationSummary
vs
XML
xml
b、html控件
html控件名
缩写
HtmlAnchor
hah
HtmlButton
hbtn
HtmlForm