You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
AdLike2048/docs/开发规范.md

12 KiB

项目开发规范(AI 与人工必读)

更新日期:2026-08-17
适用范围:本仓库全部 TypeScript / 业务逻辑新增与修改
Cursor 持久规则:.cursor/rules/dev-standards.mdc

本文档定义 AI 智能体生成代码 与 人工协作开发 的强制标准。违反项应在 Code Review 与合并前纠正。


1. 工程素养与全局视角

1.1 经验水准

以 二十年资深程序员 的标准审视每一行代码:熟悉常见技术实现、设计模式、引擎机制与平台差异,不写出「只会堆代码」的解法。

1.2 全局优先(含临时修 Bug)

任何改动——包括一行临时修 Bug——都必须从 全局 出发,综合评估:

维度 要求
架构性 是否符合分层(MX 框架 / 业务 / UI),是否破坏模块边界
可复用性 是否可沉淀为通用能力,避免复制粘贴
可扩展性 后续需求是否只需扩展而非推翻
高可靠性 异常路径是否可控,状态是否一致
安全性 输入、存档、网络、平台 API 是否安全使用

禁止「只改眼前这一处、不管上下游」的局部补丁式屎山。

1.3 长期记忆与整体分析

  • 对话可能很长,不能仅依赖当前会话上下文;须结合 docs/ 文档、架构分层与已有模块做 整体分析。
  • 新会话开始前应查阅:项目说明.md、项目分析报告.md、相关 需求-* / 方案-*。
  • 架构级决策写入 docs/,形成项目 长期记忆,避免「聊着聊着忘了」或「新开会话全忘」。

2. 面向对象与代码组织

2.1 OOP 为默认范式

  • 必须基于 面向对象 开发,运用软件工程中的封装、抽象、单一职责、依赖倒置等原则。
  • 任何功能模块 使用类 + 接口组织;逻辑归属清晰,不散落。

2.2 禁止全局函数

  • 业务逻辑 必须在 接口或类 中实现。
  • 禁止 新增裸全局函数承载业务逻辑。
  • 例外(已存在、勿再扩散):
    • 引擎生命周期组件(Component 子类)
    • 框架级单例入口(如 gg)
    • 纯类型/常量模块的导出(无运行时逻辑)

2.3 文件与脚本粒度

  • 禁止 为一个小需求随意新增 TS 文件。
  • 同类 数据结构、接口定义 合并到同一文件(如 *Types.ts、*Defs.ts)。
  • 新增文件须有明确模块边界理由,并在文档或 PR 说明中可解释。

2.4 命名

  • 接口、枚举、类、字段、函数名:简化驼峰,简洁易懂,禁止过长名称。
  • 示例:BattleFacade(可)、BattleSessionRuntimeFacadeManager(过长,避免)。

3. 代码质量:简洁、无屎山、无擅自兜底

3.1 简洁可读

  • 完全杜绝屎山:短函数、清晰分支、少嵌套;能自解释的代码优先于冗长注释。
  • 通用框架代码(assets/mx/)中 不写业务逻辑注释;框架层仅保留必要的模块/契约说明。

3.2 禁止擅自兜底

  • 坚决禁止 任何形式的静默兜底(默认值掩盖错误、吞异常、?? 掩盖配表缺失、空实现假装成功等)。
  • 允许:显式 容错警告(console.warn / 受控日志 / 上报),让问题 暴露 给开发者或监控。
  • 数据缺失、配表错误、资源加载失败等:报错或中止当前流程,由上游或策划修复,不得 AI 自行「猜一个能跑的值」。

3.3 变量与常量

  • 实现功能时 不随意新增 变量/常量;能复用现有状态、参数、类字段的则复用。
  • 新增须有必要性(生命周期、可读性、性能分帧等),避免无意义中间变量堆砌。

4. 文档注释规范

4.1 必须写文档注释的符号

