ASP.NET编程规范
第一部分:界面设计标准
1.开发环境设置:屏幕设置为800*600/1024*768
2.界面设计原则:风格必须统一
3.B/S结构开发原则:使用框架/模板
4.页面使用表格(Table)进行格式设置。
最外面的表格设置:width=778px align=center border=0
5.主页面Body设置:bgcolor="#cccccc"
6.框架子页面Body设置:bottomMargin="0" leftMargin="0"
7.对齐:文字(标签)右对齐;数字(数据)右对齐;文字(数据)左对齐,比较短的可以居中对齐;金额,需加上 千位符
8.冒号必须是在中文输入状态下键入
9.控件使用原则:尽可能使用Html控件,需要提交而又不用在客户端使用Javasrcipt的可以使用Web控件
10.控件使用约定:
(1)控件外观设置:style.css
i.i 链接类:
a:link {font-size: 12px;line-height: 20px;text-decoration: none; color: #666666}
a:visited {font-size: 12px;line-height: 20px;color: #666666;text-decoration:
none;}
a:hover {font-size: 12px;line-height: 20px;color: #FF6600;text-decoration:
underline;}
a:active {font-size: 12px;line-height: 20px;color: #666666;text-decoration:
underline;}
i.ii 表格类:
td{font-size: 12px; line-height: 20px; text-decoration: none;}
i.iii 文本框类:
.inputPM{BORDER-RIGHT: #99ccff 1px solid; BORDER-TOP: #99ccff 1px solid;
BORDER-LEFT: #99ccff 1px solid; BORDER-BOTTOM: #99ccff 1px solid;
HEIGHT: 22px}
i.iv datagrid类:
.dg_grid /* Grid-总体 */
{font-size:12px; border-style:solid; border-width:2px; border-color:White;
text-align:center; vertical-align:middle;}
.dg_header /* Grid-页眉 */
{font-weight :bold ; color:#E7E7FF; background-color :#3366CC; text-align:center;
vertical-align:middle; height:25px;}
.dg_alter /* Grid-交替行 */
{background-color :AliceBlue; height:22px;}
.dg_item /* Grid-普通行 */
{color :Black; background-color:WhiteSmoke; height:22px;}
.dg_page /* Grid-页导航 */
{color:Black; text-align:right; vertical-align:middle; height:22px;}
.dg_select{font-weight :bold ; color:White; background-color :#9471DE;} /* Grid-选择行 */
(2)几点补充:
ii.i 控件datagrid的数据显示:文字(短)居中对齐;文字(长)左对齐;日期左对齐;数字左对齐;金额左对齐,千位符
ii.ii 控件text的长度MaxLength按数据结构要求设置
ii.iii 因为操作主要跟数据库相关,所以控件类型可以与数据表字段(field)类型形成对应,此处约定为:
u 字段类型为文本、数字时,控件使用文本框
u 字段类型为布尔值时,控件使用单项选择按钮(checkbox控件)或下拉框
u 字段内容在固定的几个值中选择时(不论其类型),控件使用下拉框
u 字段类型为日期时间时,控件使用文本框+按钮(按钮可以选择日期,按钮.Value=”…”)
u 字段为其它表的外键,则分为两种情况:
a)、如果是属于基本资料的,控件使用下拉框。
b)、如果不是属于基本资料的,控件使用文本框+按钮(按钮用于跳出查询窗口,按说钮.Value=”…”
u 数据操作窗口一般为DataGrid+录入框
a)、DataGrid用于显示数据
b)、录入框用于输入/显示数据
c)、浏览窗口基本样式,主要以表格形式显示纪录,单表控件使用DataGrid/DataList/Repeater,多表使用NestedDataGrid
第二部分:命名规范
1. 按钮ID命名:btn+按钮操作功能(如btnSave)
2. 其它控件:
I. 与数据操作相关:其ID<.SPAN>为相应的字段名称,如果有多个控件对应一个字段,则按以下规范命名:
字段名+”_”+顺序号(以01开头)
例子:页面有一TextBox控件,对应着数据库表中的RightGroup字段,则其ID应命名为 RightGroup
如果页面有二个TextBox控件,都对应着数据库表中的PowerGroup字段,则其ID分别命名为PowerGroup_01, PowerGroup_02,依此类推
II. 其它:前缀+用途功能(如txtInput),前缀请看表一:
控件
前缀
控件
前缀
Form
frm
Class
cls/C
Module
mod
Label
lbl
LinkLabel
lnk
Button
btn
TextBox
txt
CheckBox
chk
RadioButton
rad
GroupBox
grp
PictureBox
pic
DataGrip
grd
ListBox
lst
CheckedListBox
clst
ComboBox
cbo
TreeView
tvw
ListView
lvw
TabControl
tab
DateTimePicker
dtp
Timer
tmr
Splitter
spl
ProgressBar
pbar
RichTextBox
rtf
ImageList
imgl
ToolBar
tlb
MenuItem
mnu
(表一)
3. 变量及常量命名规范:
I. 页面及过程级变量:级别标识+数据类型前缀+<名词|名词组合>
A、 页面级变量:级别标识为m (例子:dim mstrNewline as string)
B、 过程级变量:级别标识为 l (例子:dim lstrNewline as string)
II. 页面间变量:采用request传递获取
命名原则:级别标识+数据类型前缀+<名词|名词组合>
级别标识为p
例子:url=”XXXX.aspx?pstrLine=bbbbb&pintNum=11”
Dim lstrLine as string=Request(“pstrLine”)
Dim lintNum as integer=request(“pintNum”)
III. 全级变量:级别标识+数据类型前缀+<名词|名词组合>
A、 级别标识:g(例子:dim gstrNewline as string)
B、 因为在所有的页面都能使用,所以须有足够长的名称以说明变量,并加上注释
C、 统一在模块中定义
D、全级变量的定义必须经过项目主管的同意后才能进行
IV. 通用变量:采用session赋值
a、 命名原则:级别标识+数据类型前缀+<名词|名词组合>
b、 级别标识为g(例子:session(“gstrNewline”)=””)
c、 因为在所有的页面都能使用,所以须有足够长的名称以说明变量,并加上注释
d、 通用变量统一放在Global.asax中的Session_Start(sender,e)过程中,初始值赋予空字符串。并在Session_End(sender,e)过程中释放掉。
例子:
Global.asax文件:
Sub session_star(byval sender as Object,byval e as EventArgs)
Session(“gstrUser”)=””
End sub
Sub session_End(byval sender as Object,byval e as EventArgs)
Session(“gstrUser”)=nothing
End sub
e、 通用变量的定义必须经过项目主管的同意后才能进行
V. 数据类型前缀:
数据类型
前缀
数据类型
前缀
String
str
Date
dat
Boolean
bln
Short
sht
Decimal
dec
Long
lng
Integer
int
Byte
byt
Char
chr
Single
sgl
Double
dbl
Structure
udt
Object
obj
DataSet
ds
DataRow
dr
OleDbConnection
conn
SqlConnection
conn
OleDbCommand
cmd
SqlCommand
cmd
OleDbDataAdapter
da
SqlDataAdapter
da
OleDbDataReader
rdr
SqlDataReader
rdr
Crystal Report
rpt
(表二)
4. 过程(函数)命名规范:
I. 命名规范:级别标识+<动名词结构>
II. 应用于单一页面:级别标识为p(例子:private function pDisdata())
III. 应用于全部页面:级别标识为g(例子:public function gDisdata())
5. 页面命名规范:模块标识+程序功能英文缩写
I. 例子:有基本资料模块,其模块标识为Base,程序使用的英文缩写为Unit,则页面名称为BaseUnit
II. 此命名只能由项目主管或系统分析设定
6. 存储过程命名规范:
I. 命名规范:[项目名称前的两个字母]+[程序使用英文缩写]+[_]+[存储过程功能标识]
II. 如果项目名称是大写,则转换为小写
III. 例子:项目名称为DKERP,程序作用的英文缩写为Unit,存储过程的功能是保存,则可命名为dkUnit_Sav
IV. 存储过程功能标识约定:
u 存储过程功能为保存的,其标识为Sav
u 存储过程功能为删除的,其标识为Del
u 存储过程功能为查询的,其标识为Qry
u 存储过程功能为填充到控件的,其标识为Back
u 存储过程功能为绑定下拉框控件的,其标识为Dll
V. 存储过程命名与规划必须经过项目主管的同意后才能进行
7. 类的命名规范:
I. 原则:[Cls]+<名词|名词组合|动名词组合>,名词|动词的第一个字母大写
II. 例子:ClsDataOperate
III. 公共类的定义与命名必须经过项目主管的同意后才能进行
8. 模块的命名规范:
I. 原则:[Mod]+<名词|名词组合|动名词组合>,名词|动词的第一个字母大写
II. 例子:ModDataConnection
III. 公共模块的定义与命名必须经过项目主管的同意后才能进行
9. 用户控件命名规范:
I. 原则:[Url]+ <名词|名词组合|动名词组合>,名词|动词的第一个字母大写
II. 例子:UrlDataLoad
III. 用户控件的定义与命名必须经过项目主管的同意后才能进行
第三部分:编码规范
1. 注释
A. 每个页面的开始必须有下面格式的注释
’*********************************************
'页面名称: frmStyleE
'作用/描述: 款式查询
'输入/发送:
' strUserList(): 被搜索的用户列表。
' strTargetUser: 要搜索的用户名。
'输出/返回格式: 在rasUserList 数组中rsTargetUse的第一次出现的索引。
' 如果目标用户没找到,返回-1。
'原作者: Raymnod Fok 2002-1-1
'原作日期:
'修改者:
'修改日期:
'备注:
'************************************************
注:左对齐,中间隔开4个Tab位(每个Tab缩进4位)
B. 所有变量及常量均要有注释
C. 每个过程(函数)也应该有注释,以描述这个过程(函数)的功能,以下是注释的格式
'***********************************************
'函数名称: intFindUser
'目的: 在用户列表数组中找出一个指定用户的第一次出现位置。
'输入/发送:
' strUserList(): 被搜索的用户列表。
' strTargetUser: 要搜索的用户名。
'输出/返回格式: 在rasUserList 数组中rsTargetUser的第一次出现的索引。
' 如果目标用户没找到,返回-1。
'参数: intCol 需要获得内容的当前文本
'原作者: Raymnod Fok 2002-1-1
'原作日期:
'修改者:
'修改日期:
'备注:
'************************************************
Function pintFindUser (strUserList() As String, strTargetUser As String)As Integer
Dim i As Integer ' 循环计数器。
Dim blnFound As Integer ' 目标寻找标志。
intFindUser = -1
i = 0
While i <= Ubound(strUserList) and Not blnFound
If strUserList(i) = strTargetUser Then
blnFound = True
intFindUser = i
End If
Wend
End Function
D. 过程(函数)或存储过程内部的注释方法
应按功能块分,注释应写在每一小段算法或一个小功能之前,不要与代码、注释搞成一团
E. 若是在程序代码后面写上注释,则在代码语句后面三个Tab位开始写注释
F. 如果注释是针对程序中的部分代码,需注明该段代码的开始和结束部分
G. 存储过程也应该写上注释,以下是存储过程注释的格式
/*
存储过程名: TSellMain_Qry
作用:查询表 Sell_SellRecordMain的数据
输入:
输出:表 Sell_SellRecordMain的所有数据
原作者: quanysq
日期:
修改者:
修改日期:
备注:
*/
CREATE PROCEDURE TSellMain_Qry
AS
select * from Sell_SellRecordMain
GO
2. 格式化代码
A. 嵌套块应有严格的层次缩进(每一层分别缩进1个Tab,注:每个Tab为4个英文字符)
B. 一个过程或函数不能太长,大致上应限制在200行内,否则应将其拆分为多个过程或函数
C. 当产生长字符串时,使用下划线连接字符产生多行代码
D. 对数据库进行访问数据库、保存、删除、显示数据等操作时,统一使用公用类。
E. 在制作界面时,要对照标准,做到界面与流程要求达到一致,界面也要符合标准的规范
F. 在读取数据显示到界面时,要对照流程的要求与数据库中的表和字段的有效性了解清楚,做到显示的数据完全正确
G. 在处理操作界面数据时,要对照数据库中数据有效性达到一致,数据与流程达到一致,并保证数据有效。数据要合理性(如:数量应该小于0或大于0,小数点等等)
H. 在保存数据处理中,要做到所见即所得,就是保存的数据要与界面数据相一致,并对照流程切保数据符合流程的要求。
I. 在读取数据显示到界面、界面数据操作、保存数据操作要多使用过程或函数,尽量减少控制点,使程序系统化
J. 对于变量的命名,切记要规范
K. 在程序中要多加注释,使程序更加清楚
L. 在退出页面时,必须在Page_Disposed(sender,e)事件中释放掉会驻留在内存的变量,主要是Session变量、DataSet变量
M. 流程图必须简要地规划出程序的流程,其中列出实现该功能的模块的名称
N. 流程图命名:与程序名相同
O. TextBox 控件的Enabled属性为False时,其背景颜色必须设为灰色(颜色名称: Silver)
P. 切换当前的控件,除了VB.net本身默认的Tab键外,再加上Enter键
Q. 关于并发控制,一般采取事务+锁的方式处理,有三种情况:
a. 锁定整个表,通常发生在查询大量数据时,使用TABLOCKX提示.
示例:
CREATE PROCEDURE TSellMain_Qry
AS
Begin transaction
select * from Sell_SellRecordMain with (TABLOCKX)
if @@ERROR > 0
ROLLBACK
Else
COMMIT ----提交或回滚事务时释放锁
GO
b. 在更新表中所有记录时申请排它锁,防止在提交事务之前记录受其他用户的影响.
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
示例:
CREATE PROCEDURE Ttesthr_Update
AS
Begin transaction --开始事务
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE --申请排它锁,防止在提交事务之前记录受其他用户的影响
Update testhr set hrcode=’aaa’
if @@ERROR > 0
ROLLBACK
Else
COMMIT ----提交或回滚事务时释放排它锁
GO
c. 如果只是更新表中一行或者多行记录时使用行级锁.
With (RowLock)
示例:
CREATE PROCEDURE Ttesthr_Update
AS
Begin transaction --开始事务
Update testhr with (rowlock) set hrcode=’aaa’ where hrcode=’bbb’
if @@ERROR > 0
ROLLBACK
Else
COMMIT ----提交或回滚事务时释放排它锁
GO
R. 程序中处理错误一般使用以下结构
try
…代码
catch
…错误信息
finally
…释放有可能驻留在内存中的变量
end try
第四部分:测试规范
1. 在测试前,以概要设计说明书.详细设计说明书作为总的提纲,选择合适的输入输出数据.
2. 按功能模块分别测试
3. 在测试过程中,首先需要对各子单元过程进行测试,在各子单元过程测试完毕后,再对各模块(包括各子单元过程之间的接口)进行测试,处理好各模块之间的接口,最后对系统进行测试和维护。
4. 测试中需要加以注意的问题:
a. 数据类型不匹配.
如: 姓名 string 旅行目的地 string
性别 string 旅行时间 date
工作单位 string (年/月/日 yy/mm/dd)
身份证号码 long int 定票/取票 boolean
b. 数据超出规定范围
如:性别只能是‘男’或‘女’;身份证号码按规定必须是13位;旅行时间必须在定票的当天过一天以后; 等等
c. 数据库限定必须输入的在程序中有没有检验?
d. 数据库限定值为唯一的在程序中有没有检验?
e. 控件datagrid的分页程序是否已写好,有没有检验?
f. 控件datagrid各列的宽度是否已分配好?
g. 链接是否正确?
h. 代码是否已经简洁,会不会留下一些安全隐患?
i. 其它意料之外有没有一定的预防代码?
j. 是否符合需求?需求是否明确?
5. 测试原则:如果不能让自己满意的程序,他人也一样不会满意