阿里巴巴编码规范(JAVA)认证考后感

编码规范

  • 定义DO / DTO / VO 等POJO类时, 不要设定任何属性默认值。
  • 所有的覆写方法必须添加@override注解;
  • 类型与中括号紧挨相连来表示数组。 int[] arrayDemo,而不要 int arrayDemo[]
  • 不要在接口里定义变量。
  • 不要在括号、逗号前换行。
  • 避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可。
  • 相同参数类型,相同业务含义,才可以使用 Java 的可变参数,避免使用 Object。可变参数必须放置在参数列表的最后。 (提倡同学们尽量不用可变参数编程)
  • 外部正在调用或者二方库依赖的接口,不允许修改方法签名,避免对接口调用方产生影响。接口过时必须加@Deprecated 注解,并清晰地说明采用的新接口或者新服务是什么。
  • 推荐使用 java.util.Objects#equals。

概念

if语句使用卫语句减少层级嵌套。
卫语句就是把复杂的条件表达式拆分成多个条件表达式,比如一个很复杂的表达式,嵌套好几层的if - then-else语句,转换为多个if语句,实现它的逻辑,这多条的if语句就是卫语句。

if(obj != null){
  doSomething();
}

转换成卫语句以后的代码如下:

if(obj == null){
   return;
}
doSomething();

参考:
https://blog.csdn.net/Soumns_Kris/article/details/78390492
https://blog.csdn.net/jw903/article/details/45506777

单元测试

白盒测试中的代码覆盖率种类:语句覆盖、分支覆盖(判定覆盖)、条件覆盖、路径覆盖。语句覆盖是最弱的一种度量方式,即使是路径覆盖也不能保证程序完全没问题。

数据库

  • NULL与任何值比较的结果都为NULL。使用 ISNULL()来判断是否为 NULL 值。
  • 索引中有范围查找,那么索引有序性无法利用,如: WHERE a>10 ORDER BY b; 索引 a_b 无法排序。
  • 在 varchar 字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度即可。索引的长度与区分度是一对矛盾体,一般对字符串类型数据,长度为 20 的索引,区分度会高达 90%以上,可以使用 count(distinct left(列名, 索引长度))/count(*)的区分度来确定。
  • 利用覆盖索引来进行查询操作, 避免回表。能够建立索引的种类分为主键索引、唯一索引、普通索引三种,而覆盖索引只是一种查询的一种效果,用 explain 的结果, extra 列会出现: using index.
  • 利用延迟关联或者子查询优化超多分页场景。先快速定位需要获取的 id 段,然后再关联:
    SELECT a.* FROM 表 1 a, (select id from 表 1 where 条件 LIMIT 100000,20 ) b where a.id=b.id
  • SQL 性能优化的目标:至少要达到 range 级别, 要求是 ref 级别, 如果可以是 consts 最好。1)consts 单表中最多只有一个匹配行(主键或者唯一索引) ,在优化阶段即可读取到数据。2) ref 指的是使用普通的索引(normal index) 。3) range 对索引进行范围检索。explain 表的结果, type=index,索引物理文件全扫描,速度非常慢,这个 index 级别比较 range 还低,与全表扫描是小巫见大巫。
  • 防止因字段类型不同造成的隐式转换, 导致索引失效。
  • 建组合索引的时候,区分度最高的在最左边。存在非等号和等号混合时,在建索引时,请把等号条件的列前置。
  • 不要使用 count(列名)或 count(常量)来替代 count(*)count(*)是 SQL 92 定义的标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。count(*)会统计值为 NULL 的行,而 count(列名)不会统计此列为 NULL 值的行。
  • 避免 sum 的 NPE 问题: SELECT IF(ISNULL(SUM(g)),0,SUM(g)) FROM table
  • TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少,但 TRUNCATE 无事务且不触发 trigger,有可能造成事故,故不建议在开发代码中使用此语句。TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同。
  • 在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。哪怕是极端情况下,需要查询实体类/表的所有字段,也不准使用 * 。
  • <isEqual>中的 compareValue 是与属性值对比的常量,一般是数字,表示相等时带上此条件; <isNotEmpty>表示不为空且不为 null 时执行; <isNotNull>表示不为 null 值时执行。
  • 不得使用外键与级联,一切外键概念必须在应用层解决。外键与级联更新适用于单机低并发,不适合分布式、高并发集群; 级联更新是强阻塞,存在数据库更新风暴的风险; 外键影响数据库的插入速度。

其他

应用服务器一般都带有连接池功能,故而应用服务器与数据库之间的是长连接。

猜你喜欢

转载自blog.csdn.net/lonelymanontheway/article/details/81124159