Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

标识符命名

Schema 名称是事实来源。生成代码会把这些名称转换成目标语言习惯的标识符,但运行时数据查找仍然使用原始 schema 名称。

例如,schema 字段 max_stack 在 TypeScript 中可能生成 maxStack,在 C# 中生成 MaxStack,在 Rust 中仍然是 max_stack。生成的 decoder 读取运行时数据包时,字段名仍然是 max_stack

命名流程

Sora 会先从每个 schema 名称派生通用命名形式,再交给语言生成器:

形式max_stack 的例子常见用途
Rawmax_stack运行时 table 名、field 名、enum 文本值、union tag。
PascalMaxStack类型、类、enum variant、导出符号。
CamelmaxStackcamel-case 语言中的字段、属性、参数、方法。
Snakemax_stacksnake-case 语言中的文件、模块、字段、函数。

语言生成器会选择合适的形式,并可以继续做语言相关的合法化处理,例如处理非法字符或保留字。

语言约定

内置生成器遵循目标语言常见的公开 API 风格:

目标类型字段和访问器文件/模块
RustPascalCasesnake_casesnake_case.rs
C带前缀的 snake_casesnake_casesnake_case.h, snake_case.c
C++PascalCasesnake_casesnake_case.hpp
C#PascalCasePascalCase propertyPascalCase.cs
GoPascalCase 导出名称PascalCase 导出字段snake_case.go
JavaPascalCaselowerCamelCasePascalCase.java
KotlinPascalCaselowerCamelCasetarget layout
ScalaPascalCaselowerCamelCasePascalCase.scala
TypeScriptPascalCaselowerCamelCasesnake_case.ts
JavaScriptPascalCaselowerCamelCasesnake_case.js, snake_case.d.ts
PythonPascalCasesnake_casesnake_case.py
DartPascalCaselowerCamelCasesnake_case.dart
LuaPascalCase table-like 类型lowerCamelCasesnake_case.lua
Erlangsnake_case 模块snake_case map key/functionsnake_case.erl
GodotPascalCase classsnake_casesnake_case.gd

这个表描述的是生成代码里的标识符,不是运行时数据名。

运行时名称保持 Raw

下面这些值保留原始 schema 拼写:

  • 数据包和 table metadata 中的 table 名;
  • 从运行时 row 中读取的 field 名;
  • enum string value;
  • union variant tag value;
  • schema lock 和 fingerprint 的输入。

修改 schema 名称会修改数据契约。仅修改某个目标语言的生成标识符风格,不应该修改数据契约。

自定义类型映射

自定义类型映射不会重命名生成的 schema 标识符。它只控制目标语言类型表达式、import/include,以及可选的转换 hook。

映射函数名是用户为目标语言编写的原生代码,所以应该遵循目标语言自己的命名习惯。映射 key 仍然是命名 schema 类型,例如 Vec3