阿里编码规范自省

一、命名风格我做得不好的

  1. 有时为了让名字短一些,没有描述清楚变量名
  2. DAO没有严格来按方法命名:get,list,count,save/insert,remove/delete,update

二、关于常量做得不好的

  1. 常量类需要分开来维护
  2. 跨应用共享常量(第二方库中)、应用内共享常量(子模块中的constant目录)、子工程内共享常量(当前子工程的constant目录)、包内共享常量(在当前包下单独的constant目录下)、类内共享常量(直接在类内部private static final定义)。
  3. 看常量是否可以抽成enum

三、代码风格我做得不好的:

  1. 换行时运算符我是留在最后的,需要放在新行里面
  2. 不同逻辑之间,插入一个空行,但有时我会插入多个空行

四、OOP规约

  1. 过时的接口必须增加@Deprecated注释
  2. 不能使用过时的方法,我有时会为了旧习惯还是会用一下。
  3. 所有的rpc或者网络通信的返回值和参数必须使用包装数据类型
  4. 构造方法中不要加入任何业务逻辑,有的话放到init()方法里面
  5. 类里面的方法顺序是公用>私有>getting/setting方法。我之前一直写反了。把私有的写在了前面。
  6. 若是static成员变量,必须考虑是否为final

五、集合

  1. toArray(T[] array)必须传入的size大小是刚好的,否则会加null或者重新分配内存空间
  2. Arrays.asList()不能使用add/remove/clear等方法,因为只是一个内部类,后台还是数组
  3. 集合初始化时,还是指定一下大小吧,有时还是会忘记,觉得无所谓。但是可能会重新扩大好多次的。
  4. 使用EntrySet来遍历集合,或者使用Map.foreach()

六、并发:

  1. 线程创建时加一下名称
  2. 线程资源必须通过线程池来提供
  3. 线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式。
    4.用 Instant 代替 Date,LocalDateTime 代替 Calendar, DateTimeFormatter 代替 SimpleDateFormat
    5.使用ThreadLocalRandom
  4. if else不要超过3层,否则使用提前处理的方式来解决。
  5. 不要把if中的case写成语句,而是用一个有含义的变量来处理。这个我还需要改进。
  6. 循环还是需要多考虑一下性能,try catch能放外面就放外面吧
  7. 关于参数校验,需要考虑清楚,对外开放的接口,一定要进行校验。DAO的校验可以省的话还是能省的。

七、异常

  1. JDK8 的 Optional 类来防止 NPE 问题
  2. 对于外部的接口,必须使用错误码而不是异常;应用内部使用异常;RPC调用优先考虑使用"isSuccess()","errorCode","errorMsg"
  3. 避免代码出现重复。

八、日志

  1. 保留时间需要大于15天,也就是两周
  2. 日志命名需要有规范:stats/monitor/visit
  3. 先判断级别,再打印日志
  4. 避免重复打印日志,additivity=false

九、测试

  1. UT最多是类级别,一般是方法级别
  2. 单元测试的基本目标:语句覆盖率达到 70%;核心模块的语句覆盖率和分支覆盖率都 要达到 100%
  3. 对于数据库相关的查询,更新,删除等操作,不能假设数据库里的数据是存在的, 或者直接操作数据库把数据插入进去,请使用程序插入或者导入数据的方式来准备数据。
  4. 开发人员需要和测试人员一起确定单元测试的范围。最好覆盖所有的测试用例。
  5. 在项目发布前就完成单元测试。之前为了赶工,单元测试没有补全。

十、安全

  1. 必须执行 CSRF 安全过滤
    mysql字段:
  2. 表示是否的时候,必须使用is_*,我之前使用得不太对。
  3. 表名字段名都不允许出现大写
  4. 小数类型为 decimal
  5. text过长的话,独立一张表出来避免影响其他字段的索引。
  6. 表名最好是:'业务名称_表的作用'来命名
  7. 冗余字段可以有,但不要是varchar或者text
  8. 如果数量不在500万行以上或者2G以上,不要分库分表。
  9. 选择合适的字符存储长度,可以提升检索速度和节约空间。

十一、数据库索引:

  1. 只要没有唯一索引,就一定会出现脏数据。所以有这样的业务字段,需要加上唯一索引。
  2. 禁止3表join
  3. varchar上建立索引时,必须指定索引长度。可以进一下区分度90%以上的就行了。这个我是没有做到的。count(distinct left(列名, 索引长度))/count(*)
  4. 有order by的场景,需要考虑联合索引的顺序。例如
    正例:where a=? and b=? order by c; 索引:abc 而索引中有范围查找,那么索引有序性无法利用,如:WHERE a>10 ORDER BY b; 索引 a_b 无法排序
  5. 进行分而查询时,使用主索引先返回id再进行关联。
    正例:SELECT a.* FROM 表 1 a, (select id from 表 1 where 条件 LIMIT 100000,20 ) b where a.id=b.id
  6. 建索引时,把区分度高的放在左边。另外如果有等号和非等号时,就算非等号的区分度大,也放在后面

十二、ORM:

  1. sql.xml 配置参数使用:#{}
  2. 不要更新没有修改的字段

十三、二方库依赖

  1. GroupID格式:com.{公司/BU }.业务线.[子业务线],最多4级。
  2. 二方库版本号命名方式:主版本号.次版本号.修订号
    注意起始版本号必须为:1.0.0,而不是 0.0.1
  3. 线上应用不要依赖 SNAPSHOT 版本
  4. 依赖于一个二方库群时,必须定义一个统一的版本变量,避免版本号不一致
  5. 所有 pom 文件中的依赖声明放在语句块中,所有版本仲裁放在 语句块中

十四、服务器

  1. 给 JVM 设置-XX:+HeapDumpOnOutOfMemoryError 参数,让 JVM 碰到 OOM 场景时输出
    dump 信息。
  2. 在线上生产环境,JVM的Xms和Xmx设置一样大小的内存容量,避免在GC 后调整堆 大小带来的压力。这个我之前没有做好。

十五、认证

可以去阿里云上做一下认证的题,我看完后也并没有一次就通过。 认证

comments powered by Disqus