以下行为准则以完全遵循 Apache 软件基金会行为准则为前提。
./mvnw clean install -B -T1C -Pcheck。./mvnw spotless:apply -Pcheck 格式化代码。getter /setter 方法,单元测试需全覆盖。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,包括普通局部变量、for 循环变量、增强 for 循环变量和 try-with-resources 资源变量。final。final。null。null 表示缺失值时才允许使用 null,并必须通过 @Nullable 或 JAVADOC 明确其语义。Optional。if/else 分支分别只包含一个返回语句或对同一个变量赋值时,使用三目运算符;其他情况使用 if/else。@HighFrequencyInvocation 标注需要重点检查性能行为的高频生产代码。
canBeCached = true。+ 拼接字符串;LinkedList#get(int)。System.out,log 等,必须使用断言进行验证。Plugins.getMemberAccessor(),且反射仅限于 Field 访问。TypedSPI 或 DatabaseTypedSPI,应通过 TypedSPILoader 或 DatabaseTypedSPILoader 实例化,禁止使用 new。<ProductionClassName>Test。 该测试类命名规则为强制要求,与面向场景的测试方法命名规则相互独立。assert<MethodName>,无额外后缀;应优先使用独立测试方法覆盖单个公开的生产方法;可行时,测试方法顺序与对应的生产方法保持一致。"{0}" 作为展示名模板。ReturnsXXX,也不要使用仅复述预期结果而未说明场景的措辞。not 或 containsString;可断言完整值或使用更具体的 matcher 时,不得使用这两个 matcher。assertTrue 和 assertFalse;assertNull 和 assertNotNull;assertThat(actual, is(expected));assertThat(actual, isA(ExpectedType.class));assertThat(actual, sameInstance(expected));assertThat(actual, not(sameInstance(expected)));mock 应遵循如下规范:
AutoMockExtension 及其静态 mock 或构造 mock 支持。 只有该扩展无法适用并且记录了原因时,才可直接使用 mockStatic 或 mockConstruction,并且必须通过 try-with-resources 限定作用域。 如果某个类已列入 @StaticMockSettings,不要对它调用 mockStatic 或 mockConstruction,而应通过 when(...) 设置桩行为。times(1) 参数,使用 verify 的单参数方法即可。RETURNS_DEEP_STUBS,不要层层手动 mock。foo_/bar_)明确标识其测试用途。PropertiesBuilder 简化 Properties 构造。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。下划线 间隔。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。