那些开发过程中需要遵守的开发规范

news2024/9/25 23:12:39

入职公司三天,没干啥其他活,基本在配置本地环境和阅读相关文档。技术方面公司基本用的是主流的技术体系,入职后需要先阅读阿里的开发规范和其他的一些产研文档。今天整理一些平时需要关注的阿里规约和数据库开发规范,方便今后在开发过程中查阅。

文章目录

  • 阿里规约
  • 数据库开发规范

阿里规约

下文提到的规约除标注【推荐】类型的都属于阿里【强制】类型的规约,开发过程中需要严格遵守。

  1. 相关命名严禁使用“拼音”或者“拼音+英文”的方式,国际通用的中文名称可视同英文;

  2. 类名使用驼峰风格,除了DO、DTO、BO等;

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

  4. POJO类型的布尔类型变量不使用is作为开头 ,如isDeleted,部分框架解析会出现序列化错误;

  5. 不允许在子父类的成员变量之间,不同代码块的局部变量之间采用完全相同的命名;

  6. 杜绝完全不规范的缩写,避免望文不知义;

  7. 对于 Service 和 DAO 类,基于 SOA 的理念,暴露出来的服务一定是接口,内部的实现类用Impl的后缀与接口区别。

  8. 不允许任何魔法值(即未经预先定义的常量)直接出现在代码中(防止其他开发人员错写变量)

  9. 推荐的规约:常量复用的五个层次:跨应用共享常量、应用内共享常量、子工程内共享常量、包 内共享常量、类内共享常量。

  1. 跨应用共享常量:放置在二方库中,通常是 client.jar 中的 constant 目录下。
  2. 应用内共享常量:放置在一方库中,通常是子模块中的 constant 目录下。 反例:易懂变量也要统一定义成应用内共享常量,两位工程师在两个类中分别定义了“YES”的变量:
    类 A 中:public static final String YES = “yes”;
    类 B 中:public static final String YES = “y”; A.YES.equals(B.YES),预期是 true,但实际返回为 false,导致线上问题。
  3. 子工程内部共享常量:即在当前子工程的 constant 目录下。 4) 包内共享常量:即在当前包下单独的 constant 目录下。
  4. 类内共享常量:直接在类内部 private static final 定义。
  1. 如果是大括号内为空,则简洁地写成{}即可,右大括号后还有else等代码则不换行

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

  3. 采用 4 个空格缩进,禁止使用 Tab 字符,如果使用 Tab 缩进,必须设置 1 个 Tab 为 4 个空格。IDEA 设置 Tab 为 4 个空格时,请勿勾选 Use tab character

  4. 注释的双斜线与注释内容之间有且仅有一个空格。

  5. 在进行类型强制转换时,右括号与强制转换值之间不需要任何空格隔开

  6. 单行字符数限制不超过 120 个,超出需要换行,第二行相对第一行缩进 4 个空格,从第三行开始,不再继续缩进

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

  8. 【推荐】单个方法的总行数不超过 80 行。

  9. 所有的覆写方法,必须加@Override注解。

  10. 外部正在调用或者二方库依赖的接口,不允许修改方法签名,避免对接口调用方产生影响。

  11. 强制不能使用过时的类或方法

  12. 所有整型包装类对象之间值的比较,全部使用equals方法比较。

  13. 任何货币金额,均以最小货币单位且整型类型来进行存储。(最小货币单位,例如分,整型类型,例如Long)

  14. 浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用 equals 来判断。BigDecimal 的等值比较应使用 compareTo()方法,而不是 equals()方法

  15. 使用BigDecimal的valueOf()方法替代构造方法BigDecimal(double),将Double值转化为BigDecimal对象,因为构造方法会存在精度损失风险。

  16. 定义DO/DTO/VO等POJO类时,不要设定任何属性默认值,如createTime字段,不能设定默认值为new Date()。

  17. 构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中

  18. POJO类必须写toString()方法,如果继承了另一个POJO类,需要在前面添加super.toString

  19. 禁止在POJO类中,同时存在对应属性xxx的isXxx()和getXxx()方法

  20. 【推荐】类内方法定义的顺序依次是:公有方法或保护方法 > 私有方法 > getter / setter 方法

  21. 【推荐】类成员与方法访问控制从严:工具类不允许有public或default构造方法
    在这里插入图片描述

  22. 不允许在程序任何地方中使用:1)java.sql.Date。 2)java.sql.Time。 3)java.sql.Timestamp。

  23. 关于hashCode和equals的处理:

  • 只要覆写 equals,就必须覆写 hashCode。(如果不覆写hashCode方法,就会违反规定:通过equals方法判定为相等的对象,必须有相同的hashCode)
  • 因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行判断,所以 Set 存储的对象必须覆写 这两种方法。
  • 如果自定义对象作为 Map 的键,那么必须覆写 hashCode 和 equals
  1. 判断所有集合内部的元素是否为空,使用isEmpty()方法,而不是size()==0的方式
  2. 在使用java.util.stream.Collectors类的toMap()方法转为Map集合时,一定要注意当 value 为 null 时会抛 NPE 异常。
  3. 使用Map的方法keySet()/values()/entrySet()返回集合对象时,不可以对其进行添加元素操作,否则会抛出 UnsupportedOperationException 异常
  4. 使用集合转数组的方法,必须使用集合的 toArray(T[] array),传入的是类型完全一致、长度为 0 的空数组
  5. 在无泛型限制定义的集合赋值给泛型限制的集合时,在使用集合元素时,需要进行 instanceof 判断,避免抛出 ClassCastException 异常。
  6. 【推荐】集合初始化时,指定集合初始值大小。如果能确定集合需要存储的元素数量,则在创建集合的时候,需要指定集合大小,避免集合在容量满后,被动扩容。

