开发手册-记录

转载地址:

file:///C:/Users/XQQ/Documents/Tencent%20Files/374797487/FileRecv/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4Java%E5%BC%80%E5%8F%91%E6%89%8B%E5%86%8C%E7%BB%88%E6%9E%81%E7%89%88v1.3.0.pdf


【强制】抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾;测试类命名以它要测试的类的名称开始,以 Test 结尾。


【强制】POJO 类中布尔类型的变量,都不要加 is,否则部分框架解析会引起序列化错误。


【强制】包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式。


【推荐】如果模块、接口、类、方法使用了设计模式,在命名时体现出具体模式。说明:将设计模式体现在名字中,有利于阅读者快速理解架构设计理念。正例:

public class OrderFactory;

public class LoginProxy;public class ResourceObserver;


【推荐】接口类中的方法和属性不要加任何修饰符号(public 也不要加),保持代码的简洁性,并加上有效的 Javadoc 注释。尽量不要在接口里定义变量,如果一定要定义变量,肯定是与接口方法相关,并且是整个应用的基础常量。正例:接口方法签名:void f(); 接口基础常量表示:String COMPANY = "alibaba";反例:接口方法定义:public abstract void f();说明:JDK8 中接口允许有默认实现,那么这个 default 方法,是对所有实现类都有价值的默认实现。


【参考】各层命名规约:A) Service/DAO 层方法命名规约

1) 获取单个对象的方法用 get 做前缀。

2) 获取多个对象的方法用 list 做前缀。

3) 获取统计值的方法用 count 做前缀。

4) 插入的方法用 save/insert 做前缀。

5) 删除的方法用 remove/delete 做前缀。

6) 修改的方法用 update 做前缀。

B) 领域模型命名规约

1) 数据对象:xxxDO,xxx 即为数据表名。

2) 数据传输对象:xxxDTO,xxx 为业务领域相关的名称。

3) 展示对象:xxxVO,xxx 一般为网页名称。

4) POJO 是 DO/DTO/BO/VO 的统称,禁止命名成 xxxPOJO。


【推荐】不要使用一个常量类维护所有常量,按常量功能进行归类,分开维护。说明:大而全的常量类,非得使用查找功能才能定位到修改的常量,不利于理解和维护。正例:缓存相关常量放在类 CacheConsts 下;系统配置相关常量放在类 ConfigConsts 下。


【推荐】如果变量值仅在一个范围内变化,且带有名称之外的延伸属性,定义为枚举类。下面正例中的数字就是延伸信息,表示星期几。正例:public Enum { MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4), FRIDAY(5), SATURDAY(6),SUNDAY(7);}


【强制】相同参数类型,相同业务含义,才可以使用 Java 的可变参数,避免使用 Object。说明:可变参数必须放置在参数列表的最后。(提倡同学们尽量不用可变参数编程)正例:public User getUsers(String type, Integer... ids) {...}


【强制】外部正在调用或者二方库依赖的接口,不允许修改方法签名,避免对接口调用方产生影响。接口过时必须加@Deprecated 注解,并清晰地说明采用的新接口或者新服务是什么。


【强制】Object 的 equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals。正例:"test".equals(object);反例:object.equals("test");说明:推荐使用 java.util.Objects#equals(JDK7 引入的工具类)


【强制】定义 DO/DTO/VO 等 POJO 类时,不要设定任何属性默认值。反例:POJO 类的 gmtCreate 默认值为 new Date();但是这个属性在数据提取时并没有置入具体值,在更新其它字段时又附带更新了此字段,导致创建时间被修改成当前时间。


【推荐】循环体内,字符串的连接方式,使用 StringBuilder 的 append 方法进行扩展。说明:反编译出的字节码文件显示每次循环都会 new 出一个 StringBuilder 对象,然后进行append 操作,最后通过 toString 方法返回 String 对象,造成内存资源浪费。反例:String str = "start";for (int i = 0; i < 100; i++) {str = str + "hello";}


【强制】泛型通配符来接收返回的数据,此写法的泛型集合不能使用 add 方法,而不能使用 get 方法,做为接口调用赋值时易出错。说明:扩展说一下 PECS(Producer Extends Consumer Super)原则:第一、频繁往外读取内容的,适合用。第二、经常往里插入的,适合用。 


 【强制】SimpleDateFormat 是线程不安全的类,一般不要定义为 static 变量,如果定义为static,必须加锁,或者使用 DateUtils 工具类。正例:注意线程安全,使用 DateUtils。亦推荐如下处理:

private static final ThreadLocal df = new ThreadLocal() {

@Overrideprotected 

DateFormat initialValue() {

return new SimpleDateFormat("yyyy-MM-dd");

}

};

