Java开发手册,阿里原稿梳理

命名规范

1.代码中的命名不能以下划线、美元符开始或结束。

2.不能拼音和英文公用。

3.类名大写开始的驼峰。UpperCamelCase

4.方法名、参数名、成员变量、局部变量统一使用小写开始的驼峰。

5.常量名全部用大写,单词间用下划线,切记要语义表达清楚完整。

6.抽象类命名以Abstract或Base开头,异常类命名使用Exception结尾;测试类以Test结尾。

7.POJO类中的布尔类型的变量,不要以is开头。如:private boolean isGood;的get、set方法,

  public boolean isGood() {

        return isGood;

    }

  public void setGood(boolean good) {

        isGood = good;

    }

set方法的参数变成了good,而不是isGood。

一些Web框架,页面使用框架的标签显示对象的值,就容易取不到,报异常。

8.包名统一使用小写,统一使用单数形式。如com.alibaba.ai.util。而不是utils。

9.杜绝不规范的肆意缩写。如 AbstractClass “缩写”命名成 AbsClass。

10.命名要有解释作用,不能int a。

11.如果模块、接口、类、方法使用了设计模式,命名的时候提现出设计模式,如LoginProxy;OrderFactory;EcodingFileter。

12.接口类中的方法和属性不要加任何修饰符,如public也不要。方法就直接void commit()最好。

因为接口中的每一个方法也是隐式抽象的,方法会被指定为public abstract。

13.对于Service和Dao类,基于SOA理念,暴露出来的服务一定是接口,如CacheService实现CacheServiceImpl接口。

14.枚举类名建议加Enum后缀。

15.Service / DAO 层方法命名规约

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

2 ) 获取多个对象的方法用 list 做前缀,复数形式结尾如:listObjects。

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.不允许出现任何魔法值(magic value)(即未经预先定义的常量)直接出现在代码中。

如:int kpiValue=8*sqi。8就是魔法值。

2.使用long类型常量时,应用大写的L。小写的容易看成数字1.

3.常量的定义建议通过命名来分类,提高可读性和方便查找。如:缓存相关的常量命名为CACHE_XXXX。

代码格式

1.大括号的使用,内容为空则写成{},不为空则如下

if  (a!=c){

a=b+c;

}else{

}

2.小括号左右不留空格,反例:(  a==b  )。

3.if / for / while / switch / do 等保留字与括号之间都必须加空格。

4.任何二目三目运算符,左右两边各加一个空格。a&&b  a<b?b:c

public static void main(String[] args) {

// 缩进 4 个空格

String say = "hello";

// 运算符的左右必须有一个空格

int flag = 0;

// 关键词 if 与括号之间必须有一个空格,括号内的 f 与左括号,0 与右括号不需要空格

if (flag == 0) {

System.out.println(say);

}

// 左大括号前加空格且不换行;左大括号后换行

if (flag == 1) {

System.out.println("world");

// 右大括号前换行,右大括号后有 else,不用换行

} else {

System.out.println("ok");

// 在右大括号后直接结束,则必须换行

}

}

5.注释的双斜线与注释内容之间必须有个空格。

6.当行不超过120个字符,超出需换行,第二行相对第一行加4个空格。点符号、运算符与下文一同换行。

7.方法参数在定义和传入时,多个参数逗号后面必须加空格。method(arg1, arg2, arg3).

8.IDE 的 text file encoding 设置为 UTF -8 ; IDE 中文件的换行符使用 Unix 格式,不要使用 Windows 格式。

9.不要为了多行之间对齐而胡乱加空格。

10.任何情形,都没有必要出入多个空行进行隔开。

ORM映射

1.在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。

说明:1 ) 增加查询分析器解析成本。2 ) 增减字段容易与 resultMap 配置不一致。3)无用字

段增加网络消耗,尤其是 text 类型的字段。

2.POJO 类的布尔属性不能加 is ,而数据库字段必须加 is _。

3.不要用 resultClass 当返回参数,即使所有类属性名与数据库字段一一对应,也需

要定义。

4.sql. xml 配置参数使用:#{},# param # 不要使用${} 此种方式容易出现 SQL 注入。

5.iBATIS 自带的 queryForList(String statementName , int start , int size) 不推

荐使用。

6.不允许直接拿 HashMap 与 Hashtable 作为查询结果集的输出。

建表规约

