那些开发中需要遵守的产研开发规范
入职新公司第三天,没干啥其他活,基本在阅读产研开发规范。公司在技术方面沿用的是阿里的一套技术,所以入职之前需要先阅读《阿里巴巴开发规范》。今天整理一些平时需要关注的阿里规约和数据库开发规范,方便今后在开发过程中查阅。
文章目录
- 阿里规约
- 数据库开发规范
阿里规约
下文提到的规约除标注【推荐】类型的都属于阿里【强制】类型的规约,开发过程中需要严格遵守。
-
相关命名严禁使用“拼音”或者“拼音+英文”的方式,国际通用的中文名称可视同英文;
-
类名使用驼峰风格,除了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 , ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 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统计,影响优化器对索引的选择,而且需要额外的存储空间。
- 不允许使用join,left 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均走索引
相关文章:

那些开发中需要遵守的产研开发规范
入职新公司第三天,没干啥其他活,基本在阅读产研开发规范。公司在技术方面沿用的是阿里的一套技术,所以入职之前需要先阅读《阿里巴巴开发规范》。今天整理一些平时需要关注的阿里规约和数据库开发规范,方便今后在开发过程中查阅。…...

一文深入分析-内核并发消杀器(KCSAN)
一、KCSAN介绍 KCSAN(Kernel Concurrency Sanitizer)是一种动态竞态检测器,它依赖于编译时插装,并使用基于观察点的采样方法来检测竞态,其主要目的是检测数据竞争。 KCSAN是一种检测LKMM(Linux内核内存一致性模型)定义的数据竞争(data race…...

Java学习-IO流-字符缓冲流
Java学习-IO流-字符缓冲流 字符缓冲流↙ ↘ BufferedReader BufferedWtrier 字符缓冲输入流 字符缓冲输出流底层自带长度为8192的缓冲区提高性能 public BufferedReader(Reader r):把基本流包装成高级流 public BufferedWtrier(Wtrier w):把…...

Java的一维数组遍历、求最值、冒泡排序
一.数组遍历: Example: import java.util.ArrayList; public class App { public static void main(String[] args) { int[]arr{1,2,3,4,5}; for(int i0;i<arr.length;i){ System.out.println(arr[i]); } } 运行结果:12345 定义了一…...

Free for photo container detection, container damage detect PaaS
集装箱箱号识别API免费,飞瞳引擎集装箱人工智能平台,可通过API二次开发或小程序拍照使用,可二次开发应用码头港区海关仓库口岸铁路场站船公司堆场,实现云端集装箱信息识别/集装箱箱况残损检测/好坏箱检验,高检测率/高实…...

【golang】【源代码】reflect.DeepEqual(x,y)函数
reflect.DeepEqual(x, y)函数 功能是比较x和y是否一致,x和y不仅限于基础类型,也可以是像array、 slice、 map、 ptr、struct、interface类型,在代码中经常能见到。 一起看下是怎么实现的吧~ func DeepEqual(x, y interface{}) bool {if x …...

Python实现定时执行脚本(4)
前言 本文是该专栏的第16篇,后面会持续分享python的各种干货知识,值得关注。 在项目开发中,难免会需要用到定时任务。比如说,在某个时间段,甚至是达到某时某分某秒自动运行你部署好的功能脚本。而在本专栏的前面,笔者有详细介绍过3种使用python执行定时脚本的方法。 1.…...

量子力学(4) 全同粒子
如果势能与时间无关,那么Ψψe−iEt/ℏ\Psi\psi e^{-iEt/\hbar}Ψψe−iEt/ℏ,EEE是系统的总能量。 全同粒子分为玻色子和费米子。所有电子是全同的费米子。所有质子是全同的费米子。全同就是说不可能区分出其中的一个,比如说你摇了五个骰子…...

13、Swin Transformer: Hierarchical Vision Transformer using Shifted Windows
简介 主页:https://github. com/microsoft/Swin-Transformer. Swin Transformer 是 2021 ICCV最佳论文,屠榜了各大CV任务,性能优于DeiT、ViT和EfficientNet等主干网络,已经替代经典的CNN架构,成为了计算机视觉领域通用…...

C++基础入门丨8. 结构体——还需要知道这些
Author:AXYZdong 硕士在读 工科男 有一点思考,有一点想法,有一点理性! 定个小小目标,努力成为习惯!在最美的年华遇见更好的自己! CSDNAXYZdong,CSDN首发,AXYZdong原创 唯…...

算法第十六期——动态规划(DP)之线性DP
【概述】 线性动态规划,是较常见的一类动态规划问题,其是在线性结构上进行状态转移,这类问题不像背包问题、区间DP等有固定的模板。 线性动态规划的目标函数为特定变量的线性函数,约束是这些变量的线性不等式或等式,目…...

智慧新零售网络解决方案,助力新零售企业数智化转型
随着数字化时代的不断发展,新零售连锁业务模式“线上线下”融合发展,数据、设备在逐渐增加,门店数量也会随着企业规模的扩大而增加,但由于传统网络架构不稳定、延时、容量小影响服务质量(QoS)、分支设备数量…...

Go语言规范中的可赋值
了解可赋值规范的重要性当使用type关键字定义类型的时候,会遇到一些问题,如下:func main(){var i int 2pushInt(i) } type MyInt int //基于int定义MyInt func pushInt(i MyInt){}结果:调用函数pushInt报错 cannot use i (variab…...

外盘国际期货招商:原油市场热点话题
原油市场热点话题 问:目前美国原油库存如何? 答:EIA原油库存数据显示,由于美国炼油厂季节性检修,开工率继续下降,原油库存连续九周增长至2021年5月份以来最高水平,同期美国汽油库存减少而精炼…...

[蓝桥杯 2018 省 A] 付账问题 贪心题
几个人一起出去吃饭是常有的事。但在结帐的时候,常常会出现一些争执。现在有 n 个人出去吃饭,他们总共消费了 S 元。其中第 i 个人带了 ai 元。幸运的是,所有人带的钱的总数是足够付账的,但现在问题来了:每个人分别要出…...

微机原理复习(周五),计算机组成原理图
1.计算机由运算器,控制器,存储器,输入设备,输出设备等5大基本部件组成。 2.冯诺依曼提出存储设计思想是:数字计算机的数制采用二进制,存储程序,程序控制。 3.计算机的基本组成框图:…...

用了10年Postman,意想不到它的Mock功能也如此强大
最近在做一些app,前后端分离的开发模式是必须的。一直用的python flask做后端的快速POC,python本身就是一门胶水语言,开发起来方便快捷,而flask又是一个极简的webserver框架(比Django简洁)。但在这里推荐的…...

项目重构,从零开始搭建一套新的后台管理系统
背景 应公司发展需求,我决定重构公司的后台管理系统,从提出需求建议到现在的实施,期间花了将近半个月的时间,决定把这些都记录下来。 之前的后台管理系统实在是为了实现功能而实现的,没有考虑到后期的扩展性…...

day20_Map
今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、比较器排序 三、Collections 四、Map 五、HashMap 六、TreeMap 零、 复习昨日 HashSet 不允许重复元素,无序 HashSet去重原理: 先比较hashco…...

localStorage和sessionStorage
目录 一、localStorage和SessionStorage在哪里,是什么 二、localStorage和sessionStorage区别 三、localStorage常用方法 四、sessionStorage常用方法 一、localStorage和SessionStorage在哪里,是什么 【1】在浏览器开发者工具的Application栏目里&…...

IP地址,子网掩码,网段 概念详解
文章目录1. 子网掩码1.1 子网掩码的概念及作用1.2 子网掩码的组成1.3 子网掩码的表示方法1.4 为什么要使用子网掩码?1.5 子网掩码的分类2. 子网掩码和IP地址的关系2.1 根据掩码确定网段IP地址是以 网络号和 主机号来标示网络上的主机的,我们把网络号相同…...

数影周报:动视暴雪疑似数据泄露,数据出境安全评估申报最新进展
本周看点:动视暴雪疑似员工敏感信息及游戏数据泄露;谷歌云计算部门:两名员工合用一个工位;数据出境安全评估申报最新进展;TikTok Shop东南亚商城在泰国和菲律宾公布;智己汽车获九大金融机构50亿元贷款签约.…...

Web安全最详细学习路线指南,从入门到入职(含书籍、工具包)
在这个圈子技术门类中,工作岗位主要有以下三个方向: 安全研发 安全研究:二进制方向 安全研究:网络渗透方向 下面逐一说明一下. 第一个方向:安全研发 你可以把网络安全理解成电商行业、教育行业等其他行业一样&#x…...

ChatGPT?听说Biying把它下架了
ChatGPT被玩疯了,开始放飞自我 ChatGPT版微软必应上线不到10天…就被网友玩坏了 先说这个词,放飞自我,什么东西才会放飞自我? 人放飞自我,人?你确定是人? 所以让我们来把上面的句子改写一下。…...

中电金信:金融数字化转型路在何方?这里有答案
近期,媒体大数网整合了业内10份研究报告,详解金融数字化转型的思路、方法与路径。其中「中国电子金融级数字底座“源启”白皮书」也被收录其中。让我们一同阅读文章,探究金融数字化转型相关问题的答案吧。 当前,金融科技正在回归…...

【Leedcode】数据结构中链表必备的面试题(第五期)
【Leedcode】数据结构中链表必备的面试题(第五期) 文章目录【Leedcode】数据结构中链表必备的面试题(第五期)1.题目2.思路图解(1)第一步:复制每一个结点,插入到原结点和下一个结点之…...

ECDH secp256k1 集成
在Android 原生api是不支持secp256k1算法的,所以要先集成以下库:implementation com.madgag.spongycastle:core:1.58.0.0compile com.madgag.spongycastle:prov:1.54.0.0compile com.madgag.spongycastle:pkix:1.54.0.0compile com.madgag.spongycastle:…...

工单模型的理解与应用
工单(任务单)模型的定义 工单模型是一种分派任务的方法,可以用来跟踪、评估和报告任务的完成情况。它通常用于针对特定目标的重复性任务或项目,以确保任务能够按时完成并符合期望的标准。 工单模型的基本流程为:提…...

Python年利率计算器【N日年化收益率】
现在有闲钱的人,按照聪明等级从低到高排序应该是钱买股票,一年利率约为-20%钱放银行活期,年利率约为0.3%钱放银行定期,一年利率约为1.5%钱放余额宝(支付宝)或零钱通(微信)࿰…...

3年测试拿8K,被校招来的实习生反超薪资,其实你在假装努力
最近朋友给我分享了一个他公司发生的事 大概的内容呢:公司一位工作3年的测试工资还没有新人高,对此怨气不小,她来公司辛辛苦苦三年,三年内迟到次数都不超过5次,每天都是按时上下班,工作也按量完成…...