阿里巴巴开发规范学习

一、基本编程规约:

1、命名规范:类名必须是驼峰命名,例如XmlSerevice、UserService。
2、 方法名、变量名、参数名、局部变量统一为小驼峰命名,例如:getUserInfo()。
3、常量名全部大写,中间用下划线分隔,例如:MAX_NUMBER。
4、抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾;测试类命名以它要测试的类的名称开始,以Test结尾。
5、中括号是数组类型的一部分,数组定义如下:String[] args;
6、POJO类中布尔类型的变量,都不要加 is,否则部分框架解析会引起序列化错误。
7、包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用 单数形式,但是类名如果有复数含义,类名可以使用复数形式。
8、接口类中的方法和属性不要加任何修饰符号(public也不要加),保持代码的简洁性,并加上有效的Javadoc注释。尽量不要在接口里定义变量,如果一定要定义变量,肯定是与接口方法相关,并且是整个应用的基础常量。 例如接口方法:void f();
9、对于Service和DAO类,基于SOA的理念,暴露出来的服务一定是接口,内部的实现类用Impl的后缀与接口区别。 例如:CacheServiceImpl实现CacheService接口。
10、枚举类名建议带上Enum后缀,枚举成员名称需要全大写,单词间用下划线隔开。 说明:枚举其实就是特殊的常量类,且构造方法被默认强制是私有。例如:枚举名字:DealStatusEnum,成员名称:SUCCESS / UNKOWN_REASON。
11、给long或者Long初始赋值时,必须使用大写的 L,不能是小写的 l,小写容易跟数字1混淆,造成误解。
12、各层命名规约:

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。

二、格式规约:

1、大括号的使用约定。
如果是大括号内为空,则简洁地写成{}即可,不需要换行;
如果是非空代码块则:
1) 左大括号前不换行。
2) 左大括号后换行。
3) 右大括号前换行。
4) 右大括号后还有 else 等代码则不换行;表示终止右大括号后必须换行。

2、方法体内的执行语句组、变量的定义语句组、不同的业务逻辑之间或者不同的语义之间插入一个空行。相同业务逻辑和语义之间不需要插入空行。
3、POJO类必须写toString方法。如果继承了另一个POJO类,注意在前面加一下super.toString。 说明:在方法执行抛出异常时,可以直接调用POJO的toString()方法打印其属性值,便于排查问题。
4、类内方法定义顺序依次是:公有方法或保护方法 > 私有方法 > getter/setter方法。 说明:公有方法是类的调用者和维护者最关心的方法,首屏展示最好;保护方法虽然只是子类关心,也可能是“模板设计模式”下的核心方法;而私有方法外部一般不需要特别关心,是一个黑盒实现;因为方法信息价值较低,所有Service和DAO的 getter/setter方法放在类体最后。
5、循环体内,字符串的联接方式,使用 StringBuilder 的 append 方法进行扩展。
6、final类型可提高程序响应效率,声明成final的情况:
1)不需要重新赋值的变量,包括类属性、局部变量。
2) 对象参数前加final,表示不允许修改引用的指向。
3) 类方法确定不允许被重写。

三、集合规约:

1、关于hashCode和equals的处理,遵循如下规则:
1) 只要重写equals,就必须重写hashCode。
2) 因为Set存储的是不重复的对象,依据hashCode和equals进行判断,所以Set存储的对象必须重写这两个方法。
3) 如果自定义对象做为Map的键,那么必须重写hashCode和equals。
例如:String 重写了hashCode和equals方法,所以我们可以非常愉快地使用String对象作为key来使用。

四、注释规约:

1、类、类属性、类方法的注释必须使用Javadoc规范,使用/**内容*/格式,不得使用//xxx方式。 有助于不进入方法,只需要悬浮方法即可得到相关提示信息。
2、所有的抽象方法(包括接口中的方法)必须要用Javadoc注释、除了返回值、参数、 异常说明外,还必须指出该方法做什么事情,实现什么功能。
3、所有的类都必须添加创建者信息。
4、方法内部单行注释,在被注释语句上方另起一行,使用//注释。方法内部多行注释 使用/* */注释,注意与代码对齐。
5、所有的枚举类型字段必须要有注释,说明每个数据项的用途。
6、代码修改的同时,注释也要进行相应的修改,尤其是参数、返回值、异常、核心逻辑等的修改。
7、注释掉的代码尽量要配合说明,而不是简单的注释掉。代码被注释掉有两种可能性:1)后续会恢复此段代码逻辑。2)永久不用。前者如果没有备注信息,难以知晓注释动机。后者建议直接删掉(代码仓库保存了历史代码)。
8、特殊注释标记,请注明标记人与标记时间。注意及时处理这些标记,通过标记扫描, 经常清理此类标记。
1) 待办事宜(TODO):( 标记人,标记时间,[预计处理时间]) 表示需要实现,但目前还未实现的功能。
2) 错误,不能工作(FIXME):(标记人,标记时间,[预计处理时间]) 在注释中用FIXME标记某代码是错误的,而且不能工作,需要及时纠正的情况。

