以下行为准则以完全遵循 Apache 软件基金会行为准则为前提。
./mvnw clean install -B -T1C -Pcheck
。./mvnw spotless:apply -Pcheck
格式化代码。src/resources/idea/code-style.xml
,用于保持代码风格一致性。src/resources/idea/inspections.xml
,用于检测代码潜在问题。arguments
缩写为 args
;parameters
缩写为 params
;environment
缩写为 env
;properties
缩写为 props
;configuration
缩写为 config
。result
命名;each
命名循环变量;entry
代替 each
;ex
;ignored
。result
、each
、entry
。xxUtils
。Spinal Case
命名(一种使用 -
分割单词的特殊 Snake Case
)。equals
和 ==
条件表达式中,常量在左,变量在右;大于小于等条件表达式中,变量在左,常量在右。this
修饰符。final
。null
。LinkedList
,只有在需要通过下标获取集合中元素值时再使用 ArrayList
。ArrayList
,HashMap
等可能产生扩容的集合类型必须指定集合初始大小,避免扩容。if (null == param) {} else {}
。@SuppressWarnings("xxx")
代替 @SuppressWarnings("all")
。@HighFrequencyInvocation
注解,用于聚焦关键方法性能的优化。
@HighFrequencyInvocation
注解的时机:
canBeCached
属性为 true
时,表示该目标为可复用的缓存资源,例如:数据库连接。@HighFrequencyInvocation
的代码段须严格保证代码性能,以下为标注代码段内的禁止项:
+
拼接字符串;get(int index)
方法。System.out
,log
等,必须使用断言进行验证。getter /setter
方法,以及声明 SPI 的静态代码,如:getType / getOrder
,单元测试需全覆盖。not
、containsString
断言。Assertions
,hamcrest CoreMatchers
和 MatcherAssert
相关可以使用 static import。assertTrue
和 assertFalse
;assertNull
和 assertNotNull
;assertThat
。@Test
标注的方法无需 javadoc。mock
应遵循如下规范:
mock
;mock
。AutoMockExtension
和 StaticMockSettings
自动释放资源;若使用 Mockito mockStatic
和 mockConstruction
方法,必须搭配 try-with-resource
或在清理方法中关闭,避免泄漏。times(1)
参数,使用 verify
的单参数方法即可。SQL 解析模块涉及的 G4
语法文件以及 SQLVisitor
实现类,需要根据如下的数据库关系进行差异代码标记。当数据库 A 不提供对应的数据库驱动和协议,而是直接使用数据库 B 的驱动和协议时,可以认为数据库 A 是数据库 B 的分支数据库。
通常分支数据库会直接使用主干数据库的 SQL 解析逻辑,但是为了适配分支数据库的特有语法,部分分支数据库会从主干数据库复制并维护自己的 SQL 解析逻辑,此时对于分支数据库的特有语法,需要使用注释进行标记,其他部分需要和主干数据库的实现保持一致;
主干数据库 | 分支数据库 |
---|---|
MySQL | MariaDB、Doris |
PostgreSQL | - |
openGauss | - |
Oracle | - |
SQLServer | - |
ClickHouse | - |
Hive | - |
Presto | - |
SQL92 | - |
差异代码标记语法,增加时将 {DatabaseType}
替换为数据库类型大写名,例如:DORIS
。
// {DatabaseType} ADDED BEGIN
和 // {DatabaseType} ADDED END
;// {DatabaseType} CHANGED BEGIN
和 // {DatabaseType} CHANGED END
。200
个字符,保证每一行语义完整以便于理解。下划线
间隔。DataType
和 Symbol
的规则命名以 下划线
结尾。与 ANTLR 内置变量或关键字重名的规则在结尾加 下划线
以示区分。fragment
,fragment
定义的规则需在其服务的规则之后声明。Keyword.g4
,每个数据库可以有自己特有的规则定义。例如:MySQLKeyword.g4
。冒号
后空一格再开始写规则,分号
在单独一行并保持和上一行相同缩进。5
个,则每个分支一行。数据库名称
+ 语句类型名称
+ Statement
。例如:MySQLDQLStatement.g4
。.yml
结尾。触发方式-执行操作
的小写字母组成。例如:nightly-check.yml
。pull_request 触发的任务省略触发方式,例如:check.yml
。name
属性命名与文件名一致,单词以 -
作为分隔符,分隔符两侧要加空格,每个单词首字母大写。例如:Nightly - Check
。name
属性应该描述 step 的功能,每个单词首字母大写,介词小写。例如:Build Project with Maven
。job
属性命名,须在 Workflow 中保持唯一。matrix
的时候,必须添加作业并行度限制为 20。例如:max-parallel: 20
。timeout-minutes: 10
。