反例:HashMap需要放置1024个元素,由于没有设置容量初始大小,随着元素增加而被迫不断扩容,resize()方法总共会调用 8 次,反复重建哈希表和数据迁移。当放置的集合元素个数达千万级时会影响程序 性能。

  1. 使用 entrySet 遍历 Map 类集合 KV,而不是 keySet 方式进行遍历。说明:keySet 其实是遍历了 2 次,一次是转为 Iterator 对象,另一次是从 hashMap 中取出 key 所对应的 value。而 entrySet只是遍历了一次就把 key 和 value 都放到了 entry 中,效率更高。如果是 JDK8,使用 Map.forEach 方法。
  2. 创建线程或线程池时请指定有意义的线程名称,方便出错时回溯。
  3. SimpleDateFormat 是线程不安全的类,一般不要定义为 static 变量,如果定义为 static,必须加锁,或者使用 DateUtils 工具类。
  4. 必须回收自定义的 ThreadLocal 变量,尤其在线程池场景下,线程经常会被复用, 如果不清理自定义的ThreadLocal 变量,可能会影响后续业务逻辑和造成内存泄露等问题。 尽量在代理中使用 try-finally 块进行回收。

数据库开发规范

  1. 表命名规范:
  • 实体表使用尽量准确的英文单数表示,若一个英文单词不足以表示表的意义,可用下横杠分割,小写命名。备份以bak_开头,分表以pt_开头,归档表以arch_xxxx_开头,临时表以tmp_开头,日志表以log_开头
  1. 索引:非唯一索引命名为 idx_列名1_列名2,唯一索引命名为 uk_列名1_列名2,如果列名太长或列太多,可酌情精简
  2. 字符集统一使用utf8mb4 , ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=‘XXXXXX-应用名称’;
  3. 所有表和字段都尽量需要添加注释
  4. 可以使用tinyint存储状态值。比enum减少cpu开销,且容易维护。建议使用 UNSIGNED 存储非负数值,相比不使用 unsigned,可以扩大一倍使用数值范围。
  • 使用decimal 需要额外的空间和计算开销,所以应该尽量只是在对小数进行精确计算的时候才使用,例如存储财务数据。如果数据量大,也可以考虑使用bigint来存储,这样能避免使用浮点存储不精确和decimal精确存储代价高的问题。
  • 涉及金额字段,数额 * 100 ,用int存
  1. 时间类型:时间类型统一用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 ‘修改时间’

  1. 除了必须为NULL,建议字段都定义为NOT NULL因为null值会影响cordinate统计,影响优化器对索引的选择,而且需要额外的存储空间。
  2. 不允许使用join,left join,请将复杂查询拆分为多个简单查询,减少锁表的范围和时间,这条短期内难以实现。对于对于20W以上的表建议不要联表查询。禁止在dml语句中使用join。
  3. where条件中不要使用函数或进行(隐式)强制转换
  4. 拒绝大事务:比如在一个事务里进行多个select,多个update,如果是高频事务,会严重影响MySQL并发能力,因为事务持有的锁等资源只在事务rollback/commit时才能释放
  5. 数据库中不允许使用视图、函数、触发器、存储过程、外键
  6. 不对大字符串、长文本全部加索引,要么加部分索引,如果字符串的前几个字符的选择度比较高,可以新建部分索引
    alter table table_name add key idx_code (field(10));
  7. 一般情况下,表结构变更尤其是表空间大于1G的表变更放到晚上业务低峰期进行
  8. DMS 上提交DML工单,白天提交的每个工单影响行数不超过2000, 影响行数超过2000请分批提交, 建议非紧急情况下影响行数大于1w的数据订正放到晚上业务低峰期进行.(特别是商品中心的数据库).
  9. 上线业务sql均走索引

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/371979.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TatukGIS Developer Kernel for .NET

TatukGIS Developer Kernel for .NET 用于.NET的TatukGIS开发人员内核的强大功能: 打开、创建、编辑、保存和导出矢量、图片和网格的过程,包括类似于数据库的格式。 扩展属性、北箭头、比例和其他视觉控制也从TatukGIS编辑器/查看器商品中显示给用户开发…

Java基础系列(五): final关键字用法

一. 概述 final关键字代表最终,不可改变的. 常见有5种用法,我们来归纳总结一下: 1. 用来修饰一个类 2. 用来修饰一个方法 3. 用来修饰成员变量 4. 用来修饰局部变量 5. 用来修饰方法参数 二. final饰修类 如果声明一个类为final类, 那么这个类就是最终类,不能被继承 …

7 Python文件、文件夹、word及excel操作

0 建议学时和要求 4学时 掌握os和os.path模块对文件和文件夹操作的函数 掌握shutil模块对文件和文件夹操作的函数 掌握扩展库openpyxl对Excel文件的操作 1 文件的高级操作 1.1 文件的概念及分类 文本文件 文本文件可以使用记事本、gedit、ultraedit等字处理软件直接进行显…

ESP32设备驱动-DS1264数字温度传感器驱动

DS1264数字温度传感器驱动 1、DS1264介绍 DS1624 由两个独立的功能单元组成:一个 256 字节非易失性 E2 存储器和一个直接数字温度传感器。 非易失性存储器由 256 字节的 E2 存储器组成。 该存储器可用于存储用户希望的任何类型的信息。 这些内存位置通过 2 线串行总线访问。…

007永磁电机控制方式:别张嘴就FOC,其他常规控制方式也是伺服人的基本功

在读本篇文,我想做个小调查。到目前为止,你掌握的或者是你了解到的控制永磁同步电机的方式都有哪些?我想,你大概张口就说FOC控制吧。没错,FOC控制是我们日常生活中所见到的最普遍的永磁同步电机的控制方式。当然在本专…

微信电脑版字体模糊(或文字太小)怎么调整

文章目录第一步:设置屏幕缩放125%第二步:文本大小设置为125%第三步:微信设置--通用--勾选“适配系统缩放比例”第四步:微信高DPI缩放行为设置(关键)ClearType勾选(可选)笔者遇到这个…

【模板】线段树 2

题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xxx 将某区间每一个数加上 xxx 求出某区间每一个数的和 输入格式 第一行包含三个整数 n,m,pn,m,pn,m,p,分别表示该数列数字的个数、操作的总个数…

计算机网络笔记(复试准备)第一章

计算机网络笔记(复试准备) 第一章 网络,互联网与因特网 网络由若干个结点和连接这些结点的链路组成 多个网络通过路由器连接起来这也就形成了一个更大的网络即是我们熟知的互联网也就是“网络的网络” 因特网是世界上最大的网络 问&#xf…

Open-Vocabulary Object Detection Using Captions论文讲解