五、MySQL规约:

1、表达是与否概念的字段,必须使用is_xxx的方式命名,数据类型是unsigned tinyint ( 1 表示是,0 表示否),此规则同样适用于odps建表。 说明:任何字段如果为非负数,必须是unsigned。
2、表名、字段名必须使用小写字母或数字;禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。
3、表名不使用复数名词。 说明:表名应该仅仅表示表里面的实体内容,不应该表示实体数量,对应于DO类名也是单数形式,符合表达习惯。
4、唯一索引名为uk_字段名;普通索引名则为 idx_字段名。 说明:uk_ 即 unique keyidx_ 即 index的简称。
5、小数类型为decimal,禁止使用float和double。 说明:float和double在存储的时候,存在精度损失的问题,很可能在值的比较时,得到不正确的结果。如果存储的数据范围超过decimal的范围,建议将数据拆成整数和小数分开存储。
6、如果存储的字符串长度几乎相等,使用char定长字符串类型。
7、varchar 是可变长字符串,不预先分配存储空间,长度不要超过5000,如果存储长度大于此值,定义字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索 引效率。
8、表的命名最好是加上“业务名称_表的作用”。
9、库名与应用名称尽量一致。
10、如果修改字段含义或对字段表示的状态追加时,需要及时更新字段注释。
11、字段允许适当冗余,以提高性能,但是必须考虑数据同步的情况。
冗余字段应遵循: 1)不是频繁修改的字段。 2)不是varchar超长字段,更不能是text字段。
12、单表行数超过500万行或者单表容量超过2GB,才推荐进行分库分表。 说明:如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表。
13、合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度。
14、不要使用count(列名)或count(常量)来替代count(*)count(*)就是SQL92定义的标准统计行数的语法,跟数据库无关,跟NULL和非NULL无关。 说明:count(*)会统计值为NULL的行,而count(列名)不会统计此列为 NULL值的行。
15、count(distinct col)计算该列除NULL之外的不重复数量。注意count(distinct col1, col2) 如果其中一列全为 NULL,那么即使另一列有不同的值,也返回为0。
16、当某一列的值全是NULL时,count(col)的返回结果为0,但sum(col)的返回结果为NULL,因此使用sum()时需注意NPE问题。 可以使用如下方式来避免sum的NPE问题:SELECT IF(ISNULL(SUM(g)),0,SUM(g)) FROM table;
17、使用ISNULL()来判断是否为NULL值。注意:NULL与任何值的直接比较都为NULL。
说明: 1)NULL<>NULL的返回结果是NULL,而不是false。
​ 2) NULL=NULL的返回结果是NULL,而不是true。
​ 3) NULL<>1的返回结果是NULL,而不是true。
18、数据订正时,删除和修改记录时,要先select,避免出现误删除,确认无误才能执行更新语句。
19、in操作能避免则避免,若实在避免不了,需要仔细评估in后边的集合元素数量,控制在1000个之内。
20、如果有全球化需要,所有的字符存储与表示,均以utf-8编码,那么字符计数方法
说明:
SELECT LENGTH("轻松工作"); 返回为12
SELECT CHARACTER_LENGTH("轻松工作"); 返回为4
如果要使用表情,那么使用utfmb4来进行存储,注意它与utf-8编码的区别
21、TRUNCATE TABLE比DELETE速度快,且使用的系统和事务日志资源少,但TRUNCATE无事务且不触发 trigger,有可能造成事故,故不建议在开发代码中使用此语句。 说明:TRUNCATE TABLE在功能上与不带 WHERE 子句的DELETE语句相同。

六、ORM规约:

1、在表查询中,一律不要使用*作为查询的字段列表,需要哪些字段必须明确写明。
说明:1)增加查询分析器解析成本。2)增减字段容易与resultMap配置不一致。
2、POJO类的boolean属性不能加is,而数据库字段必须加 is_,要求在 resultMap中进行字段与属性之间的映射。 说明:参见定义POJO 类以及数据库字段定义规定,在 sql.xml 增加映射,是必须的。
3、xml 配置中参数注意使用:#{},#{param} 不要使用${}此种方式容易出现SQL注 入。
4、不要写一个大而全的数据更新接口,传入为POJO类,不管是不是自己的目标更新字 段,都进行update table set c1=value1,c2=value2,c3=value3; 这是不对的。执行SQL时,尽量不要更新无改动的字段,一是易出错;二是效率低;三是binlog增加存储。
5、@Transactional事务不要滥用。事务会影响数据库的QPS(性能指标,查询秒级),另外使用事务的地方需要考虑各方面的回滚方案,包括缓存回滚、搜索引擎回滚、消息补偿、统计修正等。

以上内容来源于阿里巴巴开发规范手册,仅供学习参考使用。

猜你喜欢

转载自www.cnblogs.com/jasonboren/p/12329176.html
今日推荐