以下行为准则以完全遵循 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。