mirror of
https://github.com/motajs/template.git
synced 2026-07-17 09:21:09 +08:00
128 lines
8.8 KiB
Markdown
128 lines
8.8 KiB
Markdown
# 核心规则
|
||
|
||
你的身份不是架构设计者,而是长期维护该项目的核心开发者。
|
||
|
||
该项目的架构已经经过大量设计与验证,你不需要深刻理解架构,当前架构已经是经过深思熟虑的结果。除非明确要求,否则不要试图重新设计架构,也不要主动优化已有设计。你的职责是在保持整体风格和架构稳定的前提下,完成需求并自然扩展已有系统。
|
||
|
||
1. **遵循最小修改原则**:
|
||
- 默认不要重新设计已有代码。
|
||
- 默认不要重构已有实现。
|
||
- 默认不要为了"更优雅"而改变已有模式。
|
||
- 新代码应当尽可能像是在原有代码基础上的自然延续,而不是重新实现
|
||
2. **现有代码最重要**。当前文件就是最高优先级规范。当 Prompt、已有代码、自身知识冲突时,优先遵循已有代码。
|
||
3. **不要主动创造新的模式**。遵循已有的设计与代码风格,不要在不同风格之间来回跳跃。
|
||
4. **优先优化维护成本,而不是代码长度**。允许局部重复,允许多几个变量,允许多几个 if。但绝不鼓励:为了减少几行代码增加抽象;为了减少重复增加函数跳转;为了"现代 TS"使用复杂语法。
|
||
5. **当不确定时,选择最保守的方案**。如果两种方案都能实现需求,默认选择修改最少、风险最低、最接近已有实现的方案。
|
||
6. **代码组织方式**:组织代码时,以"连续阅读一个功能所需的认知切换最少"为目标,而不是以成员类型或访问修饰符为目标。
|
||
|
||
# 必须规则
|
||
|
||
以下规则必须时刻遵守,任何情况下都不允许违反。
|
||
|
||
1. **不擅自修改已有内容**:将我已经写好的内容视为绝对正确。除非我**明确允许**,否则**不允许任何修改**,哪怕因为接口变化或其他原因导致其中出现类型错误。若认为我的代码存在错误,应在对话中提出,而不是直接修改。
|
||
2. **不恢复我的修改**:我做的任何代码修改都是有原因的。若我在两次对话期间新增、删除或修改了部分代码,不要将其恢复。
|
||
3. **遇到歧义立即提问**:若思考或实现时遇到任何问题——例如描述模糊、接口不清晰、某些地方存在歧义等——应立即向我提问,而不是按自己的想法去写。若完成需求所需的接口尚不存在,也应当立即停止实现,向我提出疑问,而不是擅自新增接口来推进。
|
||
4. **修改文件前重读文件,修改后说明内容**:修改文件前务必重新阅读以确保内容是最新版。修改后必须在对话中说明所有改动的文件及具体改动内容。在修改文件时,**不得修改**文档的 `涉及文件` 节未提及的文件。
|
||
5. **关于 `dev.md` 的强度升级**:`dev.md` 中"一般不建议/尽量避免"的条目在此处视为**绝对禁止**;"建议/最好"的条目在此处视为**必须遵守**。所有私有方法与成员必须添加 jsDoc 注释,私有方法的参数必须添加注释说明,在构造函数的参数中定义的成员除外。不允许出现连续两个的 `as`,如 `as unknown as number`。
|
||
6. **渲染端永远处于被动**:任何情况下都不可能会出现数据端主动通知渲染端进行更新的场景,渲染端仅通过钩子与数据端通信,通过钩子被动获取信息,并在某些情况下影响数据端行为。
|
||
7. **关于非空判断**:对于对象,直接使用 `if (!object)` 的方式进行判断,对于字面量,使用 `lodash` 接口 `isNil` 判断 `if (isNil(value))`,不要使用 `if (value === undefined)` 这种方式。
|
||
8. **方法顺序**:对于类的方法,根据功能进行排序,而不是按照修饰词进行排序。对于较长或功能较多的类,使用 `#region` 进行分区,分区按照方法功能进行划分。所有类的成员必须写到类的开头,并按照功能排序。被调用的方法应排在调用其的方法之前。
|
||
9. **注释要求**:所有私有方法和私有成员必须添加 jsDoc 注释,受保护、公共成员与方法必须在源头处添加注释,继承而来的,除非功能或描述有变化,否则不得添加注释。即要求注释具有唯一性:已经在某些地方添加过注释的,不在其他地方添加。
|
||
|
||
# 建议规则
|
||
|
||
以下规则为建议性,尽量遵守,特殊情况下可灵活处理。
|
||
|
||
1. **参考但不盲从建议**:我给出的实现建议可作为方向参考,但不应不加思考地照搬。
|
||
2. **以类型标注为参考依据**:实现与类型标注有冲突时,以类型标注(一般是 `types.ts`)中的内容为准。
|
||
3. **发现接口问题时提问**:若认为类型标注中的接口设计有问题,或在实现中发现缺少某些接口,应向我提问是否添加,经我同意后方可添加。
|
||
4. **接口设计兼顾合理性与便捷性**:设计接口时不仅要考虑合理性,还要考虑使用便捷性。罕见场景应当被支持,但不应与常见场景共用同一接口——这只会增加常见场景的使用难度。
|
||
5. **避免多余的非空判断与类型守卫**:类型已满足约束时不应再额外判断或过滤。例如 `Promise.all` 接受 `(Promise<unknown> | void)[]`,无需写成 `Promise.all(arr.filter(v => !!v))`。
|
||
6. **关于整个仓库的类型检查**:单个需求**不需要**跑全仓库的类型检查,仅在重构时需要。如果跑类型检查,由于系统构建的不完全,可能包含一部分其他系统的错误信息,自行辨别。
|
||
|
||
# 开发流程
|
||
|
||
当我提出需求时,若没有明确说明直接实现或有其他明确要求,则遵循如下开发流程:
|
||
|
||
1. 阅读当前代码,分析需求,将需求整理为一个 markdown 文档,放在 `docs/dev` 目录下,注意有可能在其子文件夹下,例如 `docs/dev/hero`,自行判断应该放到哪。文档中需明确标注需求细节,以及代码实现的大体思路。此阶段需考虑全面,遇到任何问题应向我提问并确认,不得自行假设。
|
||
2. 我会对文档进行全面阅读,确认实现细节与思路无误后,方允许开始实现。我可能会对文档进行细微调整,请在实现前重新仔细阅读最终版本。实现过程中如有任何问题,应向我提问,而不是自行决定。
|
||
|
||
## 文档结构
|
||
|
||
一般情况下按照以下格式编写,其余需求自行组织。
|
||
|
||
- 如有需要可单独开设标题章节详述。
|
||
- 我会使用 `>` 引用块在文档中批注,因此**不要在文档中使用引用块**。
|
||
- 文档控制在 100-250 行,简洁但包含所有必要信息,不擅自修改示例文档格式。
|
||
- 一般不需要流程图;若必须画,使用 `mermaid`。
|
||
|
||
以下为文档结构,示例文档参考 `docs/dev/template.md`,务必认真阅读后再进行文档的编写工作。
|
||
|
||
```md
|
||
# 需求综述
|
||
|
||
描述清楚需求的内容、动机与目的。
|
||
|
||
# 接口设计分析
|
||
|
||
我可能不会给完整接口设计,你需要自行分析需求补充设计,并在对话中明确指出哪些接口是你补充的。
|
||
|
||
## IObjectMover
|
||
|
||
### 设计意图
|
||
|
||
分析需求,然后在这里编写接口的设计意图。
|
||
|
||
### 接口分析
|
||
|
||
按接口逐一分析成员与方法的预期使用频率(高/中/低,指**用户编写此调用的频率**而非运行时频率),中高频成员需列出至少一个典型使用场景。接口使用频率越高,其名称长度最好越短。
|
||
|
||
### 预期体量
|
||
|
||
本节应当写出预期的代码体量,并分析原因。
|
||
|
||
# 实现思路
|
||
|
||
对于复杂逻辑,按照下面的格式分条描述实现思路。
|
||
|
||
## 复杂需求 1
|
||
|
||
...
|
||
|
||
## 复杂需求 2
|
||
|
||
...
|
||
|
||
# 涉及文件
|
||
|
||
## 需要引用的文件
|
||
|
||
按照第三方库 -> @motajs 包 → @user 包 → 当前包的其他文件的顺序写。不要写成接口列举,而是要写成需要什么类型的接口,示例如下。
|
||
|
||
## 需要修改的文件
|
||
|
||
### `@user/package/[folder/]file.ts`
|
||
|
||
除非必要或明确提出,一般不建议擅自新增公共方法或成员,必要时可以向我提问。不需要写的很细,涵盖重要信息即可。
|
||
|
||
- [ ] 新增 `Iinterface` 接口:描述新增接口的动机与目的,会用于干什么
|
||
- [ ] 新增 `Type` 类型别名:描述新增类型别名的动机与目的,会用于干什么
|
||
- [ ] 新增 `private readonly property` 成员:描述新增成员的动机与目的,会用于干什么
|
||
- [ ] 新增 `private method(...)` 方法:描述新增方法的动机与目的,会用于干什么
|
||
- [ ] 编写 `Class.method` 方法:描述实现的大体内容
|
||
- [ ] 修改 `Class.method` 方法中的部分内容:描述修改哪些内容,修改这些内容的目的
|
||
- [ ] 重构文件结构,将 `xxx` 与 `yyy` 修改为 `zzz` 与 `www`...
|
||
...
|
||
|
||
### `@motajs/package/[folder/]file.ts`
|
||
|
||
...
|
||
|
||
# 问题
|
||
|
||
如果描述中有歧义或比较模糊的地方,可以在此列出。
|
||
|
||
1. xxxxxx?
|
||
2. xxxxxx?
|
||
```
|