feat(playbook): support multi-language standards layout

This commit is contained in:
csh
2025-12-13 19:15:55 +08:00
parent 5311f33802
commit 88f0842134
13 changed files with 396 additions and 171 deletions
+123
View File
@@ -0,0 +1,123 @@
# TSL 代码风格(Code Style
本章节规定 TSL 代码的结构与格式约定。
## 1. 文件与组织
- 一个文件只做一件事;职责明确。
- 文件名使用 `PascalCase`,并与文件内唯一的顶层声明同名(语法要求)。扩展名按类型使用 `.tsl`/`.tsf`
- 避免循环依赖;公共能力下沉到可复用模块。
- 同类代码按“对外 API → 核心实现 → 辅助工具 → 测试/示例”的顺序组织。
## 2. 格式(Formatting
### 2.1 缩进与空白
- 使用**空格缩进**,禁止 Tab。
- 默认缩进 **4 个空格**;继续缩进保持与上层语义一致。
- 行尾不留空格;文件以换行符结尾。
- 逻辑块之间用空行分隔,不要用空行堆砌。
### 2.2 行宽与换行
- 单行建议不超过 **100 字符**;超过时应换行以保持可读性。
- 换行遵循“**断在运算符后**、对齐到语义层级”的原则。
- 长字符串/URL 可适当超出,但避免影响阅读。
### 2.3 begin/end 与代码块
- 代码块使用统一的块结构(示例为伪代码,按 TSL 语法调整):
```tsl
if cond then
begin
DoSomething()
end
else
begin
DoOther()
end
```
- 多语句分支使用 `begin/end` 包裹:在 `then/else` 后换行写 `begin``end` 单独成行。
- `else/elseif` 等分支关键字另起一行,与上一块的 `end` 对齐。
### 2.4 运算符与分隔符
- 二元运算符两侧加空格:`a + b``x == y`
- 一元运算符不加空格:`!flag``-value`
- 逗号后加空格:`f(a, b, c)`
- 不要为了对齐而插入多余空格;让格式由缩进表达结构。
### 2.5 控制流
- 多语句分支必须使用 `begin/end`;单语句分支可省略 `begin/end`,写成单行(如 `if cond then stmt`)。
- 复杂条件拆分为具名布尔变量或小函数。
- 早返回优于深层嵌套:
```tsl
if !ok then return err
// main path
```
## 3. 注释(Comments
注释用于解释**为什么**以及必要的背景,而不是重复代码。
### 3.1 文件级注释
- 文件开头说明用途、主要职责、关键依赖/约束。
- 若文件实现某个对外 API,写明入口与预期行为。
### 3.2 函数/接口注释
- 对外可见的函数必须写注释,包含:
- 做什么(行为)
- 入参/返回值含义(必要时含单位、范围)
- 关键副作用与异常情况
- 注释使用完整句子,末尾带标点。
### 3.3 行内注释
- 用于解释复杂逻辑、非直观边界条件、性能/安全考量。
- 避免“显而易见注释”:
```tsl
count = count + 1 // bad: obvious
```
### 3.4 TODO/FIXME
- 统一格式:`TODO(name): ...` / `FIXME(name): ...`
- 写清原因和期望修复方向,而非“留个坑”。
## 4. 代码实践(Best Practices
### 4.1 变量与常量
- 默认使用不可变/只读(如语法支持 `const` 或等价机制)。
- 变量声明与第一次使用尽量靠近。
- 避免隐藏式类型转换与隐式全局。
### 4.2 函数设计
- 函数参数建议显式写类型注解,提升可读性与工具检查能力。
- 无返回值函数显式标注返回类型为 `void`
```tsl
function Func(a: string; b: ClassName): void;
```
- 单一职责;函数过长说明拆分点已出现(建议 ≤ 40–60 行)。
- 参数顺序:输入参数在前,输出/回调在后。
- 尽量避免超过 5 个参数;必要时封装为对象(class/unit)。
### 4.3 错误处理
- 错误必须显式处理:返回错误、抛出异常或记录并降级(按项目约定)。
- 不要吞掉异常/错误;必须加注释说明原因。
### 4.4 性能与可测试性
- 避免过早优化;先写清晰正确的代码,再用数据驱动优化。
- 复杂逻辑要可测试:拆成纯函数或可注入依赖的模块。