第一部分:界面设计标准
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
链接类:
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;}
表格类:
td
{font-size: 12px; line-height: 20px; text-decoration: none;}
文本框类:
.inputPM
{BORDER-RIGHT: #99ccff 1px solid; BORDER-TOP: #99ccff 1px solid; BORDER-LEFT: #99ccff 1px solid; BORDER-BOTTOM: #99ccff 1px solid; HEIGHT: 22px}
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)
几点补充
:
1.
控件datagrid的数据显示:文字(短)居中对齐;文字(长)左对齐;日期左对齐;数字左对齐;金额左对齐,千位符
2.
控件text的长度MaxLength按数据结构要求设置
3.
因为操作主要跟数据库相关,所以控件类型可以与数据表字段(field)类型形成对应,此处约定为:
字段类型为文本、数字时,控件使用文本框
字段类型为布尔值时,控件使用单项选择按钮(checkbox控件)或下拉框
字段内容在固定的几个值中选择时(不论其类型),控件使用下拉框
字段类型为日期时间时,控件使用文本框+按钮(按钮可以选择日期,按钮.Value=”…”)
字段为其它表的外键,则分为两种情况:
a)
、如果是属于基本资料的,控件使用下拉框。
b)
、如果不是属于基本资料的,控件使用文本框+按钮(按钮用于跳出查询窗口,按说钮.Value=”…”
数据操作窗口一般为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
.
测试原则:如果不能让自己满意的程序,他人也一样不会满意