tsl-playbook/docs/code_style.md

3.7 KiB
Raw Blame History

代码风格Code Style

本章节规定 TSL 代码的结构与格式约定。

1. 文件与组织

  • 一个文件只做一件事;职责明确。
  • 文件名使用 PascalCase,并与文件内唯一的顶层声明同名(语法要求)。扩展名按类型使用 .tsl/.tsf
  • 避免循环依赖;公共能力下沉到可复用模块。
  • 同类代码按“对外 API → 核心实现 → 辅助工具 → 测试/示例”的顺序组织。

2. 格式Formatting

2.1 缩进与空白

  • 使用空格缩进,禁止 Tab。
  • 默认缩进 4 个空格;继续缩进保持与上层语义一致。
  • 行尾不留空格;文件以换行符结尾。
  • 逻辑块之间用空行分隔,不要用空行堆砌。

2.2 行宽与换行

  • 单行建议不超过 100 字符;超过时应换行以保持可读性。
  • 换行遵循“断在运算符后、对齐到语义层级”的原则。
  • 长字符串/URL 可适当超出,但避免影响阅读。

2.3 begin/end 与代码块

  • 代码块使用统一的块结构(示例为伪代码,按 TSL 语法调整):
if cond then
begin
    DoSomething()
end
else
begin
    DoOther()
end
  • 多语句分支使用 begin/end 包裹:在 then/else 后换行写 beginend 单独成行。
  • else/elseif 等分支关键字另起一行,与上一块的 end 对齐。

2.4 运算符与分隔符

  • 二元运算符两侧加空格:a + bx == y
  • 一元运算符不加空格:!flag-value
  • 逗号后加空格:f(a, b, c)
  • 不要为了对齐而插入多余空格;让格式由缩进表达结构。

2.5 控制流

  • 多语句分支必须使用 begin/end;单语句分支可省略 begin/end,写成单行(如 if cond then stmt)。
  • 复杂条件拆分为具名布尔变量或小函数。
  • 早返回优于深层嵌套:
if !ok then return err
// main path

3. 注释Comments

注释用于解释为什么以及必要的背景,而不是重复代码。

3.1 文件级注释

  • 文件开头说明用途、主要职责、关键依赖/约束。
  • 若文件实现某个对外 API写明入口与预期行为。

3.2 函数/接口注释

  • 对外可见的函数必须写注释,包含:
    • 做什么(行为)
    • 入参/返回值含义(必要时含单位、范围)
    • 关键副作用与异常情况
  • 注释使用完整句子,末尾带标点。

3.3 行内注释

  • 用于解释复杂逻辑、非直观边界条件、性能/安全考量。
  • 避免“显而易见注释”:
count = count + 1  // bad: obvious

3.4 TODO/FIXME

  • 统一格式:TODO(name): ... / FIXME(name): ...
  • 写清原因和期望修复方向,而非“留个坑”。

4. 代码实践Best Practices

4.1 变量与常量

  • 默认使用不可变/只读(如语法支持 const 或等价机制)。
  • 变量声明与第一次使用尽量靠近。
  • 避免隐藏式类型转换与隐式全局。

4.2 函数设计

  • 函数参数建议显式写类型注解,提升可读性与工具检查能力。
  • 无返回值函数显式标注返回类型为 void
function Func(a: string; b: ClassName): void;
  • 单一职责;函数过长说明拆分点已出现(建议 ≤ 4060 行)。
  • 参数顺序:输入参数在前,输出/回调在后。
  • 尽量避免超过 5 个参数必要时封装为对象class/unit

4.3 错误处理

  • 错误必须显式处理:返回错误、抛出异常或记录并降级(按项目约定)。
  • 不要吞掉异常/错误;必须加注释说明原因。

4.4 性能与可测试性

  • 避免过早优化;先写清晰正确的代码,再用数据驱动优化。
  • 复杂逻辑要可测试:拆成纯函数或可注入依赖的模块。