Merge branch 'master' of 47.107.61.133:chinaweal/public
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 491 B |
|
After Width: | Height: | Size: 505 B |
|
After Width: | Height: | Size: 472 B |
|
After Width: | Height: | Size: 447 B |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
|
@ -2,51 +2,107 @@
|
|||
|
||||
> 拟稿:[黎润豪](/lirh)<a href="https://blog.lroyia.top" target="_blank">(个人博客)</a>
|
||||
>
|
||||
> <div><font>版本号 1.0.0 </font></div>
|
||||
> <div><span>版本号 1.0.0 </span></div>
|
||||
>
|
||||
|
||||
## 目录
|
||||
|
||||
- [Java后端开发规范](#java%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83)
|
||||
- [编程约束](#%E7%BC%96%E7%A8%8B%E7%BA%A6%E6%9D%9F)
|
||||
- [命名](#%E5%91%BD%E5%90%8D)
|
||||
- [类命名](#%E7%B1%BB%E5%91%BD%E5%90%8D)
|
||||
- [方法命名](#%E6%96%B9%E6%B3%95%E5%91%BD%E5%90%8D)
|
||||
- [变量命名](#%E5%8F%98%E9%87%8F%E5%91%BD%E5%90%8D)
|
||||
- [异常处理](#%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86)
|
||||
- [日志规约](#%E6%97%A5%E5%BF%97%E8%A7%84%E7%BA%A6)
|
||||
- [代码结构](#%E4%BB%A3%E7%A0%81%E7%BB%93%E6%9E%84)
|
||||
- [工程结构](#%E5%B7%A5%E7%A8%8B%E7%BB%93%E6%9E%84)
|
||||
|
||||
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
||||
## 前言
|
||||
|
||||
本文为公司Java后端开发的代码规范,规范分如下两级:
|
||||
|
||||
- <font color="red">【强制】</font>:开发者必须遵循的开发规范要求
|
||||
- <font color="green">【推荐】</font>:开发者选择性遵循的开发规范要求
|
||||
-  :开发者必须遵循的开发规范要求
|
||||
-  :开发者选择性遵循的开发规范要求
|
||||
|
||||
## 编程约束
|
||||
|
||||
### 命名
|
||||
|
||||
- <font color="red">【强制】</font>杜绝完全不规范的缩写,避免望文不知义。
|
||||
-  杜绝完全不规范的缩写,避免望文不知义。
|
||||
|
||||
> <font color="red">【反例】</font>:AbstractClass缩写成AbsClass;condition缩写成condi;Function缩写成Fu。
|
||||
>  :AbstractClass缩写成AbsClass;condition缩写成condi;Function缩写成Fu。
|
||||
|
||||
- <font color="red">【强制】</font>严禁使用非全世界都知道的拼音命名。
|
||||
-  严禁使用非全世界都知道的拼音命名。
|
||||
|
||||
> <font color="green">正例</font>:alibaba/youku/hangzhou
|
||||
> <font color="red">反例</font>:suanFen【算分】,getGTHTypeCode【获取个体户类型编码】
|
||||
>  :alibaba/youku/hangzhou
|
||||
>  :suanFen【算分】,getGTHTypeCode【获取个体户类型编码】
|
||||
|
||||
#### 类命名
|
||||
|
||||
- <font color="red">【强制】</font>采用大驼峰(UpperCamelCase)命名法,禁止使用数字命名。
|
||||
-  采用大驼峰(UpperCamelCase)命名法,禁止使用数字命名。
|
||||
|
||||
> <font color="green">【正例】</font>:KeyPair,GlobalConfig
|
||||
> <font color="red">【反例】</font>:areaSlice,AreaSlice1,AreaSlice2
|
||||
>  :KeyPair,GlobalConfig
|
||||
>  :areaSlice,AreaSlice1,AreaSlice2
|
||||
|
||||
- <font color="green">【推荐】</font>采用【名词】,【形容词+名词】的格式进行命名
|
||||
-  采用【名词】,【形容词+名词】的格式进行命名
|
||||
|
||||
> <font color="green">【正例】</font>:SMSSender,GlobalConfig
|
||||
> <font color="red">【反例】</font>:SendSMS
|
||||
>  :SMSSender,GlobalConfig
|
||||
>  :SendSMS
|
||||
|
||||
- <font color="red">【强制】</font>抽象类必须以Abstract或Base开头(工具类例外:如StringUtils);异常类名明必须以Exception结尾;测试类必须以Test结尾。
|
||||
-  抽象类必须以Abstract或Base开头(工具类例外:如StringUtils);异常类名明必须以Exception结尾;测试类必须以Test结尾。
|
||||
|
||||
- <font color="red">【强制】</font>接口的参数类必须要以VO或Dto结尾命名;接口与接口之间的传输参数传输类必须以Dto结尾命名。
|
||||
-  接口的参数类必须要以VO或Dto结尾命名;接口与接口之间的传输参数传输类必须以Dto结尾命名。
|
||||
|
||||
#### 方法命名
|
||||
|
||||
- <font color="red">【强制】</font>采用小驼峰(LowerCamelCase)命名法,进制使用拼音命名
|
||||
-  采用小驼峰(LowerCamelCase)命名法,禁止使用拼音命名
|
||||
|
||||
- <font color="green">【推荐】</font>方法参数不多于5个,多于5个后改用DTO进行传输。
|
||||
-  方法参数不多于5个,多于5个后改用DTO进行传输。
|
||||
|
||||
#### 变量命名
|
||||
|
||||
-  常量与枚举均使用大写+下划线组合的方式命名
|
||||
|
||||
>  LIMIT_SIZE,ENTITY_TYPE
|
||||
|
||||
-  采用小驼峰(LowerCamelCase)命名法,禁止使用拼音命名
|
||||
|
||||
-  局部非循环与下标变量,不可使用单字母命名(特殊数学含义例外,如斜截式的斜率a,常数b)
|
||||
|
||||
## 异常处理
|
||||
|
||||
-  方法若有显式的RuntimeException异常抛出,必须使用`throws`关键字将其标识到方法上
|
||||
|
||||
-  异常的打印均用日志对象的error等级输出
|
||||
|
||||
-  IDEA发现的空指针问题必须要处理掉
|
||||
|
||||
-  捕获异常和跑异常必须完全匹配,或者捕获异常是抛异常的父类
|
||||
|
||||
-  若异常被捕获,如果数据需要回滚,一定要注意进行手动回滚
|
||||
|
||||
## 日志规约
|
||||
|
||||
-  日志对象在项目引用了lombok的情况下,请用@SLF4J注解声明
|
||||
|
||||
-  所有日志文件至少保存15天
|
||||
|
||||
-  日志信息拼接使用`{}`占位符,以提高可读性和拼接性能
|
||||
|
||||
-  生产环境进制直接使用`System.out`,`System.err`或`e.printStackTrace()`充当日志输出
|
||||
|
||||
-  避免重复打印日志,浪费磁盘空间,务必在日志配置文件中的子logger配置additivity=false
|
||||
|
||||
```xml
|
||||
<logger name="com.chinaweal.dao" level="debug" additivity="false"/>
|
||||
```
|
||||
|
||||
## 代码结构
|
||||
|
||||
-  `{}`代码块嵌套不应超过4层
|
||||
|
||||
## 工程结构
|
||||
|
||||
-  目录结构com.chinaweal.{项目简称}.{通用配置名/数据源缩写}.{业务板块名}.{controller/service/entity/mapper}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,101 @@
|
|||
# 推荐学习材料
|
||||
|
||||
> <div><span>拟稿:研发中心</span></div>
|
||||
> <div><span>版本号:1.0.0 </span></div>
|
||||
> <div><span>发布时间:2021.12.22 </span></div>
|
||||
|
||||
## 目录
|
||||
|
||||
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
|
||||
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
||||
|
||||
- [编码规范](#%E7%BC%96%E7%A0%81%E8%A7%84%E8%8C%83)
|
||||
- [1.代码整洁之道](#1%E4%BB%A3%E7%A0%81%E6%95%B4%E6%B4%81%E4%B9%8B%E9%81%93)
|
||||
- [软件工程管理](#%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E7%AE%A1%E7%90%86)
|
||||
- [1.人月神话](#1%E4%BA%BA%E6%9C%88%E7%A5%9E%E8%AF%9D)
|
||||
- [虚拟机](#%E8%99%9A%E6%8B%9F%E6%9C%BA)
|
||||
- [1.深入理解Java虚拟机](#1%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3java%E8%99%9A%E6%8B%9F%E6%9C%BA)
|
||||
- [图形处理](#%E5%9B%BE%E5%BD%A2%E5%A4%84%E7%90%86)
|
||||
- [1.街机游戏字体-像素字体的设计与应用](#1%E8%A1%97%E6%9C%BA%E6%B8%B8%E6%88%8F%E5%AD%97%E4%BD%93-%E5%83%8F%E7%B4%A0%E5%AD%97%E4%BD%93%E7%9A%84%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%BA%94%E7%94%A8)
|
||||
- [编程语言](#%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80)
|
||||
- [1.Go语言设计与实现](#1go%E8%AF%AD%E8%A8%80%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0)
|
||||
|
||||
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
||||
|
||||
## 编码规范
|
||||
|
||||
### 1.代码整洁之道
|
||||
|
||||
**原作名:** Clean Code: A Handbook of Agile Software Craftsmanship
|
||||
|
||||
**作 者:** (美国)马丁(Robert C. Martin)
|
||||
|
||||
**译 者:** 韩磊
|
||||
|
||||
**推荐理由:**
|
||||
|
||||
从《代码整洁之道》中可以学到:好代码和糟糕的代码之间的区别:如何编写好代码,如何将糟糕的代码转化为好代码:如何创建好名称、好函数、好对象和好类;如何格式化代码以实现其可读性的最大化:如何在不妨碍代码逻辑的前提下充分实现错误处理;如何进行单元测试和测试驱动开发。
|
||||
细节之中自有天地,整洁成就卓越代码。
|
||||
|
||||
**推荐程度:** ★★★★★
|
||||
|
||||
**获取方式:** 推荐线上购买纸质书籍
|
||||
|
||||
## 软件工程管理
|
||||
|
||||
### 1.人月神话
|
||||
|
||||
**作 者:** 布鲁克斯(FrederickP.Brooks.Jr.)
|
||||
|
||||
**推荐理由:**
|
||||
本书内容源于作者Brooks在IBM公司任System/360计算机系列以及其庞大的软件系统OS/360项目经理时的实践经验。在本书中,Brooks为人们管理复杂项目提供了最具洞察力的见解,既有很多发人深省的观点,又有大量软件工程的实践,为每个复杂项目的管理者给出了自己的真知灼见。
|
||||
|
||||
大型编程项目深受由于人力划分产生的管理问题的困扰,保持产品本身的概念完整性是一个至关重要的需求。本书探索了达成一致性的困难和解决的方法,并探讨了软件工程管理的其他方面。本书适合任何软件开发行业的从业人员阅读,对软件开发人员、软件项目经理、系统分析师更是必读之作。
|
||||
|
||||
**获取方式:** 推荐线上购买纸质书籍、网上电子版
|
||||
|
||||
## 虚拟机
|
||||
|
||||
### 1.深入理解Java虚拟机
|
||||
|
||||
<img src="../img/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Java%E8%99%9A%E6%8B%9F%E6%9C%BA.jpg" style="width:200px"/>
|
||||
|
||||
**作 者:** 周志明
|
||||
|
||||
**推荐理由:**
|
||||
|
||||
本书详细讲解了Java虚拟机,在社区被号称为《Java圣经》。
|
||||
|
||||
**获取方式:** 推荐线上购买纸质书籍
|
||||
|
||||
## 图形处理
|
||||
|
||||
### 1.街机游戏字体-像素字体的设计与应用
|
||||
|
||||
<img src="../img/%E8%A1%97%E6%9C%BA%E6%B8%B8%E6%88%8F%E5%AD%97%E4%BD%93.jpg" style="width:200px"/>
|
||||
|
||||
**原作名:** ARCADE GAME TYPOGRAPHY
|
||||
|
||||
**作 者:** 大区都市(TOSHI OMAGARI)
|
||||
|
||||
**译 者:** 刘育黎
|
||||
|
||||
**推荐理由:**
|
||||
|
||||
本书讲述字体从雅达利字体的设计诞生与进化,可以引发程序员在图形处理上思考
|
||||
|
||||
**获取方式:** 推荐线上购买纸质书籍
|
||||
|
||||
## 编程语言
|
||||
|
||||
### 1.Go语言设计与实现
|
||||
|
||||
<img src="../img/Go%E8%AF%AD%E8%A8%80%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0.jpg" style="width:200px"/>
|
||||
|
||||
**作 者:** 左书祺([@Draven](https://draveness.me/))
|
||||
|
||||
**推荐理由:**
|
||||
|
||||
本书由社区大佬([@Draven](https://draveness.me/))创作的Golang教学书籍,内容充实(教科书级),是除了《Effective Go》外的入门不二之选
|
||||
|
||||
**获取方式:** 推荐线上购买纸质书籍
|
||||
|
|
@ -163,6 +163,7 @@ ENTITY 表示业务实体名称,可以根据需要有多个单词组成(1-3
|
|||
视图的命名以V_开头
|
||||
##### <font color= #8470FF>Ø规范</font>:视图其它命名规范
|
||||
|
||||
|
||||
参考表的命名规范
|
||||
|
||||
##### <font color= #3CB371>Ø建议</font>:视图的列名
|
||||
|
|
@ -170,6 +171,9 @@ ENTITY 表示业务实体名称,可以根据需要有多个单词组成(1-3
|
|||
一般与基表一致,但是根据需要可以与基表的列名不同。
|
||||
|
||||
|
||||
## 索引命名规范
|
||||
##### <font color= #8470FF>Ø规范</font>:前缀规范
|
||||
索引的命名以IDX_开头,中间接表名,后面接字段名,如:IDX_TRENTBASE_PRIPID
|
||||
|
||||
# 基本设计规范
|
||||
|
||||
|
|
@ -286,3 +290,69 @@ DDL定义必须符合本设计规范,通过脚本校验工具(规避关键
|
|||
> 1. 表内的每一个记录都只能被表达一次;
|
||||
> 2. 表内的每一个记录都应该被唯一的标识(有唯一键);
|
||||
> 3. 表内不应该存储依赖于其他键的非键信息。
|
||||
|
||||
|
||||
# 表的优化与列类的选择
|
||||
总结:数据库优化无非就两个方面:“空间换时间,时间换空间”。几十年前内存比较小,那个时候写程序就是一个字节一个字节的扣,看谁用的内存少, 现在硬件都是廉价的,1T的固态加上上百G的内存都不算什么,所以现在都是什么东西都是往内存一扔,如,以前有1G的文本,要统计数量,这个在现在就比较落伍了,直接往内存一扔,暴力统计下就可以了。第三点就是磁盘上多费点,换取时间的取胜。
|
||||
|
||||
1、定长与变长分离
|
||||
如:id int,占4个字节,char(4)占4和字符长度,也是定长。
|
||||
|
||||
即每一单元的值的字节是固定的
|
||||
核心且常用字段,宜建成定长,放在一张表
|
||||
如:用户姓名,等级是常用的,放在一张表里面,而E-mail,电话这些信息要点进去才能看,可以放在另外一张表
|
||||
|
||||
|
||||
而varchar,text,blob这种变长字段,合适存放一张表,并用主键和核心表关联起来
|
||||
|
||||
2、常用字段和不常用字段要分离
|
||||
需要结合网站具体的业务来分析,分析字段的查询场景,查询频率低的字段,拆分出来。
|
||||
|
||||
3、在一对多需要关联统计的字段上,添加冗余字段,用于统计分析
|
||||
数据库设计一般有范式,范式越高,表就拆分的越细,但是这样设计不好,我们在设计中一般是反范式。
|
||||
比如论坛,栏目,下面有个统计今日发文的数量,一般是 两表联合查询,这样比较消耗资源,我们可以添加一个【数量】的字段,每次发文就加1,每天清零,这样增加速度
|
||||
|
||||
列类型的选择
|
||||
1、字段类型的优先级:
|
||||
整型>date,time>char>varchar>text
|
||||
列的特点分析:
|
||||
1>整型:定长,没有国家、地区之分,没有字符集的差异
|
||||
比如:tinyint 1,2,3,4,5 <----> char(1) a,b,c,d,e
|
||||
从空间上,都是占用1个字节,但是 order by 排序,前者快
|
||||
原因:后者需要考虑字符集与校对集(排序规则、大小写)
|
||||
比如【 a B c D】 我们正常来说排序就是【 a B c D】 ,但是计算机是【 B D a c】
|
||||
|
||||
2>time定长,运算快,节省空间,考虑失去,写sql时不方便 where>'2005-10-12'
|
||||
3>enum 能起约束表值的目的,内部用整数型来存储,单与char联查时,内部要经历串与值的转化
|
||||
4>char 定长, 考虑字符集和排序,校对集
|
||||
5>varchar,不定长,要考虑字符集的转换与排序时的校对集,速度慢
|
||||
6>text 等大字段 无法使用内存临时表(排序操作只能在磁盘上进行)
|
||||
|
||||
以性别为例:
|
||||
char(1),3个字长字节
|
||||
enum('男','女') //内部转成数字来存,多了一个转换过程
|
||||
tingint ,//0 1 2//定长字节
|
||||
|
||||
2、够就行,不要慷慨
|
||||
原因:大的字段浪费内存,影响速度
|
||||
以年龄为例tinyint unsigned not null,可以存储255岁,足够,用int浪费了3个字节
|
||||
以varchar(100),varchar(300)存储相同的内容,单在表联查时,varchar(300)要花更多内存
|
||||
|
||||
|
||||
3、尽量避免使用NULL()--mysql数据库的
|
||||
原因:NULL,不利于索引,要用特殊的字节来标注;
|
||||
在磁盘上占据的空间其实更大(mysql5.7已对null做了改进,但查询还是不便)
|
||||
|
||||
# 索引
|
||||
数据库查询只会用到一个索引
|
||||
|
||||
1、在where 条件常用的列上,都加上索引
|
||||
例:where id=3 and price>100 //查询栏目3,价格为100元以上的商品
|
||||
误:id上和price上都加上索引
|
||||
答:只能用上id或price索引,因为是独立的索引,同时只能用上1个
|
||||
|
||||
2、在多列上建立索引后,查询哪个列,索引都将发生作用
|
||||
误:多列索引上,索引发挥作用,需要满足左前提要求
|
||||
|
||||
# 表更新
|
||||
1、所有的执行语句必须加上事务,确定没有问题才能提交,更新数据范围不能超过100列,如果超过这个数,就必须DBA联系处理
|
||||