1.表达是与否的字段,必须使用is_xxxx的方式命名,数据类型是unsigned tinyint。

2.表名、字段名必须使用小写字母或数字 , 禁止出现数字开头,禁止两个下划线中间只

出现数字。 MySQL 在 Windows 下不区分大小写,但在 Linux 下默认是区分大小写。因此,数据库名、表名、字段名,都不允许出现任何大写字母,避免节外生枝。

3.表名不使用复数名词。

4.禁用保留字,如 desc 、 range 、 match 、 delayed 等。

5.主键索引名为 pk_ 字段名;唯一索引名为 uk _字段名 ; 普通索引名则为 idx _字段名。

说明: pk_ 即 primary key;uk _ 即 unique key;idx _ 即 index 的简称。

6.小数类型为 decimal ,禁止使用 float 和 double 。

7.如果存储的字符串长度几乎相等,使用 char 定长字符串类型。

8.varchar 是可变长字符串,不预先分配存储空间,长度不要超过 5000,如果存储长

度大于此值,定义字段类型为 text ,独立出来一张表,用主键来对应,避免影响其它字段索

引效率。

9.表必备三字段: id , gmt _ create , gmt _ modified。其中 id 必为主键,类型为 bigint unsigned 、单表时自增、步长为 1。 gmt_create,gmt_modified 的类型均为 datetime 类型,前者现在时表示主动创建,后者过去分词表示被动更新。

10.表的命名最好是加上“业务名称_表的作用”。

11.库名与应用名称尽量一致。

12.单表行数超过 500 万行或者单表容量超过 2 GB ,才推荐进行分库分表。如果预计三年后的数据量根本达不到这个级别,不建议分表分库。

13.合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检

索速度。其中无符号值可以避免误存负数。

SQL语句

1.不要使用 count( 列名 ) 或 count( 常量 ) 来替代 count( * ) , count( * ) 会统计值为 NULL 的行,而 count( 列名 ) 不会统计此列为 NULL 值的行。

2.count(distinct col) 计算该列除 NULL 之外的不重复行数,注意 count(distinct col 1, col 2 ) 如果其中一列全为 NULL ,那么即使另一列有不同的值,也返回为 0。

3.当某一列的值全是 NULL 时, count(col) 的返回结果为 0,但 sum(col) 的返回结果为

NULL ,因此使用 sum() 时需注意 NPE 问题。

4.在代码中写分页查询逻辑时,若 count 为 0 应直接返回,避免执行后面的分页语句。

5.不得使用外键与级联,一切外键概念必须在应用层解决。外键与级联更新适用于单机低并发,不适合分布式、高并发集群 ; 级联更新是强阻塞,存在数据库更新风暴的风险 ; 外键影响数据库的插入速度。

6.禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。

7.数据订正(特别是删除、修改记录操作)时,要先 select ,避免出现误删除,确认

无误才能执行更新语句。

8.in 操作能避免则避免,若实在避免不了,需要仔细评估 in 后边的集合元素数量,控

制在 1000 个之内。

9.如果有国际化需要,所有的字符存储与表示,均以 utf -8 编码,注意字符统计函数

的区别。如果需要存储表情,那么选择 utf8mb 4 来进行存储,注意它与 utf -8 编码的区别。

10.TRUNCATE TABLE 不记录在日志中,所以无事务且不触发 trigger。谨慎使用。TRUNCATE 删除数据,不留日志。不带WHERE的DELETE语句有日志,可以ROLLBACK。而DROP TABLE则删除表结构。

安全规约

1.隶属于用户个人的页面或者功能必须进行权限控制校验。

2.用户敏感数据禁止直接展示,必须对展示数据进行脱敏。

3.用户输入的 SQL 参数严格使用参数绑定或者 METADATA 字段值限定,防止 SQL 注入,

禁止字符串拼接 SQL 访问数据库。

4.禁止向 HTML 页面输出未经安全过滤或未正确转义的用户数据。

5.表单、AJAX 提交必须执行 CSRF 安全验证。

6.在使用平台资源,譬如短信、邮件、电话、下单、支付,必须实现正确的防重放的机

制,如数量限制、疲劳度控制、验证码校验,避免被滥刷而导致资损。

7.发贴、评论、发送即时消息等用户生成内容的场景必须实现防刷、文本内容违禁词过

滤等风控策略。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容