说明:如果是 JDK8 的应用,可以使用 Instant 代替 Date,LocalDateTime 代替 Calendar,DateTimeFormatter 代替 SimpleDateFormat,官方给出的解释:simple beautiful strongimmutable thread-safe。


【推荐】避免 Random 实例被多线程使用,虽然共享该实例是线程安全的,但会因竞争同一seed 导致的性能下降。说明:Random 实例包括 java.util.Random 的实例或者 Math.random()的方式。正例:在 JDK7 之后,可以直接使用 API ThreadLocalRandom,而在 JDK7 之前,需要编码保证每个线程持有一个实例。


【参考】特殊注释标记,请注明标记人与标记时间。注意及时处理这些标记,通过标记扫描,经常清理此类标记。线上故障有时候就是来源于这些标记处的代码。1) 待办事宜(TODO):( 标记人,标记时间,[预计处理时间])表示需要实现,但目前还未实现的功能。这实际上是一个 Javadoc 的标签,目前的 Javadoc还没有实现,但已经被广泛使用。只能应用于类,接口和方法(因为它是一个 Javadoc 标签)。2) 错误,不能工作(FIXME):(标记人,标记时间,[预计处理时间])在注释中用 FIXME 标记某代码是错误的,而且不能工作,需要及时纠正的情况。


【强制】在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度。说明:不要在方法体内定义:Pattern pattern = Pattern.compile(规则);


【推荐】及时清理不再使用的代码段或配置信息。说明:对于垃圾代码或过时配置,坚决清理干净,避免程序过度臃肿,代码冗余。正例:对于暂时被注释掉,后续可能恢复使用的代码片断,在注释代码上方,统一规定使用三个斜杠(///)来说明注释掉代码的理由。


【强制】对大段代码进行 try-catch,这是不负责任的表现。catch 时请分清稳定代码和非稳定代码,稳定代码指的是无论如何不会出错的代码。对于非稳定代码的 catch 尽可能进行区分异常类型,再做对应的异常处理。


【强制】finally 块必须对资源对象、流对象进行关闭,有异常也要做 try-catch。说明:如果 JDK7 及以上,可以使用 try-with-resources 方式。


【强制】应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架SLF4J 中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。import org.slf4j.Logger;import org.slf4j.LoggerFactory;private static final Logger logger = LoggerFactory.getLogger(Abc.class);


【强制】日志文件推荐至少保存 15 天,因为有些异常具备以“周”为频次发生的特点。


【强制】对 trace/debug/info 级别的日志输出,必须使用条件输出形式或者使用占位符的方式。说明:logger.debug("Processing trade with id: " + id + " and symbol: " + symbol);如果日志级别是 warn,上述日志不会打印,但是会执行字符串拼接操作,如果 symbol 是对象,会执行 toString()方法,浪费了系统资源,执行了上述操作,最终日志却没有打印。正例:(条件)if (logger.isDebugEnabled()) {logger.debug("Processing trade with id: " + id + " and symbol: " + symbol);}正例:(占位符)logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);


【强制】好的单元测试必须遵守 AIR 原则。说明:单元测试在线上运行时,感觉像空气(AIR)一样并不存在,但在测试质量的保障上,却是非常关键的。好的单元测试宏观上来说,具有自动化、独立性、可重复执行的特点。 A:Automatic(自动化) I:Independent(独立性) R:Repeatable(可重复)


【强制】单元测试应该是全自动执行的,并且非交互式的。测试框架通常是定期执行的,执行过程必须完全自动化才有意义。输出结果需要人工检查的测试不是一个好的单元测试。单元测试中不准使用 System.out 来进行人肉验证,必须使用 assert 来验证。


【强制】表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint( 1 表示是,0 表示否)。说明:任何字段如果为非负数,必须是 unsigned。正例:表达逻辑删除的字段名 is_deleted,1 表示删除,0 表示未删除。


【强制】表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。说明:MySQL 在 Windows 下不区分大小写,但在 Linux 下默认是区分大小写。因此,数据库名、表名、字段名,都不允许出现任何大写字母,避免节外生枝。正例:aliyun_admin,rdc_config,level3_name反例:AliyunAdmin,rdcConfig,level_3_name


【推荐】字段允许适当冗余,以提高查询性能,但必须考虑数据一致。冗余字段应遵循:1)不是频繁修改的字段。2)不是 varchar 超长字段,更不能是 text 字段。正例:商品类目名称使用频率高,字段长度短,名称基本一成不变,可在相关联的表中冗余存储类目名称,避免关联查询。

