3开发原则与约束.docx
《3开发原则与约束.docx》由会员分享,可在线阅读,更多相关《3开发原则与约束.docx(11页珍藏版)》请在冰豆网上搜索。
![3开发原则与约束.docx](https://file1.bdocx.com/fileroot1/2022-12/11/b34f9a17-aad0-475d-9e58-c4cb6b851269/b34f9a17-aad0-475d-9e58-c4cb6b8512691.gif)
3开发原则与约束
开发命名规范
版本信息
*A代表新增,M代表修改,D代表删除;
版本号
发布日期
提交人
审阅人
A.M.D
更新位置
更新摘要
V1.0
2014-07-26
李健进
A
拟初稿
V1.1
2014-08-22
李健进
A
2.8
增加系统安全性内容
V1.2
2014-08-28
李健进
M
精简部分重复无意义描述
V1.3
2014-09-03
李健进
A
2.6
增加异常捕捉内容
V1.4
2014-09-15
李健进
A
3
增加数据库规范中部分内容
V1.5
2014-10-27
李健进
A
2.1.23.1.2
增加对MVC各层作用的描述与主键生成策略约束
1.前言
1.1.目的范围
1.1.1.目的作用
本规范的主要目的为指导、规范软件编程人员进行软件代码编写工作,提高软件开发工程师的软件编写能力。
代码规范相当重要,代码规范提高软件代码的可读性,使得开发人员快速和彻底的理解新代码。
好的代码风格不仅会提高可读性,而且会使代码更健壮,更为重要的是在修改时不容易出错。
1.1.2.应用范围
公司所有涉及程序编写的人员和部门。
本约定适用于可执行系统的源代码文件。
为了执行规范,每个软件开发人员必须一致遵守编程规范。
1.2.阅读说明
本规范主要分为设计原则与设计约束两大类。
●设计原则。
主要为设计建议,根据建议可以写出更优质的代码。
本文中为【非加粗字体】;
●设计约束。
指的是所有开发人员必须要严格遵守的规约,不允许有违规行为。
本文中规约以【加粗字体】标识。
其中【灰色的加粗字】表示产品组内部强制执行,各项目建议执行。
2.Java编码原则
2.1.类、接口
2.1.1.设计原则
●类的划分粒度要适当,不宜继承太深;
●建议一个类只做一件事,根据每个类的职责进行划分;
●多使用设计模式,尽量提高代码重用度;
●若多个类中使用相同方法时,请将其方法提到一个接口中或使用抽象类;
●在抽象类和接口都可实现的情况下建议选择使用接口,以更易于扩展及实现多重继承。
2.1.2.设计约束
●程序结构遵守MVC规则:
JSPACTIONSERVICEDAODB,即:
●DAO:
放置不包含业务逻辑的纯粹数据库操作,为Service提供服务;
●Service:
放置主要的业务逻辑代码,此类型代码一般为调用DAO提供的方法进行组合与包装。
为Action层提供服务。
若业务逻辑非常简单的情况下,Service层可以省略不写,同时业务逻辑代码写在Action层;
●Action:
主要放置数据转换、校验、转发与业务逻辑调用的代码,若对应存在Service层,则Action层不应包含具体的业务逻辑代码;
●Jsp:
分为前端代码与Java代码。
其中Java代码应仅负责数据的获取与解析,不应包含具体的业务处理逻辑代码,更不应该存在Jsp直接写SQL语句进行操作的行为。
2.2.方法
2.2.1.设计原则
●一个方法只完成一项职责,在定义系统的公共接口方法外的方法应尽可能的缩小其可见性;
●避免在一个较长的方法里提供多个出口;
●当多个方法中同时使用一套逻辑相近的代码时,请将此类型的逻辑代码抽象成一个独立的方法;
●一个方法代码行数建议不超过200行。
若超过,请将方法进行拆分。
2.3.变量
2.3.1.设计约束
●禁止在代码中出现无意义的数字(MagicNumber),应该为此类型的数字定义一个变量名,提高代码可读性;
●禁止将一个非final实例变量声明为public,实例变量的传递与修改应在方法中实现(构造函数、getter、setter)。
2.4.表达式与语句
2.4.1.设计约束
●所有if、for、where等语句的执行代码段必须使用{}包括起来,即便是只有一个语句;
●禁止在一行代码中进行多个变量的赋值,如a=(b=c+1);
●超过3个else分句请转成switch语句或创建子函数;
●switch语句的每个case中必须带有break;
●循环语句中必须有终止循环的条件或语句,否则容易导致死循环的情况。
2.5.序列化
2.5.1.设计约束
●创建序列化类时,serialVersionUID必须设置一个随机的哈希字段,不应笼统设置为-1L;
●若复制一个Serializable的类进行修改时,必须重新设置新类的serialVersionUID;
●针对瞬态的对象(如IO流对象、Thread对象等)与不希望被序列化的对象,必须在对象声明前加上transient关键字。
2.6.异常捕捉
2.6.1.设计原则
●必须尽可能的精确捕捉异常,而不能笼统使用Exception。
2.6.2.设计约束
●当捕捉到异常时,必须在catch代码区进行处理,并且在日志中记录错误信息(System.out、log4j、oa日志等);
●异常日志不应笼统提及抛出这个异常的方法的名字,应有使用说明性的文字描述与完整的异常栈输出(printStackTrace);
●禁止捕捉异常后不进行任何处理的写法。
2.7.日志
2.7.1.设计原则
●Debug日志记录尽量通用而全面,且与oa的Debug开关配合使用,例子如下:
booleanisDebug="true".equals(System.getProperty(OAConstant.DEBUG))?
true:
false;
if(debug){
System.out.println("Debug日志:
");
}
2.8.线程安全性
2.8.1.设计约束
●在JSP、Servlet及Struts的Action编程中,非final变量应尽量采用局部变量,减少使用实例变量。
由于这些情况都是多线程情况,容易产生线性不安全问题;
●使用synchronized关键字的代码段或函数之间禁止相互引用,以免引起死锁;
●应限制自定义线程个数上限,不设线程限制且并发的情况下(如在Action中start一个新线程),可能会由于线程量暴涨,从而导致native内存耗尽,服务器瘫痪崩溃;
●对于static关键字修饰的变量、synchronized关键字修饰的代码段或函数,必须考虑这部分代码能否在集群环境下正常运行。
因为static的变量变化时无法在集群中简单共享,synchronized的代码段不能阻塞并发在集群里其他节点的代码。
2.9.系统与资源安全性
2.9.1.设计原则
●与上传文件相关的功能(如上传附件等),必须针对后缀名进行判断与过滤:
js、jsp、*htm*(如html、shtml、htm等)、css;
●SQL语句提交时,由客户端传递的变量值必须使用传参形式传入,不允许使用字符串拼接方式实现,此举动容易产生SQL注入,造成安全隐患;
●针对插入与修改的功能,应校验由客户端提交的数据是否存在敏感的字符串: