当前位置: 首页 > news >正文

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

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

文章目录

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

阿里规约

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

  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均走索引

相关文章:

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

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

EFCore 基础入门教程

一、EFCore 基础入门教程EF 框架的简介、发展历史;ORM框架概念学习地址:https://blog.csdn.net/u011127019/article/details/129212786?spm1001.2014.3001.5502EFCore 安装,引入、支持的数据库学习地址:https://www.cnblogs.com/…...

HTML5 Drag and Drop

这是2个组合事件 dom对象分源对象和目标对象 绑定的事件也是分别区分源对象和目标对象 事件绑定 事件顺序 被拖拽元素,事件触发顺序是 dragstart->drag->dragend; 对于目标元素,事件触发的顺序是 dragenter->dragover->drop/…...

惠普m1136打印机驱动程序安装教程

惠普m113打印机是一款功能强大的多功能打印机,它能够打印、复印、扫描和传真等。如果你要使用这款打印机,你需要下载并安装驱动程序,以确保它能够在你的计算机上正常工作。在本文中,我们将介绍如何下载和安装惠普m1136打印机驱动程…...

数据增强,扩充了数据集,增加了模型的泛化能力

数据增强(Data Augmentation)是在不实质性的增加数据的情况下,从原始数据加工出更多的表示,提高原数据的数量及质量,以接近于更多数据量产生的价值。 其原理是,通过对原始数据融入先验知识,加工…...

MySQL/Oracle获取当前时间几天/分钟前的时间

获取当前时间 要想获取当前时间几天/分钟前的时间,首先要知道怎么获取当前时间; 对于MySQL和Oracle获取当前时间的方法是不一样的; MySQL: select NOW(); 示例: Oracle: select sysdate from dual; 示…...

如何在Wordpress中使用wp_nav_menu()在<li>及a标记中添加Class

我正在使用wp_nav_menu($args),我想将my_own_classCSS类名添加到<li>元素中以获得以下结果:<li classmy_own_class><a href>Link</a>怎么做&#xff1f;wp_nav_menu()在<li>标记中添加Class方法一&#xff1a;只需使用其他参数并为nav_menu_css_…...

Chat Support Board WordPress聊天插件 v3.5.8

功能列表 支持和聊天功能 Slack聊天完全同步 - 直接从Slack发送和接收用户信息。 立即工作 - 只需插入短码&#xff0c;即可立即安装和使用。 丰富的信息 - Dialogflow机器人发送丰富的信息。 机器人--集成一个由API.AI驱动的多语言机器人。 电子邮件通知 - 当收到回复时&#…...

2022年网络安全竞赛——数字取证调查attack.pcapng

攻击日志分析:需求环境可私信博主获取 任务环境说明: 服务器场景:PYsystem0031服务器场景操作系统:未知服务器场景FTP用户名:anonymous 密码:空从靶机服务器的FTP上下载attack.pcapng数据包文件,通过分析数据包attack.pcapng,找出黑客的IP地址,并将黑客的IP地址作为FL…...

2023最新MongoDB规范

前言 MongoDB是非关系型数据库的典型代表&#xff0c;DB-Engines Ranking 数据显示&#xff0c;近年来&#xff0c;MongoDB在 NoSQL领域一直独占鳌头。MongoDB是为快速开发互联网应用 而设计的数据库系统&#xff0c;其数据模型和持 久化策略就是为了构建高读/写的性能&#x…...

gcc的使用,调试工具gdb的使用

gcc编译 gcc编译可以分为四个步骤&#xff0c;预处理、编译、汇编、链接。 预处理命令&#xff1a;gcc -E hello.c -o hello.i编译命令&#xff1a;gcc -S hello.i -o hello.s汇编命令&#xff1a; gcc -c hello.s -o hello.o链接命令&#xff1a;gcc hello.o -o hello gcc…...

Python变量的定义和使用

定义&#xff1a;变量就是计算机内存中存储某些数据的位置的名称 形象理解变量就是一个存放东西的容器&#xff0c;该容器的名字就叫做变量&#xff0c;容器存放的东西就是变量的值 变量的组成&#xff1a; 标识&#xff1a;标识对象所储存的内存地址&#xff0c;使用内置函数i…...

SSM框架-AOP概述、Spring事务

16 spring整合mybatis 16.1 前情代码 实体类 public class Account {private Integer id;private String name;private Double money;public Integer getId() {return id;}public void setId(Integer id) {this.id id;}public String getName() {return name;}public void …...

一文搞定Android Vsync原理简析

屏幕渲染原理"现代计算机之父"冯诺依曼提出了计算机的体系结构: 计算机由运算器&#xff0c;存储器&#xff0c;控制器&#xff0c;输入设备和输出设备构成&#xff0c;每部分各司其职&#xff0c;它们之间通过控制信号进行交互。计算机发展到现在&#xff0c;已经出…...

第八届蓝桥杯省赛 C++ B组 - K 倍区间

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;蓝桥杯题解集合 &#x1f4dd;原题地址&#xff1a;K 倍区间 &#x1f4e3;专栏定位&#xff1a;为想参加蓝桥杯的小伙伴整理常考算法题解&#xff0c;祝大家…...

UDP与TCP协议

目录 UDP协议 协议报头 UDP协议特点&#xff1a; 应用场景&#xff1a; TCP TCP协议报头 确认应答机制 理解可靠性 超时重传机制 连接管理机制 三次握手&#xff1a; 四次挥手&#xff1a; 滑动窗口 如何理解缓冲区和滑动窗口&#xff1f; 倘若出现丢包&#xf…...

rosbag相关使用工具

文章目录一、 rosbag 导出指定话题生成新rosbag二、 rosbag 导出视频1. 脚本工具源码2. 操作2.1 安装 ffmpeg2.2 导出视频3. 视频截取4. 压缩视频附录&#xff1a;rosbag2video.py 源码一、 rosbag 导出指定话题生成新rosbag rosbag filter 2023-02-25-19-16-01.bag depth.bag…...

数据结构与算法—栈stack

目录 栈 栈的复杂度 空间复杂度O(1) 时间复杂度O(1) 栈的应用 1、栈在函数调用中的应用&#xff1b; 2、栈在求表达式的值的应用&#xff1a; 栈的实现 栈 后进先出&#xff0c;先进后出&#xff0c;只允许在一端插入和删除 从功能上&#xff0c;数组和链表可以代替栈…...

【学习笔记】[ARC150F] Constant Sum Subsequence

第一眼看上去&#xff0c;这道题一点都不套路 第二眼看上去&#xff0c;大概是要考dpdpdp优化&#xff0c;那没事了&#xff0c;除非前面333道题都做完了否则直接做这道题肯定很亏 首先我们要定义一个好的状态。废话 设fsf_{s}fs​表示BBB序列的和为sss时&#xff0c;能达到…...

Node.js实现大文件断点续传—浅析

Node.js简介&#xff1a; 当谈论Node.js时&#xff0c;通常指的是一个基于Chrome V8 JavaScript引擎构建的开源、跨平台的JavaScript运行时环境。以下是一些Node.js的内容&#xff1a; 事件驱动编程&#xff1a;Node.js采用了事件驱动的编程范式&#xff0c;这意味着它可以异步…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...