【开发规范】阿里巴巴Java开发手册学习总结(持续更新)


      在此,有个很好的开发手册想要分享的,《阿里巴巴Java开发手册》,里面的规范经验十分全面,而且不少经验是在开发中得出来的,虽然是Java,但觉得道理是相通的,当运用到项目中,对项目更有帮助,具体几点好的我总结一下:

程序篇:
OOP约束
  1.Object 的 equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals。所有的相同类型的包装类对象之间值的比较,全部使用 equals 方法比较。
  2.使用索引访问用 String 的 split 方法得到的数组时,需做最后一个分隔符后有无内容的检查,否则会有抛 IndexOutOfBoundsException 的风险。
  3.不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator方式,如果并发操作,需要对 Iterator 对象加锁。

并发处理
  1.线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。
  2.并发修改同一记录时,避免更新丢失,需要加锁。要么在应用层加锁,要么在缓存加锁,要么在数据库层使用乐观锁,使用 version 作为更新依据。

异常日志
  1.对大段代码进行 try-catch,这是不负责任的表现。catch 时请分清稳定代码和非稳定代码,稳定代码指的是无论如何不会出错的代码。对于非稳定代码的 catch 尽可能进行区分异常类型,再做对应的异常处理。
  2.避免出现重复的代码(Don’t Repeat Yourself),即 DRY 原则。必要时抽取共性方法,或者抽象公共类,甚至是组件化。
  3.捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请将该异常抛给它的调用者。

安全规约
  1.用户输入的 SQL 参数严格使用参数绑定或者 METADATA 字段值限定,防止 SQL 注入,禁止字符串拼接 SQL 访问数据库。
  2.表单、AJAX 提交必须执行 CSRF 安全过滤。
  3.在使用平台资源,譬如短信、邮件、电话、下单、支付,必须实现正确的防重放限制,如数量限制、疲劳度控制、验证码校验,避免被滥刷、资损。

数据库篇:
建表
  1.如果存储的字符串长度几乎相等,使用 char 定长字符串类型。
  2.库名与应用名称尽量一致。
  3.单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。

索引
  1.业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。
  2.超过三个表禁止 join。需要 join 的字段,数据类型必须绝对一致;多表关联查询时,保证被关联的字段需要有索引。
  3.在 varchar 字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度即可。
  4.如果有 order by 的场景,请注意利用索引的有序性。order by 最后的字段是组合索引的一部分,并且放在索引组合顺序的最后,避免出现 file_sort 的情况,影响查询性能。
  5.利用覆盖索引来进行查询操作,避免回表。
  6.建组合索引的时候,区分度最高的在最左边
  7.创建索引时避免有如下极端误解:
    1)宁滥勿缺。认为一个查询就需要建一个索引。
    2)宁缺勿滥。认为索引会消耗空间、严重拖慢更新和新增速度。
    3)抵制惟一索引。认为业务的惟一性一律需要在应用层通过“先查后插”方式解决。

SQL语句
  1.使用 ISNULL()来判断是否为 NULL 值。
  2.不得使用外键与级联,一切外键概念必须在应用层解决。
  3.禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。
  4.不要使用 count(列名)或 count(常量)来替代 count(*)。count(*)会统计值为 NULL 的行,而 count(列名)不会统计
  5.在表查询中,一律不要使用 *
  6.@Transactional 事务不要滥用。事务会影响数据库的 QPS

原文地址:https://www.cnblogs.com/laokchen/p/13306188.html