编码规范
September 13, 2026 · View on GitHub
本文统一规定跨语言代码质量、Swift 实践、库与 API 以及用户可见文本本地化。构建与测试见
build-and-test.md。
跨语言代码质量
以下规则适用于手写的 Swift、Objective-C、Python、Shell、JavaScript/TypeScript 和其他源码。
组织与命名
- 按功能和明确职责组织代码;解析、UI、I/O、编排和验证混杂时,在当前任务范围内提取同级文件或模块。
- 每个源码文件聚焦一个职责;文件或类型超过项目 lint 阈值时评估拆分。现有大文件不自动纳入 当前任务范围。
- 较长但职责单一的文件使用 section marker 组织生命周期、状态、命令处理、I/O、解析和恢复逻辑。
- 编译的 Swift、Objective-C 和测试文件使用
UpperCamelCase;其他文件遵循对应工具和所在目录 的既有约定。 - 名称应表达意图;除简单循环索引外避免无语义的单字母变量和缩写,避免不必要的全局可变状态。
- 代码库已经采用 async/await 时优先沿用。
注释
- 为公开 API,以及职责、约束、副作用或实现原因不明显的模块、类型和函数添加必要文档;不注释 明显 accessor 或薄 wrapper。
- 注释说明代码本身无法表达的意图、约束或副作用,并随行为更新;格式遵循项目工具配置和相邻代码风格。
- 保留现有文件头;新文件遵循相邻文件模板,不使用 Agent 名称作为作者。
语言与迁移
- 新功能优先使用 Swift/SwiftUI;现有 AppKit 或 Objective-C 集成需要时沿用对应边界。
- 现有 Objective-C 允许必要的 bug 修复,不要求为局部修复先迁移。迁移只在任务范围内进行。
- Swift 迁移进度见
swift-migration.md。
Swift 组织与实践
- 每个 Swift 文件聚焦一个主要 class 或 struct;紧密耦合的 protocol、简单模型、私有 helper 或直接支持主类型的 extension 可以同文件维护。
- 将同一 protocol 的函数放在一起,并使用
// MARK: - <ProtocolName>标记;较长类型使用// MARK:区分生命周期、状态、协议和私有 helper。 - Swift 文档注释使用简洁英文。
库与 API
- SF Symbols 使用 SFSafeSymbols 的类型安全 API,不硬编码名称。
- SwiftUI 使用
foregroundStyle,不使用已弃用的foregroundColor。 - SwiftUI background 优先使用 trailing-closure 或专用 shape-style 重载。
- 网络请求使用 Alamofire 的 async/await API。
- 用户偏好使用 Defaults,不引入直接的 UserDefaults 使用。
本地化
- 所有用户可见 UI 文本必须本地化,不在 SwiftUI、AppKit、脚本或打包 web 资源中硬编码。
Localizable.xcstrings是应用主 String Catalog。新增 key 或改变含义时检查现有 locale, 并更新所有受影响的 locale。- 在 UI 和字符串 API 中优先直接使用静态 String Catalog key。
- 不动态构建本地化 key,也不拼接本地化片段;本地化完整句子并传入运行时参数。
- key 使用小写、点号分隔,并按
<scope>.<category>.<subcategory>.<element>使用 snake_case 片段。 - 公共贡献说明位于
docs/user-docs/en/How-to-translate-Easydict.md及其中文对应文档。