3.7 KiB
3.7 KiB
TSL 代码风格(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后换行写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)。 - 复杂条件拆分为具名布尔变量或小函数。
- 早返回优于深层嵌套:
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;
- 单一职责;函数过长说明拆分点已出现(建议 ≤ 40–60 行)。
- 参数顺序:输入参数在前,输出/回调在后。
- 尽量避免超过 5 个参数;必要时封装为对象(class/unit)。
4.3 错误处理
- 错误必须显式处理:返回错误、抛出异常或记录并降级(按项目约定)。
- 不要吞掉异常/错误;必须加注释说明原因。
4.4 性能与可测试性
- 避免过早优化;先写清晰正确的代码,再用数据驱动优化。
- 复杂逻辑要可测试:拆成纯函数或可注入依赖的模块。