目 录
资源开发规范
2.1 构件包
2.2 逻辑构件
2.3 逻辑流
2.4 脚本资源
2.5 Spring
2.6 Java
2.7 Tag
2.8 Filter
2.9 Servlet
2.10 配置信息
2.11 源码包
2.12 命名SQL
2.13 国际化资源文件
2.1 构件包
1、 概念
构件包是JUD项目中基础的业务实现和业务部署单元,其中包含了构件,构件实现以及一些额外需要的资源(如配置信息、页面资源等)。
2、 命名规范
(1) 构件包名称全部使用英文小写。
(2) 构件包名称采用长命名空间的方式,如com.cgn.deomo. iccard。
(3) 构件包名=系统命名空间+”.”+应用代码+”.””模块名”,例如com.cgn.demo.iccard;本规范假定系统命名空间在项目中统一使用com.cgn 应用代码demo 模块名iccard
(4) 显示名称使用默认信息,描述信息为中文。
3、 设计开发规范
(1) 设计时,合理规划项目中构件包的粒度,一个构件包对应与应用系统中一个相对独立的业务域,例如客户管理、产品管理等。
(2) 通常每个构件包对应一个与其名称一致的web路径。但现在多应用开发中,应在每一个应用下的构件包下加一个前缀,用以区分将不同应用下的部署到特定的目录中,而不是部署到一起(除非有需要时)。如: com.towngas.tcis.frame构件包的web路径为:frame 。
(3) 划分构件包时应避免构件包之间的相互依赖,如构件包A依赖构件包B的资源,而构件包B又要使用构件包A的资源,这时应该将构件包A,B相应的资源抽取到公用构件包C。
2.2 逻辑构件
1、 概念
采用JUD的逻辑流实现的构件。
2、 命名规范
(1) 逻辑构件名称为构件对象的单词(或缩写),其后可选如Manager等动词,首字母大写,与java类命名一致。如UserManager、MenuManager。
(2) 逻辑构件直接建在以构件包为名称的包。
(3) 显示名称使用默认信息,描述信息为中文。
(4) 逻辑构件是包含一个单一实体管理功能的操作集合,例如增(add)、删(delete)、改(update)、查(query)等。
3、 参数传递规范
优先使用业务实体对象和JUD内置对象,其次为map对象
4、 设计开发规范
逻辑构件在项目的设计中主要充当了逻辑功能拼装的载体,对于复杂业务,建议通过调用spring中定义的bean对象去拼装业务逻辑。
2.3 逻辑流
1、 概念
逻辑流属于逻辑构件的操作,它是采用JUD图形化组装方式表达的一种程序逻辑。
2、 命名规范
(1) 逻辑流名称=动词+对象名称(参照java方法命名方式),不要有下划线,如对Employee的增、删、改、查的完整名称就是 addEmployee、delEmployee、updateEmployee、queryEmployee。首字母小写,如果名称太长,建议使用词汇的缩写 。
(2) 显示名称使用默认信息,描述信息为中文
3、 参数传递规范
优先使用业务实体对象和JUD内置对象,其次出现map对象
4、 设计开发规范
(1) 要求逻辑流尽可能做到简洁功能独立,简洁是指所实现的逻辑流条理清晰、业务算法简单易于理解,要求在熟悉JUD体系架构和已有构件(可能是JUD提供的,也可能是自身的积累)的基础上,选择最佳的算法实现;功能独立是指在一个逻辑流中的业务处理是独立的,复杂的逻辑流考虑细分为多个小的逻辑流,以提高逻辑流的复用度。例如,某个功能要求查询获得多个数据表的结果,在编写逻辑流时不建议将所有查询处理放到一个逻辑流中实现,而是在不同的逻辑流中实现,再通过一个大逻辑流调用多个逻辑流,这样,编写的逻辑流可能还能在别的功能中得到复用,充分利用到面向构件积累的优势。
(2) 编写的逻辑流要求以业务的语义描述每个处理环节(避免使用程序语义描述或者不描述),即更改逻辑流中调用的运算逻辑的显示名称,同时逻辑图形编排清晰,尽可能不出现交叉线,另外可以在逻辑流中增加注释图元,注明逻辑流的功能等,这样有利于别人的阅读和理解,也方便日后系统的维护,以下是某项目中逻辑流截图:
图6-5逻辑流截图
(3) 注意逻辑流中目前的异常系统自动捕捉并且向上抛出,直至前台页面,不再自行捕捉异常,除非需要特别的处理时。
(4) 逻辑流中凡涉及到数据库修改(增删改)的操作时,此逻辑流必须加上事务开始和事务提交图元,以保障逻辑流之间的嵌套调用的事务完整性。
2.4 脚本资源
1、 概念
页面资源的类型包括:JSP、HTML、JS、图片等。
2、 命名规范
(1) 创建构件包时,对应的Web路径的主目录命名规范为:构件包名称,例如如下图:
图6-9创建构件包
(2) 建议在构件包的主目录下为每个构件建立一个文件夹,名称与构件名称一致,文件夹下创建与该构件相关的页面资源,例如构件busidict,在页面资源下创建busidict目录,如下图:
图6-10创建页面资源
(3) 如果构件包涉及较多公共资源,如js、图片资源等,可以在构件包下再创建js和img、css,并将相应资源放置在目录下,js目录下放置主页面UI脚本和事件脚本,如该功能包含多个业务实体对象,则在js目录下建立以实体名为名称的文件夹,相关的UI和事件资源放置其中。如下图:
图6-11公共资源
(4) 页面资源文件一律使用小写字母。
3、 代码规范
(1) 局部变量命名必须以下划线开始。
(2) 声明变量必须加上 var 关键字。当你没有写 var, 变量就会暴露在全局上下文中, 这样很可能会和现有变量冲突.另外, 如果没有加上, 很难明确该变量的作用域是什么, 变量也很可能像在局部作用域中,很轻易地泄漏到 Document 或者 Window 中, 所以务必用 var 去声明变量。
(3) 常量的形式如: NAMES_LIKE_THIS, 即使用大写字符, 并用下划线分隔。
(4) 注意事项:
事件定义:全部小写。
事件参数:事件第一个参数必须是定义该事件的组件实例。
组件内部事件处理: on+<事件名称(首字母大写)>
监听其他组件事件:on+<事件名称(首字母大写)>+Handler
(5) 注释
@author:作者
@argument:参数
@augments:参数
@class: 类
@constant:常数
@constructor:构造
@constructs: 构造
@default:默认值
@deprecated: 推荐,说明使用一个变量已不再支持
@description:说明
@example :范例
@extends: 扩展 ,继承
@field:变量(非功能)
@fileOverview :整个文件信息
@function: 功能 (表示该变量指向一个功能)
@inner || @private : 私有,内部
@ignore: 忽视 (文档生成的式后也将忽视这个变量)
@event:事件
@version:版本
@type:类型 描述预期的类型变量的值或返回值的函数
@throws :可能抛出的异常
@static: 静态,访问该变量不需要实例
@since: 自 (表明某属性特征,是在什么版本之后才有的)
@see: 描述相关的资源
@scope ||@lends: 作用域
@return ||@returns
@requires: 描述必须需要的资源
@public: 说明内在变量是公开的
@property : 属性
@param:参数
@namespace: 命名空间
2.5 Spring
1、 概念
JUD允许在逻辑构件中使用spring定义的bean对象, bean对象是独立的业务单元,一个功能是由多个bean方法组成,bean与数据层交互使用依赖注入的Dao对象中的方法来实现,Dao类只允许与数据库直接相关的操作
2、 命名规范
(1) 使用业务对象的单词(或缩写),其后使用Bean或者Dao连接,首字母大写,与java类命名一致。如UserBean、UserDao。
(2) Dao对象是包含一个单一实体管理功能的操作集合,例如增(add)、删(delete)、改(update)、查(query)等。
(3) Bean对象是包含独立业务处理单元的操作集合,方法的命名须与业务相关,如算费、销帐等处理
3、 参数传递规范
优先使用业务实体对象和JUD内置对象,仅在向命名SQL层传参时允许使用 map对象。
4、 其他事项
(1) Bean中可以调用其他的bean,可以调用本包中的dao,但不能调用其他包的dao。
(2) 只允许在Bean对象中使用操作日志组件(OperLog)
(3) Bean中出现错误或者重要信息须使用系统日志组件(TcisLog)记录日志
(4) 其他代码规范参考下个章节的JAVA规范
2.6 Java
1、 概念
JUD中所有JAVA文件(包括运算逻辑和JAVA构件将自动呈现在Java目录下),另外,允许通过该目录开发项目中其他的JAVA程序,包括工具类,测试类、Tag类、Filter类、Handler类等。
2、 命名规范
(1) 建议在开发环境中设置好格式,开发过程当中用快捷方式自动格式化。
(2) Package 的命名。
(3) Package 的名字全部采用小写字母,命名规则如下:
构件包名(不含前缀)+“应用代码”,例如:com.towngas.tcis.frame.auth。
此外,对于包名我们做如下约定:
l 工具函数类包名后缀为.util,如com.towngas.tcis.frame.util。
l Servlet类包名后缀为.servlet,如com.towngas.tcis.frame.servlet。
l test case类包名后缀为.test,如com.towngas.tcis.frame.test。
l Tag类包名后缀为.tag,如com.towngas.tcis.frame.tag。
l Filter类包名后缀为.filter,如com.towngas.tcis.frame.filter。
l Handler类后缀为.handler,如com.towngas.tcis.frame.handler
(4) Class 的命名。
Class 的名字必须由大写字母开头而其他字母都小写的单词组成,例如:DataFile或InfoParser。
(5) Class 变量的命名。
变量的名字必须用一个小写字母开头。后面的单词用大写字母开头,例如:debug 或 inputFileSize。
(6) Static Final 变量的命名。
Static Final 变量的名字应该都大写,并且指出完整含义,例如:MAX_UPLOAD_FILE_SIZE=1024。
(7) 参数的命名。
参数的名字必须和变量的命名规范一致。
(8) 数组的命名。
数组应该总是用下面的方式来命名:
byte[] buffer;
而不是:
byte buffer[];
(9) 方法的参数命名。
使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字:
SetCounter(int size)
{
this.size = size;
}
3、 参数传递规范
优先使用业务实体对象和JUD内置对象
4、 代码格式
(1) 文件头声明。
源文件的头部需要一个history段,对于每次对源文件的重大改动,都需要在history段中注明。该段定义在package和import之间,例如:
/****************************************************
* 描 述:Exception 处理的基类
* @author 张三 zhangsan@163.com
* @version 1.0 2009/01/10
* @see HISTORY
* 2009/01/10 张三 创建文件
* 2009/01/19 李四 增加提示功能
**************************************************/
5、 import顺序
import包按以下顺序。
(1) jdk标准包。
(2) java扩展包(例如servlet,javamail,jce等)。
(3) 使用的外部库的包(例如xml parser)。
(4) 使用的项目的公共包。
(5) 使用的模块的其他包。
每一类import后面加一个换行。
例如:
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.mail.*;
import org.apache.xml.*;
import com.bankcomm.wms.*;
import com.bankcomm.wms.util.*;
6、 代码块书写格式
可以选择以下任意一种代码块的书写方式:
if (true){
//body
}
if (true)
{
//body
}
建议使用第二种书写方式。如果是修改他人的代码,必须使用代码原来的书写方式。
对于代码块过长,超过1屏以上,}后面要说明属于那个代码块,例如:
if (i > 100)
{
//too many lines more than one screen
}// if (i > 100)
7、 关于缩进
缩进使用4个连续空格,不要在源文件中保存tab字符, 请注意调整所用的IDE工具,打开将tab转换为空格功能。
8、 页宽
页宽应该设置为80字符. 源代码一般不会超过这个宽度, 并导致无法完整显示, 但这一设置也可以灵活调整. 在任何情况下, 超长的语句应该在一个逗号或者一个操作符后折行. 一条语句折行后, 应该比原来的语句再缩进4个空格。
9、 操作符
操作符左右各用一个空格分隔。
例如:
int a = b;
if (a > 0);
10、 类和方法定义
类定义或方法定义过长需要换行书写,例如:
public class CounterSet
extends Observable
implements Cloneable
private PortletSet getPortlets( Portlets portlets,
RunData rundata,
boolean application,
boolean applicationsOnly )
{
}
11、 注释
public 和 protected的成员变量和方法必须写javadoc注释。超过1句以上的注释使用中文书写。对于代码多于10行的private方法也要写javadoc注释。
对于代码中的逻辑分支或循环条件需要书写注释,例如:
if (some condition)
{
//符合某个条件,应该这样处理
}
else
{
//否则应该那样处理
}
12、 其他
类中的属性不能定义为public变量直接存取,而是定义成protect/private变量并编写get/set方法,例如:
protect String myName;
public String getMyName()
{
return myName;
}
public void setMyName(String myName)
{
this.myName=myName;
}
2.7 Filter
JUD建议应用中尽量不用开发Filter,可以开发拦截器Interceptor(详细见EOS帮助)实现Filter的功能。如果应用需要开发Filter时,需要及时和项目组技术负责人沟通讨论后再做决定。
2.8 Servlet
谨慎增加servlet!,因为servlet需要修改web.xml给以后的上线系统管理带来很多问题!尽可能的不要修改J2EE的本身配置!
2.9 配置信息
1、 概念
由于构件包在JUD中是一个独立的部署单元,因此构件包提供的配置信息目录,允许定义异常、国际化资源文件、日志配置、Handler等。
2、 命名规范
文件名使用小写,无特殊要求。
2.10 源码包
1、 概念
JUD允许在很多资源类型下创建包,用以构造项目的命名空间。
JUD创建构件包时,会自动创建构件包同名的包,创建逻辑构件时,也会创建与逻辑构件同名的包。
2、 命名规范
(1) 包命名一律要求为小写。
(2) 在各个资源下创建包的规范参见各个资源的命名规范,例如逻辑构件、组合构件等。
2.11 命名SQL
1、 概念
JUD在与数据库交互时允许直接使用SQL来进行查询、删除、修改等操作,我们称之为命名SQL。
2、 命名规范
命名SQL名统一使用功能模块名,例如:login.namingsqlx,role.namingsqlx
命名SQL内的独立操作单元(以ID为区分)命名须带有业务含义,可使用操作类型作为前缀,业务对象为后缀。如:updateRole addRole,queryRoles等
3、 参数规范
命名SQL传入参数允许使用业务实体、DataObject和Map对象
命名SQL返回对象仅允许为业务实体对象、DataObject,并且对象中的属性名都必须是小写,可使用SQL的别名来达到目的比如:
<select id="roleResources" resultClass="commonj.sdo.DataObject"> select r.roleid as "roleid", res.resid as "resid", res.rescode as "rescode", res.respath as "respath", res.restype as "restype" from t_ac_role r , t_ac_resource res,t_ac_role rr where r.roleid=rr.roleid and rr.resid=res.resid </select> |
4、 SQL命名规范
以下定义了书写SQL语句所应遵循的准则:
1) SQL语句中的关键字采用大写字母书写。
2) SQL语句中的字段名采用大写字母书写。
3) SQL语句中的函数名采用大写字母书写。
4) SQL语句中的表名采用大写字母书写
5) SQL语句每一句从第一列开始书写,各从句部分以两格为单位嵌套缩进。
6) 当SQL语句中存在多个表时加入简短的别名。
7) 尽量使用SQL标准语法,避免使用方言
8) 尽量少使用或不使用存储过程,减少移植的工作量。
例一:
SELECT DEPNO,MANAGER,DEPTNAME
FROM DEPARTMENTS
WHERE DEPTBANE = ‘SALES’
例二:
SELECT A.DEPTNAME,B.LNAME
FROM DEPARTMENTS A,EMPLOYEES B
WHERE A.MANAGER = B.EMPNO;
5、 SQL编写规范
1) 将最小的表放在最后。
2) 将最具限制性的条件放在最后。
3) 避免在查询中使用函数,特别是在查询中含有被设为索引的列时更是如此,这会使索引失效。
4) 避免在LIKE函数的起始处使用通配符。
5) 不要使用过多的子查询。
6) 不要请求太多的列。
7) 不要请求太多的行。
6、 注意事项
在SQL中使用变量时 使用#变量名# 禁止使用$变量名$方式,如果必须使用及时和项目组技术负责人沟通讨论后再做决定
2.12 国际化资源文件
1、 概念
页面的信息的国际化内容都存放在构件包的配置信息下的resources/i18n目录下的资源文件中。
2、 命名规范
(1) 资源文件的命名规范。
资源文件的命名按照页面流划分,每个页面流对应一组资源文件,每组资源文件包括多个语种的对应信息,如人员维护的页面流为EmployeeManager.flow则国际化资源文件为EmployeeManager_en_US.properties,EmployeeManager_zh_CN.properties等。
国际化的标识为 语种_国别。语种使用ISO639-2(w3c) 国别 使用ISO3166(w3c)。
(2) Key的命名。
l 全局使用的消息名:
固定名称、标题、按钮显示名称:以l_开头加上英文单词 。
例如: 选择 l_choose
确定 l_comfirm
取消 l_cancle
字段名: 实体名.属性名
例如:AcOrganization.orgid。
提示信息:以m_+”开头加上页面操作信息”+”_”+”消息名称” 。
例如:删除时的提示信息m_delete_confirm。
图片名称:以i_开始加上英文单词,例如:i_logo。
l 局部使用的消息名(构件包、页面流、JSP内使用)
局部使用的消息名称可在全局使用的消息命名规范基础上,在消息名前增加”页面流名称”+”_”。如选择:EmployeeManager._ l_choose ,字段名: EmployeeManager._ AcOrganization.orgid,删除时的提示信息EmployeeManager._m_delete_confirm 。
3、 设计开发规范
(1) 对于中文信息,标点符号需要以中文标点。英文信息使用英文标点。如句号、引号等。
(2) 尽量合并相同信息。
(3) 每一个模块至少对应一组国际化资源文件。