开发手册目录 │ Addison Wesley - JDBC API Tutorial and Reference 3rd Edition (2003).chm │ ajax教程.chm │ AngularJS 中文API参考手册.chm │ Bootstrap-中文-API.chm │ css2.chm │ CSS4.0中文参考手册.chm │ cssv3.4.0.chm │ DHTML_DOC_CN.chm │ DHTML手册.chm │ dom4j.chm │ DOM_help.chm │ DOM中文参考手册CHM·chm.chm │ DOM文档对象模型手册.chm │ DTD.chm │ EasyUI-API+1.3.2.chm │ Ext2.2API中文版.CHM │ Ext3.2中文API.CHM │ Hibernate3.2.chm │ Hibernate3.2API.chm │ html5参考手册.chm │ HTML入门与提高.CHM │ Html标签一览表.chm │ html语法教程.chm │ HTTP1.1.chm │ J2EE_1.5_API.CHM │ J2EE_1.6_API.chm │ Java+EE+6+API+Specifications.CHM │ JavaEE_API_5[1].0.chm │ JavaScript Professional Projects.chm │ JavaScript20.chm │ JavaScript中文手册.CHM │ JavaScript手册.chm │ JavaScript语言中文参考手册.chm │ java_ee_api_中英文对照版.chm │ java_ee_api_中英文对照版.chw │ jBPM 4.4 API.chm │ jdk 1.7_api_doc.CHM │ JDK_API_1_6_zh_CN.CHM │ JDK_API_1_6_zh_CN.chw │ jquery1.7 中文手册.chm │ JQuery_1.4_API.CHM │ jQuery文档.chm │ JSP API.chm │ Jsp帮助文档.chm │ JSP语法.chm │ Linux基础命令教程豪华版.chm │ Linux常用命令大全.chm │ lucene_3.6.1_API.CHM │ MySQL_5.1_zh.chm │ POI_3.8_API.CHM │ Servlet API[China].chm │ Servlet-API.chm │ servlet.chm │ Spring-Reference_zh_CN.chm │ spring2.5.5_API.chm │ Spring3.0.2-RELEASE-API.chm │ Struts2.chm │ struts2中文教程.chm │ struts2标签.chm │ tomcat5.5中文帮助文档.chm │ W3CSchool .chm │ W3CSchool.chm │ w3school完整版.CHM │ WebGL自修教程.chm │ XML+Schema官方教程(9loong中文版)修正版2009.04.chm │ XmlSchema标准参考手册.chm │ XPathTutorial.chm │ 样式表中文手册.chm │ 网页制作完全手册.chm │ 英语资料大全.chm └─hadoop api
Addison Wesley - JDBC API Tutorial and Reference 3rd Edition (2003).chm ajax教程.chm AngularJS 中文API参考手册.chm Bootstrap-中文-API.chm css2.chm CSS4.0中文参考手册.chm cssv3.4.0.chm DHTML手册.chm dom4j.chm DOM_help.chm DOM中文参考手册CHM·chm.chm DOM文档对象模型手册.chm DTD.chm EasyUI-API+1.3.2.chm Ext2.2API中文版.CHM Ext3.2中文API.CHM FILESLIST111.TXT Hibernate3.2.chm html5参考手册.chm HTML入门与提高.CHM Html标签一览表.chm html语法教程.chm HTTP1.1.chm J2EE_1.5_API.CHM J2EE_1.6_API.chm Java+EE+6+API+Specifications.CHM JavaEE_API_5[1].0.chm JavaScript Professional Projects.chm JavaScript20.chm JavaScript中文手册.CHM JavaScript手册.chm JavaScript语言中文参考手册.chm java_ee_api_中英文对照版.chm jBPM 4.4 API.chm jdk 1.7_api_doc.CHM JDK_API_1_6_zh_CN.CHM jquery1.7 中文手册.chm JQuery_1.4_API.CHM jQuery文档.chm JSP API.chm Jsp帮助文档.chm JSP语法.chm Linux基础命令教程豪华版.chm Linux常用命令大全.chm lucene_3.6.1_API.CHM MySQL_5.1_zh.chm POI_3.8_API.CHM R.BAT Servlet API[China].chm Servlet-API.chm servlet.chm Spring-Reference_zh_CN.chm spring2.5.5_API.chm Spring3.0.2-RELEASE-API.chm Struts2.chm struts2中文教程.chm struts2标签.chm tomcat5.5中文帮助文档.chm W3CSchool.chm w3school完整版.CHM WebGL自修教程.chm XML+Schema官方教程(9loong中文版)修正版2009.04.chm XmlSchema标准参考手册.chm XPathTutorial.chm 样式表中文手册.chm 英语资料大全.chm
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值