文章目录一、论文前言二、提出原因三、论文的核心四、论文讲解4.1 论文流程4.2 OVD与之前相关的setting4.3 结果对比一、论文前言 目标检测是人工智能最突出的应用之一,也是深度学习最成功的任务之一。 然而,尽管深度对象检测取得了巨大进步&#xff0…

MongoDB在银行海量历史订单交易数据查询中的应用(Spring boot + Bee)

MongoDB在银行海量历史订单交易数据查询中的应用(Spring boot Bee) 近年来,随着各种便捷支付方式的普及,银行账户交易数据呈现爆炸式增长,同时数据模型也在不断变化,传统关系型数据库已难以满足这种海量的、模式灵活、高可用、高性能的数据存储和查询需求。通过对银行历史交易…

【编程入门】应用市场(php版)

背景 前面已输出多个系列: 《十余种编程语言做个计算器》 《十余种编程语言写2048小游戏》 《17种编程语言10种排序算法》 《十余种编程语言写博客系统》 《十余种编程语言写云笔记》 《N种编程语言做个记事本》 目标 为编程初学者打造入门学习项目,使…

【MySQL】索引常见面试题

文章目录索引常见面试题什么是索引索引的分类什么时候需要 / 不需要创建索引?有什么优化索引的方法?从数据页的角度看B 树InnoDB是如何存储数据的?B 树是如何进行查询的?为什么MySQL采用B 树作为索引?怎样的索引的数…

033_SS_Inversion-Based Creativity Transfer with Diffusion Models

下载地址:Arxiv 2022.11.23 Code地址:https://github.com/zyxElsa/creativity-transfer 1. Introduction Motivations 以前的任意示例引导的艺术图像生成方法(比如风格迁移)通常无法控制形状变化或传达语义元素。而预训练的text…

【Linux | ELK 8.2】搭建ELKB集群Ⅰ—— 实验环境说明和搭建Elasticsearch集群

目录1. 实验环境1.1 实验工具1.2 操作系统1.3 架构版本、IP地址规划与虚拟机配置要求1.4 拓扑图1.5 其他要求2. 实验步骤2.1 安装Elasticsearch(单节点)(1)检查系统jdk版本(2)下载elasticsearch&#xff08…

格式化串漏洞

格式化字符串漏洞本身并不算缓冲区溢出漏洞,这里作为比较典型的一类漏洞进行简单介绍。为了能够将字符串、变量、地址等数据按照指定格式输出,通常使用包含格式化控制符的常量字符串作为格式化串,然后指定用相应变量来代替格式化串中的格式化…

进程管理之基本概念

目录 关于进程的基本概念 进程描述符 查看进程 进程标识 进程的生命周期 僵尸进程、孤儿进程 写时拷贝技术 fork()函数 vfork()函数 终止进程 进程优先级和权重 进程地址空间 关于进程的基本概念 进程和程序是操作系统领域的两个重要的概念,进程是执行…

LeetCode 145. 二叉树的中序遍历

LeetCode 145. 二叉树的中序遍历 难度:easy\color{Green}{easy}easy 题目描述 给你一棵二叉树的根节点 rootrootroot ,返回其节点值的 后序遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[3,2,1]示例 2&#xff1a…

mitmproxy使用总结

mitmproxy is a free and open source interactive HTTPS proxy. 这官网上的一句话说明mitmproxy的身份,MITM 即中间人攻击(Man-in-the-middle attack),与charles、fidder之类的抓包工具不同的是可以增加一些自定义处理的扩展脚本…

aws appmesh 在ec2上部署和使用appmesh

参考资料 Getting started with AWS App Mesh and Amazon EC2 之前的文章中我们已经介绍了aws的服务网格场频appmesh,并且在eks环境中进行了部署和简单功能的测试。由于eks环境较为复杂,本文在ec2环境下手动配置appmesh网格环境 需求: 两个…

【Spring 基础】

【Spring 基础】 一、 Spring 介绍 1. 简述 Spring 技术是 JavaEE 开发必备技能,企业开发技术选型专业角度 简化开发,降低企业级开发的复杂性 IoCAOP 事务处理 框架整合,高效整合其他技术,提高企业级应用开发与运行效率 MyBat…