开发规范rxc.docx
《开发规范rxc.docx》由会员分享,可在线阅读,更多相关《开发规范rxc.docx(34页珍藏版)》请在冰豆网上搜索。
开发规范rxc
1平台使用向导
1.1命名规范
1.1.1单元编号
Ø单元编号尽量精简
Ø组编号:
子系统英文简称+功能名英文简称例如:
cmisProInfo(或者简称cmisPI)承包商项目信息
Ø组下单元编号:
子系统英文简称+功能名英文简称+[_功能后缀(form,list,query)(英文单词,同时为java的包名)]+[1,2,3,4…]后两项为可选项;
如果单元是简单父单元,也就是说,这个父单元是用来组织其他子单元的,那么该父单元编号不需要增加功能后缀;如:
cmisProInfo;如果有多个这样的简单父单元的话,那么需要增加a,b,c,d等序号区分,如cmisProInfo1,cmisProInfo2…;
否则,单元编号需要增加功能后缀,如cmisProInfo_list,cmisProInfo_query,如果组下有多个list或query或form时,则需要增加1,2,3,4等序号区分,如cmisProInfo_list1,cmisProInfo_list2…。
注:
子系统承包商管理系统,对应的子系统编号和英文简称如下:
承包商管理系统:
cmis
风险评估系统:
rmis
事故调查子系统:
amis
1.1.2提示消息
Ø前台显示错误提醒,错误信息尽量详细,例如:
输入不合法,开始日期必须在结束日期之前,等
Ø业务编号:
msg+”.”+消息类型(e:
ERROR;w:
WARNING;i:
INFO)+”.”+模块单元编号 例:
msg.e.srv001001
Ø平台编号:
FU+六位编号 例:
msg.fu000001
Ø统一向共通组申请,由共通组提供编号,申请同键值申请流程(即提供预想消息代码),此类消息代码前缀为“msg”
Ø消息内容包括:
编号及正文(编号同去掉msg的键值代码,正文中编号为大写)
Ø平台自己的提示需要加入编号。
错误编号用括号”[]”与中文分割。
注:
消息分为三类:
ERROR,WARNING,INFO.
ERROR:
系统显示为红色。
内容为系统提示错误信息。
(例:
数值、英字符、日期等输入检验,业务相关检验,DB异常,并发处理等)。
WARNING:
系统显示为黄色。
内容为系统提示的警告或提示信息。
(例:
对数据库进行增,删,改时的前台提示确认信息)。
INFO:
系统显示为绿色。
内容为系统提示处理成功信息。
(例:
操作数据库更新成功,(XXX行)数据导出成功等信息)。
1.1.3Js创建
Ø子系统名+业务名称+两位编号
例如:
srvPartsDetail01.js
Ø通用JS中间+Cmn
例如:
srvCmn01.js
Ø注:
编码格式为UTF-8
注:
针对于列表,单选或多选未选中情况下进行提交时,使用js前台检查,共通的js已经创建在fastunit/domain/cmn/下Cmn01.js调用方法deleteCheck('url','unitID')。
1.1.4Js编写规范
Ø编写js时应注意IE兼容性问题,建议使用mootools.js(1.2.4)平台已经将mootools.js引入到单元中。
例如:
获取当前页面ID为”aa“的元素
Ø正常可以写为document.getElementById(‘aa’);
Ømootools可写为$(‘aa’);
1.2表
1.2.1表创建
Ø所有的业务表创建在app域下;当在其他域中引用表时,表达式为app|tableName。
1.2.2表管理
Ø通常不在平台中创建表,而是在数据库中创建表之后导入平台;输入表名,如果导入的表不是来自其他的数据库则数据源为空,点击导入(不能导入相同的表名)。
下图为SRV_ACCOUNTRECV_TB导入平台;需要注意以下几点。
Ø数据类型:
必须与数据库字段类型保持一致。
Ø值生成器:
例如createdate创建时间,选择值生成器是为了不必程序处理,平台提供赋值功能,但数据类型是时间戳,值生成器也必须是时间戳,否则不会自动赋值。
Ø生成规则:
选择值生成器后,要选择生成规则,例如,创建时间生成规则选为新增;表示在新增时才可按值生成器赋值。
修改时间选择全部;表示新增、修改数据时都将按值生成器赋值。
Ø版本字段:
选择updatecount更新次数,唯一用来控制并发字段。
2后台开发向导
2.1命名规范
2.1.1Package命名
2.1.2Package的名字统一用小写英文单词书写
ØPackage的名字=包前缀+包名
Ø包前缀如下:
com.rxc+系统名+子系统
Ø包名:
程序功能的英文名(小写)如下:
Øpackagecom.rxc.amis.action;
2.1.3Class命名
Ø采用完整的英文描述符,所有单词的第一个字母大写
Ø类名=功能码+程序功能的英文名+类种类
Ø功能码(各功能名的缩写)例如:
Vehicle--VhcService-->Srv
Ø类种类:
Action/UI/Help/MapListFactory/SqlProvider等
Ø例如下:
Ø1)ActionLoginAction.java
Ø2)HelpLoginHelp.java
Ø3)UILoginUI.java
Ø4)MapListFactoryLoginMLF.java
Ø5)SqlProviderLoginSP.java
2.1.4方法命名
Ø第一个英文单词小写,后续每个英文单词首字母大写
Ø(说明:
构造函数的命名应与类名保持一致)例如:
getInboardColor()
2.1.5变量命名
Ø类型标识符小写,后续每个英文单词首字母大写
Ø变量名=类型标识符+描述词
变量类型
标示符
Int
i
Short
sh
Long
l
Float
f
Double
d
Boolean
b
Char
c
Byte
by
String
str
List
lst
Bigdecimal
bd
Biginteger
bi
Date
dt
一般对象
o
Ø描述词为一个简短且意思明确的英文单词
Ø如果通过以上规则,还出现同名的变量,可以在变量后添加后缀来解决,后缀以下划线"_"来连接
Ø例如:
intiLoop;StringstrUserName;
Ø数组应该总是用下面的方式来命名:
Øbyte[]byDataArray;
2.1.6常量命名
Ø常量的名字应该都大写,单词之间用下划线分隔
Ø例如:
staticfinalintMAX_WIDTH=999;
Ø不变化的定义成常量类。
每个域一个,后期修改。
2.1.7参数命名
Ø参数的名字必须跟变量的命名规范一致,
Ø参数的名字规则为第一个单词首字母小写,其后的单词的每个字母大写
Ø例如:
getColorDetail(StringstrColorCode)
2.2JAVA编码规范
2.2.1JDK版本要求
ØJdk1.5或以上。
注意:
所有的文本文件(js文件以及java文件,存储过程等)的编码格式都为UTF-8
2.2.2编码规定
2.2.2.1Import规则
Øimport语句不要直接引用类
例如:
importjava.util.Vector;
importjava.util.Date;/*错误*/
importjava.util.*;/*正确*/
引用顺序:
1>.引用java标准类库
2>.引用javax扩展类库
3>.引用马自达项目相关类库
4>.引用其他第三方类库
每一类import类库之后要加上一个空行
2.2.2.2格式约定
Ø缩进
本项目要求缩进采用4个半角空格
不要在源文件中使用Tab字符
行尾不要保留没有意义的空格
如果因为行过长发生换行,语句尚未结束的情况下,缩进为4个空格
Ø换行
前括号"{"不得出现在行首,只能出现在行尾,即"{"不得另起一行
"else"必须在后括号"}"之后,不得另起一行
"while"必须在后括号"}"之后,不得另起一行
"catch"必须在后括号"}"之后,不得另起一行
"finally"必须在后括号"}"之后,不得另起一行
一行内不得出现两条语句。
例如:
arrayInit[0]=7;
arrayInit[1]=8;/*正确*/
arrayInit[0]=7;arrayInit[1]=8;/*错误*/
示例代码:
publicclassUntitled1
extendsObject
implementsComparable{
publicintcompareTo(Objectsomething){
return3;
}
publicbooleancalcStringValue(intlength,StringvalueToTestFor,
booleantrim)
throwsException{
int[]arrayInit=newint[]{234,34,234,45};
if(trim){
if(valueToTestFor==null){
returnfalse;
}else{
valueToTestFor=valueToTestFor.trim();
}
}elseif(length<0){
length=5;
}else{
try{
length=234/34+
Integer.parseInt(valueToTestFor+Integer.toBinaryString(length)+
Integer.toHexString(length-4));
}catch(NumberFormatExceptionex){
throw(Exception)ex;
}finally{
returnfalse;
}
}
do{
switch(length){
case2:
break;
default:
arrayInit[0]=7;
arrayInit[1]=8;
break;
}
arrayInit[0]++;
}while(arrayInit[0]<3);
returntrue;
}
}
Ø空格
分号应该紧跟行尾最后一个字符,分号与行尾字符之间不应该有空格
方法名应该紧跟左括号"(",方法名与左括号之间不应该有空格
关键字、保留字跟左括号之间应该有一个空格
两个连续左括号之间应该有一个空格
左括号与同行后续内容之间不应该有空格
逗号与同行后续内容之间应该有一个空格
分号与同行后续内容之间应该有一个空格
前括号"{"与同行前面内容之间应该有一个空格
强制类型转换与同行后续内容之间应该有一个空格
算数运算符、逻辑运算符连接的两个元素之间应该用空格分隔
示例代码:
publicclassUntitled1{
publicvoidprintData(intx,inty){
int[]j=newint[y];
ArrayListlist=newArrayList();
for(inti=0;ij[i]=x+y;
list.add(newInteger(x*i));
System.out.print((Integer)list.get(i));
}
}
}
Ø空行
声明package之后有一个空行
声明import之后有一个空行
类内部全局变量声明与方法之间有一个空行
类内部各方法之间有一个空行
方法内部变量声明与正式代码之间有一个空行
方法内部代码各逻辑之间有一个空行
类内部不得出现连续两个及两个以上空行的情况
示例代码:
packagecom.borland.samples;
importjava.util.*;
importcom.borland.test.*;
publicclassUntitled1{
privateintheight;
privateintwidth;
publicvoidsetHeight(intheight){
this.height=height;
}
publicintgetHeight(){
returnheight;
}
}
Ø行宽
行宽不得超出80个字符
2.2.2.3强调封装性
Ø根据OO编程思想,一个封装良好的类应该是所有的成员变量都是私有的,外部只能通过公有的接口方法来实现对内部属性的访问。
Ø因此,类内部所有的全局变量应该声明为private类型的
Ø同时设置public的get和set方法,实现从外部对此变量的访问
Ø示例代码:
ØprivateStringstrStatus="";
ØpublicStringgetStatus(){
ØreturnstrStatus;
Ø}
ØpublicvoidsetStatus(StringstrInStatus){
ØstrStatus=strInStatus;
Ø}
Ø禁止使用内部类
类的声明最好不要使用final类。
2.2.3程序LOG
2.2.3.1级别描述
Ø5DEBUG测试信息
Ø4INFO正常运行信息
Ø3WARN可能的问题
Ø2ERROR错误信息
Ø1FATAL致命问题
(建议使用2,3,4,5四种)。
在捕捉异常时,输出errorLog信息。
数据库操作SQL文以及事件正常处理完成时,输出infoLog信息。
方法开始,结果时输出debugLog信息。
2.2.3.2样例代码
Ø程序Log,使用slf4j
Øimportorg.slf4j.Logger;
Øimportorg.slf4j.LoggerFactory;
ØprivatestaticfinalLoggerlog=LoggerFactory.getLogger(类.class);
Ølog.error("错误信息");
2.2.3.3禁止事项
Ø最终提交程序版本不能包含system.out..打印日志等语句。
2.2.4注释
2.2.4.1注释品质要求
Ø注释品质要达到使新加入项目的PG能够独立看懂代码为最低要求
Ø注释行数要达到代码总行数的20%以上
Ø声明有重要作用的变量,调用函数,进入逻辑分支,进入循环等情况下必须加注释
Ø把javadoc的标准化集合进来
2.2.4.2版权声明
在各文件头添加如下版权声明
////////////////////////////////////////////////////////////////////////////
2.2.4.3注释规则
Ø类
类的注释必须包含如下的内容:
类的简要描述,可以采用中文或英文,创建日期,创建的人前面加入@author,
当前的版本号前面加入@version
例:
/**
*经销店可以在系统上指定TFL发车的优先度
*
复杂的处理添加详细说明
*@authorrxcadmin
*@version1.00,2007/08/10新规作成
*@authorrxcadministrator(da)(变更时)
*@version1.10,2007/0910改善案件名(变更时)
**/
publicclassVlgDOTFLPriorityModelextendsCmnInfoModel{
…………………
Ø变量、方法
对类中变量声明的注释请使用注释符"//"如下:
privateTfpSubmitbtnReturn=null;
对于public的成员变量,使用块注释方法加注释,以便可以生成javadoc文档。
/**
*成员变量含义
*/
PublicTfpSubmitbtnReturn=null;
每个类的方法声明及方法内的代码都要有注释,其中类的方法注释含如下内容:
方法功能或作用的简要描述
参数数据类型,前面加入@param
返回数据类型,前面加入@return
抛出异常说明,前面加入@exception
例:
/**
*获得提取文件的结构体方法说明.
*@paramextStructCmnFontExtractionStruct参数说明
*@paramstrRootDirrealfiledir参数说明
*@returnStringexecuteresult返回内容说明
*@exceptionSQLException异常说明
*/
publicStringgetExtractDetail(CmnFontExtractionStructextStruct,StringstrRootDir)
throwsSQLException{
………………….
//Rollback
connection.rollback();
}
2.2.5常用类的使用
2.2.5.1Acion
Ø执行命令行:
继承DefaultAction
publicclassSavePartsActionextendsDefaultAction{
publicvoiddoAction(DBdb,ActionContextac)throwsException{
//获取命令行配置的table
Tabletable=(Table)ac.getTables().get(0);
Listrows=table.getRows();
ColumnRowrow=rows.get(0);
//time赋值
row.set("time","2009-09-09");
//调用命令行保存
super.doAction(db,ac);
}
}
Ø执行ajaxAction:
实现Action
publicclassGetPartsAjaxActionimplementsAction{
publicActionContextexecute(ActionContextac)throwsException{
Ajaxajax=newAjax(ac);
//获取零件代码
StringpartsCode=ac.getRequestParameter("partsCode");
//赋值
ajax.setValueByName(0,"pat004.order.list.partscode",partsCode);
ajax.send();
returnac;
}
}
Ø涉及处理数据库并没有执行命令行,可继承TransactionAction
publicclassSavePartsOrderActionextendsTransactionAction{
publicvoiddoAction(DBdb,ActionContextac)throwsException{
//保存主表
Tabletable=newTable("app","PAT_PARTSORDER_M");
for(inti=0;iStringorderNo=data.getRow(i).get("orderno");
StringfactoryCode=data.getRow(i).get("factorycode");
StringorderSum=data.getRow(i).get("ordersum");
StringordersType=data.getRow(i).get("orderstype");
ColumnRowrow_m=table.addInsertRow();
row_m.set("orderno",orderNo);//订单号
row_m.set("orderstype",ordersType);//供应商代码
row_m.set("companycode",companyCode);//公司代码
}
db.save(table);
}
}
2.2.5.2Help
Ø当业务比较复杂,避免一个类里的代码过多,可写一个辅助类。
//用单表查询作为样例,一般涉及到多表查询逻辑复杂时可创建此类
publicclassPartsrsdiinHelp{
//参数为零件代码
publicStringgetSql(Stringpartscode){
StringBuffersb=newStringBuffer();
sb.append("select*fromPAT_PARTSIN_TBwhere1=1");
//零件编码
if(!
Checker.isEmpty(partscode)){
sb.append("andpartscode='");
sb.append(partscode);
sb.append("'");
}
//返回SQL
returnsb.toString();
}
}
2.2.5.3公共方法类
Ø公共方法类示例
publicclassUtilimplementsjava.io.Serializable{
publicvoidSrvCommonCheck(){}
//默认除法运算精度
privatestaticfinalintDEF_DIV_SCALE=10;
/**
*提供精确的加法运算。
*@paramv1被加数
*@paramv2加数
*@return两个参数的和
*/
publicstaticdoubleadd(doublev1,doublev2){
BigDecimalb1=newBigDecimal(Double.toString(v1));
BigDecimalb2=n