阿城区建设小学网站,seo优化网站查询,wordpress for ipad,网站流量分析报告入职新公司第三天#xff0c;没干啥其他活#xff0c;基本在阅读产研开发规范。公司在技术方面沿用的是阿里的一套技术#xff0c;所以入职之前需要先阅读《阿里巴巴开发规范》。今天整理一些平时需要关注的阿里规约和数据库开发规范#xff0c;方便今后在开发过程中查阅。…入职新公司第三天没干啥其他活基本在阅读产研开发规范。公司在技术方面沿用的是阿里的一套技术所以入职之前需要先阅读《阿里巴巴开发规范》。今天整理一些平时需要关注的阿里规约和数据库开发规范方便今后在开发过程中查阅。
文章目录阿里规约数据库开发规范阿里规约
下文提到的规约除标注【推荐】类型的都属于阿里【强制】类型的规约开发过程中需要严格遵守。 相关命名严禁使用“拼音”或者“拼音英文”的方式国际通用的中文名称可视同英文 类名使用驼峰风格除了DO、DTO、BO等 抽象类使用Abstract或者Base开头异常类使用Exception结尾测试类以测试类名开头以Test结尾 POJO类型的布尔类型变量不使用is作为开头 如isDeleted部分框架解析会出现序列化错误 不允许在子父类的成员变量之间不同代码块的局部变量之间采用完全相同的命名 杜绝完全不规范的缩写避免望文不知义 对于 Service 和 DAO 类基于 SOA 的理念暴露出来的服务一定是接口内部的实现类用Impl的后缀与接口区别。 不允许任何魔法值(即未经预先定义的常量)直接出现在代码中防止其他开发人员错写变量 推荐的规约常量复用的五个层次跨应用共享常量、应用内共享常量、子工程内共享常量、包 内共享常量、类内共享常量。 跨应用共享常量:放置在二方库中通常是 client.jar 中的 constant 目录下。应用内共享常量:放置在一方库中通常是子模块中的 constant 目录下。 反例:易懂变量也要统一定义成应用内共享常量两位工程师在两个类中分别定义了“YES”的变量: 类 A 中:public static final String YES “yes”; 类 B 中:public static final String YES “y”; A.YES.equals(B.YES)预期是 true但实际返回为 false导致线上问题。子工程内部共享常量:即在当前子工程的 constant 目录下。 4) 包内共享常量:即在当前包下单独的 constant 目录下。类内共享常量:直接在类内部 private static final 定义。 如果是大括号内为空则简洁地写成{}即可右大括号后还有else等代码则不换行 if/for/while/switch/do等保留字与括号之间都必须加空格 采用 4 个空格缩进禁止使用 Tab 字符如果使用 Tab 缩进必须设置 1 个 Tab 为 4 个空格。IDEA 设置 Tab 为 4 个空格时请勿勾选 Use tab character 注释的双斜线与注释内容之间有且仅有一个空格。 在进行类型强制转换时右括号与强制转换值之间不需要任何空格隔开 单行字符数限制不超过 120 个超出需要换行第二行相对第一行缩进 4 个空格从第三行开始不再继续缩进 IDE 的 text file encoding 设置为 UTF-8; IDE 中文件的换行符使用 Unix 格式不要使用 Windows 格式。 【推荐】单个方法的总行数不超过 80 行。 所有的覆写方法必须加Override注解。 外部正在调用或者二方库依赖的接口不允许修改方法签名避免对接口调用方产生影响。 强制不能使用过时的类或方法。 所有整型包装类对象之间值的比较全部使用equals方法比较。 任何货币金额均以最小货币单位且整型类型来进行存储。最小货币单位例如分整型类型例如Long 浮点数之间的等值判断基本数据类型不能用来比较包装数据类型不能用 equals 来判断。BigDecimal 的等值比较应使用 compareTo()方法而不是 equals()方法 使用BigDecimal的valueOf()方法替代构造方法BigDecimal(double)将Double值转化为BigDecimal对象因为构造方法会存在精度损失风险。 定义DO/DTO/VO等POJO类时不要设定任何属性默认值如createTime字段不能设定默认值为new Date()。 构造方法里面禁止加入任何业务逻辑如果有初始化逻辑请放在 init 方法中 POJO类必须写toString()方法如果继承了另一个POJO类需要在前面添加super.toString 禁止在POJO类中同时存在对应属性xxx的isXxx()和getXxx()方法 【推荐】类内方法定义的顺序依次是公有方法或保护方法 私有方法 getter / setter 方法 【推荐】类成员与方法访问控制从严工具类不允许有public或default构造方法 不允许在程序任何地方中使用:1)java.sql.Date。 2)java.sql.Time。 3)java.sql.Timestamp。 关于hashCode和equals的处理
只要覆写 equals就必须覆写 hashCode。(如果不覆写hashCode方法就会违反规定通过equals方法判定为相等的对象必须有相同的hashCode因为 Set 存储的是不重复的对象依据 hashCode 和 equals 进行判断所以 Set 存储的对象必须覆写 这两种方法。如果自定义对象作为 Map 的键那么必须覆写 hashCode 和 equals
判断所有集合内部的元素是否为空使用isEmpty()方法而不是size()0的方式。在使用java.util.stream.Collectors类的toMap()方法转为Map集合时一定要注意当 value 为 null 时会抛 NPE 异常。使用Map的方法keySet()/values()/entrySet()返回集合对象时不可以对其进行添加元素操作否则会抛出 UnsupportedOperationException 异常使用集合转数组的方法必须使用集合的 toArray(T[] array)传入的是类型完全一致、长度为 0 的空数组。在无泛型限制定义的集合赋值给泛型限制的集合时在使用集合元素时需要进行 instanceof 判断避免抛出 ClassCastException 异常。【推荐】集合初始化时指定集合初始值大小。如果能确定集合需要存储的元素数量则在创建集合的时候需要指定集合大小避免集合在容量满后被动扩容。
反例HashMap需要放置1024个元素由于没有设置容量初始大小随着元素增加而被迫不断扩容resize()方法总共会调用 8 次反复重建哈希表和数据迁移。当放置的集合元素个数达千万级时会影响程序 性能。
使用 entrySet 遍历 Map 类集合 KV而不是 keySet 方式进行遍历。说明:keySet 其实是遍历了 2 次一次是转为 Iterator 对象另一次是从 hashMap 中取出 key 所对应的 value。而 entrySet只是遍历了一次就把 key 和 value 都放到了 entry 中效率更高。如果是 JDK8使用 Map.forEach 方法。创建线程或线程池时请指定有意义的线程名称方便出错时回溯。SimpleDateFormat 是线程不安全的类一般不要定义为 static 变量如果定义为 static必须加锁或者使用 DateUtils 工具类。必须回收自定义的 ThreadLocal 变量尤其在线程池场景下线程经常会被复用 如果不清理自定义的ThreadLocal 变量可能会影响后续业务逻辑和造成内存泄露等问题。 尽量在代理中使用 try-finally 块进行回收。
数据库开发规范
表命名规范
实体表使用尽量准确的英文单数表示若一个英文单词不足以表示表的意义可用下横杠分割小写命名。备份以bak_开头分表以pt_开头归档表以arch_xxxx_开头临时表以tmp_开头日志表以log_开头。
索引非唯一索引命名为 idx_列名1_列名2唯一索引命名为 uk_列名1_列名2如果列名太长或列太多可酌情精简字符集统一使用utf8mb4 ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT‘XXXXXX-应用名称’;所有表和字段都尽量需要添加注释可以使用tinyint存储状态值。比enum减少cpu开销且容易维护。建议使用 UNSIGNED 存储非负数值相比不使用 unsigned可以扩大一倍使用数值范围。
使用decimal 需要额外的空间和计算开销所以应该尽量只是在对小数进行精确计算的时候才使用例如存储财务数据。如果数据量大也可以考虑使用bigint来存储这样能避免使用浮点存储不精确和decimal精确存储代价高的问题。涉及金额字段数额 * 100 用int存
时间类型时间类型统一用datetime如涉及时区则用timestamp
每个表中都必须包含2个字段 r_add_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间’, r_modified_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘修改时间’
除了必须为NULL建议字段都定义为NOT NULL因为null值会影响cordinate统计影响优化器对索引的选择而且需要额外的存储空间。不允许使用joinleft join请将复杂查询拆分为多个简单查询减少锁表的范围和时间这条短期内难以实现。对于对于20W以上的表建议不要联表查询。禁止在dml语句中使用join。where条件中不要使用函数或进行(隐式)强制转换拒绝大事务比如在一个事务里进行多个select多个update如果是高频事务会严重影响MySQL并发能力因为事务持有的锁等资源只在事务rollback/commit时才能释放数据库中不允许使用视图、函数、触发器、存储过程、外键不对大字符串、长文本全部加索引要么加部分索引如果字符串的前几个字符的选择度比较高可以新建部分索引 alter table table_name add key idx_code (field(10));一般情况下表结构变更尤其是表空间大于1G的表变更放到晚上业务低峰期进行DMS 上提交DML工单白天提交的每个工单影响行数不超过2000, 影响行数超过2000请分批提交, 建议非紧急情况下影响行数大于1w的数据订正放到晚上业务低峰期进行.特别是商品中心的数据库).上线业务sql均走索引