以下 全部 须有标准 JSDoc 风格 文档注释(/** ... */),简洁明了:

  • 数据结构定义(interface、type 别名若表达业务含义)
  • 类
  • 接口
  • 枚举及 每一个枚举项
  • 字段(interface / 类 public 成员)
  • 函数 / 方法(含参数与返回值说明,若含义不直观)

4.2 注释风格

/** 战斗会话对外门面,项目层唯一入口 */
export class BattleFacade {
    /** 当前活跃会话;无战斗时为 null */
    private _session: BattleSession | null = null;

    /**
     * 部署塔单位
     * @param weapon1Id Weapon1 表 id
     * @param row 逻辑行 0~11
     * @param col 逻辑列 0~9
     */
    deploy(weapon1Id: number, row: number, col: number): void { }
}

/** 章节难度 */
export enum ChapterDiff {
    /** 普通 */
    Normal = 2,
}
  • 不写废话注释(// 赋值);不写与代码矛盾的注释。
  • 框架通用代码 不写逐步逻辑注释;业务复杂流程可在 业务层 用简短注释说明非显而易见的规则。

5. 函数与语法约束

规则 说明
参数不换行 函数形参列表写在 同一行;过长时优先简化命名或减少参数,而非拆行
禁止函数内定义函数 不在方法体内 function foo() 或箭头函数承载可复用逻辑;提取为类私有方法
尽量避免闭包 回调、延迟逻辑定义为 类方法,显式 bind 或使用箭头类字段(注意 onDestroy 解绑)
回调归属 事件、动画、加载完成等回调写在类中,生命周期内配对注册/注销

6. TypeScript 与 Cocos 平台约束

6.1 ES 版本与语法

  • 遵循 Cocos Creator 推荐的 ES 版本(以项目 tsconfig 与引擎文档为准)。
  • 禁止使用 高风险、小游戏环境 不稳定 的语法与内置类型,例如:
    • Set / Map(部分真机/小游戏解析或序列化异常;用数组 + 显式去重或项目内 MembershipSet 等等价结构)
    • 禁止 对 Map/Set 迭代器做展开或 Array.from:[...map.keys()]、[...map.values()]、[...map.entries()]、[...map]、[...set]、Array.from(map.keys())。web-mobile 会编成 [].concat(iterator),得到空对象,随后 .map 崩。收数组用 mapKeysToArray / mapValuesToArray / membershipToArray;遍历用 forEach。
    • 过度依赖新特性而未经平台验证的 API

6.2 Cocos Creator 官方文档

  • 调用引擎能力(节点、组件、资源、assetManager、director、动画、物理等)时 严格遵守官方文档。
  • 不臆造 API;不依赖未文档化行为;版本差异以 3.8.8 为准。

7. 需求边界(禁止擅自发挥)

情况 行为
需求不明确 必须询问用户 并确认,不得猜测实现
用户未授权「自行发挥」 禁止 自行扩展玩法、数值、交互
行业惯例 / 通用默认 允许(例:未规定飞行特效细节时,可自行设计「酷炫」表现)
策划数值、流程、文案 禁止 AI 擅自更改;有疑问先问

8. 性能与帧循环

除架构要求外,必须考虑 运行时性能:

  • 时间复杂度 / 空间复杂度:热路径(update、战斗 tick、列表刷新)避免 O(n²) 与无谓分配。
  • 帧循环:能 分帧 的必须分帧(FrameFlowHost、分帧加载、延迟初始化);能 延迟 的延迟(非关键路径不要阻塞首帧)。
  • 避免在 update 内创建对象、查表、字符串拼接;缓存、池化、脏标记优先。
  • 与 LoadScheduler、ResourcePhaseGate 等资源策略对齐,不在错误阶段猛加载。

9. 动画与异步生命周期

适用于 Tween、插值、Spine、程序 Animation 等一切动画:

  • 视为 异步逻辑:开始、停止、完成、被覆盖、节点销毁须成对处理。
  • 必须 处理:停止动画、清除回调、组件 onDestroy 时取消未完成动画。
  • 禁止:节点已销毁仍执行 tween 回调、重复注册未清理的 complete 导致崩溃或逻辑错乱。
  • 动画与战斗暂停、UI 遮挡、场景切换的交互须明确(参考 BattleUiPauseGate 等现有门闩)。

10. 资源加载、使用与释放

资源相关代码为 高危区,须深度理解引擎资源机制与各真机环境:

要求 说明
加载 明确 bundle、路径、阶段;失败 暴露错误,不静默跳过
使用 持有引用期间节点有效;异步回调前校验 isValid(node)
释放 与 BundleLifecycle、gg.res 策略一致;不提前释放仍被渲染/引用的资源
异常操作 考虑玩家快速切换界面、断网、重复点击、战斗中途退出
禁止 资源已释放仍参与渲染 导致的崩溃(空纹理、无效 SpriteFrame 等)

参考模块:AssetService、BundleLifecycle、RuntimeLoadingGate、BattleBackgroundLoadGate。


11. 内存、复用与对象池

实现代码时 必须考虑内存,不能完全不顾内存占用与 GC 压力。

11.1 复用优先

  • 能复用的对象、数组、临时结构 尽量复用,避免热路径频繁 new。
  • 与第 8 节性能要求一致:分帧、池化、脏标记、减少短命对象。

11.2 对象池

要求 说明
正确使用 出池用于显示/逻辑,用毕 归还;禁止泄漏(借出未还、重复归还)
状态初始化 复用前 深度分析 该对象的全部使用方与字段含义;onGet / reset / clear 须 完整重置状态,不得残留上一轮数据
禁止新 Bug 不得因池化引入逻辑错误(脏数据、错误 parent、未解绑事件、动画未停)
与释放平衡 池化是为复用,不是无限囤积;池容量与释放策略须符合 MemoryProfile 档位

对象池适用:子弹、飘字、列表 Item、临时 Node 包装等高频创建/销毁对象。

11.3 释放字段与引用

  • 除对象池外,可释放 的资源引用、大数组、缓存字段、事件监听、定时器,在生命周期结束时应 显式释放或置空。
  • 释放前须分析:是否仍被异步回调、动画、其他模块持有。
  • 禁止 因过早释放引入崩溃或逻辑错误(与第 10 节资源释放原则一致:释放须安全,不释放须可解释)。

11.4 自检要点

  • 出池对象所有业务字段已重置?
  • 事件、 tween、Spine 监听已解绑?
  • 节点 parent、active、组件引用已恢复默认?
  • 归还后无外部仍持有该实例的强引用?

12. 与现有架构的关系

层级 路径 新代码原则
MX 框架 assets/mx/ 无业务逻辑;可复用能力;不加业务注释
业务 assets/script/ 玩法、配表、SDK 适配
UI assets/script/ui/ 展示与交互;通过门面访问战斗/数据

老项目复制代码 不完全符合 本规范;新写与改动触及的代码 须向本规范收敛,大规模遗留清理按 遗留代码收敛方案.md 与 docs/需求-* 排期。

遗留代码策略(摘要)

  • 禁止 无需求驱动的全库规范重构(易回归且可能重构即将删除的模块)。
  • 新代码 与 本次修改触及的文件 必须遵规范。
  • 全库收敛分阶段见 遗留代码收敛方案.md。

13. 自检清单(提交前)

  • 是否从全局/架构评估过,而非只改一处?
  • 逻辑是否在类/接口中,无新增全局业务函数?
  • 是否避免多余文件、多余变量?
  • 接口/类/枚举/枚举项/字段/函数均有文档注释?
  • 函数参数未换行?函数内无嵌套函数定义?
  • 无静默兜底?问题是否暴露?
  • 未使用 Set/Map 等不稳定结构(新代码)?
  • 动画与资源:销毁/取消/释放是否完整?
  • 对象池:出池重置完整、归还无泄漏、无脏状态?
  • 可释放字段/引用:生命周期结束是否安全释放,且未过早释放?
  • 热路径是否考虑分帧、内存与性能?
  • 需求是否经用户确认,未擅自改策划?

14. 相关文档