保险管理信息系统开发规范.docx
《保险管理信息系统开发规范.docx》由会员分享,可在线阅读,更多相关《保险管理信息系统开发规范.docx(34页珍藏版)》请在冰点文库上搜索。
保险管理信息系统开发规范
1开发规范
开发规范侧重于编码书写的格式及语法要求方面。
1.1C#语言开发规范
1.1.1类、方法、属性、变量命名规范
1.1.1.1Class的命名
对于业务类的命名,Class的名字必须由两部分组成,第一部分是Ct**********或En,其中Ct代表为控制类,其**********原则上使用控制类对应的功能号,En代表实体类;第二部分是大写字母开头而其他字母都小写的多个表示类含义的英文单词组成。
所有接口的第一个字母为大写的I。
每个源程序文件只允许含一个Class。
1.1.1.2Class变量的命名
变量名采用英文单词的组合,第一个单词全小写,剩下单词首字母大写,最多不超过三个单词,其单词为代表实际意义的英文单词。
1.1.1.3常量的命名
常量的名字应该都大写,并且指出完整含义。
1.1.1.4参数的命名
参数名除了要求使用v开头外,其余要求和变量的命名规范一致。
1.1.1.5方法的命名
方法名采用英文单词的组合,以动词英文单词开头,第一个单词全小写,剩下单词首字母大写,最多不超过三个单词,其单词为代表实际意义的英文单词。
1.1.2代码书写规范
1.1.2.1格式及缩进
∙建立标准的缩进大小,使用Tab字符(Tab字符是四个空格宽度),并一致地使用此标准。
用规定的缩进对齐代码节。
∙在括号对对齐的位置垂直对齐左括号和右括号,如:
for(i=0;i<100;i++)
{
;
}
在整个源代码中使用那个样式。
∙沿逻辑结构行缩进代码。
没有缩进,代码将变得难以理解,如:
if(expression)
{
//
//此处填写你的代码块;
//
}
if(expression)
{
//
//此处填写你的代码块;
//
}
else
{
//
//此处填写你的代码块;
//
}
缩进代码会产生出更容易阅读的代码,如:
if(expression)
{
if(expression)
{
//
//此处填写你的代码块;
//
}
else
{
//
//此处填写你的代码块;
//
}
}
∙为注释和代码的右边界为110字符,当行长超过110但不超过120时可以不折行,否则超过110部份一律折入下一行,以避免不得不滚动源代码编辑器。
∙在运算符之前和之后使用空格,如a=b+c。
∙使用空白为源代码提供结构线索。
这样做会创建代码“段”,有助于读者理解软件的逻辑分段。
∙当一行内容太长而必须换行时,在后面换行代码中要使用缩进格式,如下:
stringinserString="InsertIntoTableName(username,password,email,sex,address)"
+"Values('Soholife','chenyp','soholife@','male','深圳福田')";
∙每一行上放置的语句不得超过一条。
∙将大的复杂代码段分为较小的、易于理解的模块。
1.1.3注释
1.1.3.1用于生成说明文档的注释
∙在第个源程序文档的首部应有该源程序的摘要说明,格式如下:
///
///类的名称。
///类的功能描述。
///程序员:
(每个对这个类进行过修改的人按顺序列上)
///类建立时间:
///最后修改时间:
///
∙在类的每个方法前面要加上该方法的说明,格式如下:
///
///方法的简要说明
///
///参数的含义
///参数的含义
///返回值的含义及类型
1.1.3.2代码中的注释
∙所有的注释以双斜杠开头,不使用“/*……*/”,除非是用这种方式将一段代码暂时屏蔽,但这种注释应在形成版本基线时全部去掉。
∙修改代码时,总是使代码周围的注释保持最新。
∙行尾注释只能用于变量说明部分,不能用于代码行中。
∙如果需要用注释来解释复杂的代码节,请检查此代码以确定是否应该重写它。
尽一切可能不注释难以理解的代码,而应该重写它。
尽管一般不应该为了使代码更简单以便于人们使用而牺牲性能,但必须保持性能和可维护性之间的平衡。
∙在编写注释时使用完整的句子。
注释应该阐明代码,而不应该增加多义性。
∙在编写代码时就注释,因为以后很可能没有时间这样做。
∙避免多余的或不适当的注释。
∙使用注释来解释代码的意图。
它们不应作为代码的联机翻译。
∙为了防止问题反复出现,对错误修复和解决方法代码总是使用注释。
∙对由循环和逻辑分支组成的代码使用注释。
这些是帮助源代码读者的主要方面。
∙在整个应用程序中,使用具有一致的标点和结构的统一样式来构造注释。
∙用空白将注释同注释分隔符分开。
在没有颜色提示的情况下查看注释时,这样做会使注释很明显且容易被找到。
1.2SQL语句编写规范
1.2.1格式规定
Oracle和SQLServer数据库本身的关键字、保留字、函数等全部采用大写,字段名、表名全部采用小写。
●Oracle数据库
Ø保留字列表:
首字母
保留字列表
A
ACCESS、ADD、ALL、ALTER、AND、ANY、AS、ASC、AUDIT
B
BETWEEN、BY
C
CHAR、CHECK、CLUSTER、COLUMN、COMMENT、COMPRESS、CONNECT、CREATE、CURRENT
D
DATE、DECIMAL、DEFAULT、DELETE、DESC、DISTINCT、DROP
E
ELSE、EXCLUSIVE、EXISTS
F
FILE、FLOAT、FOR、FROM
G
GRANT、GROUP
H
HAVING
I
IDENTIFIED、IMMEDIATE、IN、INCREMENT、INDEX、INITIAL、INSERT、INTEGER、INTERSECT、INTO、IS
J
K
L
LEVEL、LIKE、LOCK、LONG
M
MAXEXTENTS、MINUS、MLSLABEL、MODE、MODIFY
N
NOAUDIT、NOCOMPRESS、NOT、NOWAIT、NULL、NUMBER
O
OF、OFFLINE、ON、ONLINE、OPTION、OR、ORDER
P
PCTFREE、PRIOR、PRIVILEGES、PUBLIC
Q
R
RAW、RENAME、RESOURCE、REVOKE、ROW、ROWID、ROWNUM、ROWS
S
SELECT、SESSION、SET、SHARE、SIZE、SMALLINT、START、SUCCESSFUL、SYNONYM、SYSDATE
T
TABLE、THEN、TO、TRIGGER
U
UID、UNION、UNIQUE、UPDATE、USER
V
VALIDATE、VALUES、VARCHAR、VARCHAR2、VIEW
W
WHENEVER、WHERE、WITH
X
Y
Z
Ø函数列表:
函数类型
函数名
简单函数
数字函数
ABS、ACOS、ASIN、ATAN、ATAN2、BITAND、CEIL、COS、COSH、EXP、FLOOR、LN、LOG、MOD、POWER、ROUND、SIGN、SIN、SINH、SQRT、TAN、TANH、TRUNC、WIDTH_BUCKET
返回字符串的字符串函数
CHR、CONCAT、INITCAP、LOWER、LPAD、LTRIM、NLS_INITCAP、NLS_LOWER、NLSSORT、NLS_UPPER、REPLACE、RPAD、RTRIM、SOUNDEX、SUBSTR、TRANSLATE、TREAT、TRIM、UPPER
返回数字的字符串函数
ASCII、INSTR、LENGTH
日期函数
ADD_MONTHS、CURRENT_DATE、CURRENT_TIMESTAMP、DBTIMEZONE、EXTRACT、FROM_TZ、LAST_DAY、LOCALTIMESTAMP、MONTHS_BETWEEN、NEW_TIME、NEXT_DAY、NUMTODSINTERVAL、NUMTOYMINTERVAL、ROUND、SESSIONTIMEZONE、SYS_EXTRACT_UTC、SYSDATE、SYSTIMESTAMP、TO_DSINTERVAL、TO_TIMESTAMP、TO_TIMESTAMP_TZ、TO_YMINTERVAL、TRUNC、TZ_OFFSET
类型转换函数
ASCIISTR、BIN_TO_NUM、CAST、CHARTOROWID、COMPOSE、CONVERT、DECOMPOSE、HEXTORAW、NUMTODSINTERVAL、NUMTOYMINTERVAL、RAWTOHEX、RAWTONHEX、ROWIDTOCHAR、ROWIDTONCHAR、TO_CHAR、TO_CLOB、TO_DATE、TO_DSINTERVAL、TO_LOB、TO_MULTI_BYTE、TO_NCHAR、TO_NCLOB、TO_NUMBER、TO_SINGLE_BYTE、TO_YMINTERVAL、TRANSLATE...USING、UNISTR
其它函数
BFILENAME、COALESCE、DECODE、DEPTH、DUMP、EMPTY_BLOB、EMPTY_CLOB、EXISTSNODE、EXTRACT、EXTRACTVALUE、GREATEST、LEAST、NLS_CHARSET_DECL_LEN、NLS_CHARSET_ID、NLS_CHARSET_NAME、NULLIF、NVL、NVL2、PATH、SYS_CONNECT_BY_PATH、SYS_CONTEXT、SYS_DBURIGEN、SYS_EXTRACT_UTC、SYS_GUID、SYS_TYPEID、SYS_XMLAGG、SYS_XMLGEN、UID、UPDATEXML、USER、USERENV、VSIZE、XMLAGG、XMLCOLATTVAL、XMLCONCAT、XMLFOREST、XMLSEQUENCE、XMLTRANSFORM
分组用集合函数
AVG、CORR、COUNT、COVAR_POP、COVAR_SAMP、CUME_DIST、DENSE_RANK、FIRST、GROUP_ID、GROUPING、GROUPING_ID、LAST、MAX、MIN、PERCENTILE_CONT、PERCENTILE_DISC、PERCENT_RANK、RANK、REGR_SLOPE、REGR_INTERCEPT、REGR_COUNT、REGR_R2、REGR_AVGX、REGR_AVGY、REGR_SXX、REGR_SYY、REGR_SXY、STDDEV、STDDEV_POP、STDDEV_SAMP、SUM、VAR_POP、VAR_SAMP、VARIANCE
1.2.1.1SELECT语句格式
在Java和C#中采取同样样式,保证每个子句一行。
不要使用SELECT*的格式,要列出所有需要的字段。
SELECTcolumn1,column2,...
FROMtable1,table2,...
WHERE...
AND...
...
GROUPBY...
HAVING...
ORDERBY...
1.2.1.2INSERT语句格式
在Java和C#中采取同样样式,保证每个子句一行。
使用prepareStatement。
INSERT语句必须按照表结构顺序列出所有字段,即:
INSERTINTOtable_name(column1,column2,...)
VALUES(value1,value2,...)
或:
INSERTINTOtable_name(column1,column2,...)
SELECTcolumn1,column2,...
1.2.1.3UPDATE语句格式
在Java和C#中采取同样样式,保证每个子句一行。
使用prepareStatement。
UPDATEtable_name
SETcolumn1=value1,
column2=value2,
...
WHERE...
AND...
...
1.2.1.4DELETE语句格式
在Java和C#中采取同样样式,保证每个子句一行。
DELETEtable_name
WHERE...
AND...
...
1.2.2SQL语句书写要求
1.2.2.1注意事项
尽量使用简单语句,不要使用复杂的单个SQL语句来完成某个查询,原则上分成多个SQL执行。
尽量少使用多个大表关联查询。
复杂数据事务的处理建议使用存储过程。
不使用触发器。
有规律的大小写和换行。
避免使用拼SQL语句的方式。
2系统规范
2.1C#部分规范
2.1.1C#的NameSpace规划
C#的NameSpace规划如下:
对于系统框架层的扩展,按照StudyCase.Framework为根命名空间,根据功能划分进行扩展。
对于业务层的扩展,按照StudyCase.ClassLib为根命名空间:
另外web窗体的命名空间管理,按照StudyCase.Web.UI.为根命名空间:
2.1.2C#的异常处理规则
异常和错误的封装在控制类完成,实体类只抛出。
详见错误对象的使用说明。
异常的类别在返回的结果中用ErrorType项目表示,此ErrorType在实体类的父类中定义了静态变量,并会在框架中处理。
返回的代码及相应说明应遵守以下规范:
代码
说明
0/SUCCESS
执行正常
1/INFO
提示,对于因业务逻辑不满足条件或业务逻辑不能完成的情况,采用该返回代码
2/ERROR
错误,对于执行业务逻辑过程中因系统发生错误或异常引起的业务逻辑不能完成的情况,采用该返回代码
在业务组件中使用的时候,应使用相应的预定义常量来表示异常类别,不能直接使用数字方式,以方便扩展和修订。
2.1.3C#对框架的使用
2.1.3.1参数对象和结果对象的使用
控制类必须实现IBusiService接口,该接口中只有一个方法execute,该方法带有两个参数,分别是IParameterObj和IResultObj,这两个参数的说明和使用方法如下:
(1)参数对象IParameterObj:
参数对象存储了客户端调用者传递到应用层的各类参数信息,包括:
参数信息、参数集合信息,可以通过参数对象的方法获取需要的参数。
其中常用的方法如下:
●根据参数名称获取参数值的方法:
ObjectgetParameter(StringparamName)
该方法根据给定的参数名称获取参数值,返回的参数值是Object类型,在实际使用时需要根据具体要求转换为相应的数据类型。
●根据参数集合名称获取参数集合的方法:
ArrayListgetParamSet(StringparamSetName)
该方法根据给定的参数集合名称获取参数集合,返回的参数集合是列表DataTable类型,可以调用DataTable的相应方法从参数集合中获取参数集合数据。
●获取所有参数信息的方法:
HashtablegetAllParameters();
该方法获取参数对象中存储的所有参数信息,返回为键-值对的Hashtable,其中参数名称为键、参数值为值。
●获取所有参数集合信息的方法:
HashtablegetAllParamSet();
该方法获取参数对象中存储的所有参数集合信息,返回值为键-值对的Hashtable,其中参数集合名称为键、参数集合为值,参数集合是DataTable类型的对象。
(2)结果对象IResultObj:
该对象用于存储业务层需要返回的结果信息,比如:
结果值信息、结果集合信息,同时该对象还封装了对错误信息的存储,在业务层发生错误的时候,可以调用相应的方法设置需要返回给客户端的错误信息。
其中常用的方法如下:
●设置结果方法:
voidsetResult(StringrstName,Objectresult);
该方法将需要返回的结果信息设置到结果对象中存储,参数分别是需要设置的结果名称和结果值。
结果名称为字符串类型,结果值为Object类型,可以是任何对象类型。
例如:
需要设置返回结果id=1,name=ccg,则调用方法如下:
result.setResult(“id”,”1”);
result.setResult(“name”,”ccg”);
●设置结果集方法:
voidsetResultSet(StringrstName,DataTableresultSet);
该方法将需要返回的结果集信息设置到结果对象中存储,参数分别是结果集名称和结果集,结果集名称为字符串类型,结果值为DataTable类型。
例如:
需要设置一组结果集信息,结果集名称为personinfo,结果集如下表所示:
id
name
1
tom
2
john
3
jack
DataTableresultDataTable=newDataTable();
HashtablehtResult=newHashtable();
htResult.Append(“id”,”1”);
htResult.Append(“name”,”tom”);
resultDataTable.Add(htResult);
htResult=newHashtable();
htResult.Append(“id”,”2”);
htResult.Append(“name”,”john”);
resultDataTable.Add(htResult);
htResult=newHashtable();
htResult.Append(“id”,”3”);
htResult.Append(“name”,”jack”);
resultDataTable.Add(htResult);
result.setResultSet(“personinfo”,resultDataTable);
2.1.4C#的数据库访问方式
2.1.4.1数据操作的管理
在控制类中一般不建议加入数据访问与操作的代码,通常控制类作为业务调用的入口和调度管理者,对数据操作的管理仅限于对数据库连接、数据库事务的管理。
2.1.4.1.1数据库连接管理
数据库连接是数据访问和数据操作的基本参数,只有在获取了数据库连接之后才能够对数据进行操作。
同时,数据库连接也是数据库事务处理的基本条件,事务对象需要由数据库连接对象创建。
在控制类中获取数据库连接的方法是调用DBFunc类的getConnection方法,示例如下:
IDbConnectionconn=DBFunc.getConnection();
2.1.4.1.2数据库事务管理
数据库事务管理是数据操作的重要环节,在业务层中数据库事务管理是在控制类层完成,包括对数据库事务对象的获取、事务的提交和回滚等。
业务控制类在调用实体类的时候必须把事务对象传递给需要调用的实体类。
(1)数据库事务对象的获取:
IDbTransactiontrans=conn.BeginTransaction();
(2)数据库事务提交:
trans.Commit();
(3)数据库事务回滚:
trnas.Rollback();
2.1.4.2数据库访问与修改
在实体类中,对数据库的访问与修改通过已封装的数据访问操作方法实现,简化数据访问与修改的代码。
数据访问的方法封装在类DBFunc中,所有的数据访问均为静态方法。
DBFunc的数据访问方法目前是通过封装MicrosoftDataAccessApplicationBlock实现的,为了保持业务层代码的可移植性以及与后台数据库无关,数据访问方法的参数及返回值都采用接口或通用类的类型,在实际代码中可能需要根据连接数据类型的不同采用一些特定的类,此时需要使用强制类型转换方法,具体的应用请参见有关实例。
(1)执行查询语句并返回多行记录:
[代码示例]:
无参数查询:
获取Employee表的ID、Name信息:
IDbDataReaderdataReader;
dataReader=DBFunc.ExecuteReader(conn,CommandType.Text,”selectid,namefromemployee”);
[代码示例]:
带参数查询:
获取Employee表中ID<10的员工的ID、Name信息:
stringsql=“selectID,NamefromemployeewhereID<:
id”;
SqlParameter[]arrayParams=newSqlParameter[1];
arrayParams[0]=newSqlParameter(“:
id”,”10”);
IDbDataReaderdataReader;
dataReader=DBFunc.ExecuteReader(conn,CommandType.Text,sql,arrarParams);
(2)执行更新数据库的语句:
[代码示例]:
更新Employee表中ID=1的员工的Name信息:
stringsql=“updateEmployeesetName=@namewhereID=:
id”;
SqlParameter[]arrayParams=newSqlParameter[2];
arrayParams[0]=newSqlParameter(“:
name”,”test”);
arrayParams[1]=newSqlParameter(“:
id”,”1”);
intiRc;
iRc=DBFunc.ExecuteNonQuery(trans,CommandType.Text,sql,arrayParams);
[代码示例]:
向Employee表新增ID=10、Name=test的新员工信息:
stringsql=“insertintoEmployee(ID,Name)values(:
id,:
name)”;
SqlParameter[]arrayParams=newSqlParameter[2];
arrayParams[0]=newSqlParameter(“:
id”,”10”);
arrayParams[1]=new