12 KiB
复盘文档
元数据
- 需求编号:004-02
- 复盘时间:2026-02-05
- 创建人:AI Assistant
- 状态:已完成
复盘概述
本次复盘对 Tooling API 元数据操作功能(需求 004-02)的开发过程进行全面回顾,从需求定义到变更日志的每个阶段都进行了分析,总结了成功经验、改进点、问题分析和行动计划,旨在提高后续开发过程的效率和质量。
目标与实际产出对比
目标
- 实现 Tooling API 元数据操作功能,支持创建、查询、更新、删除 Salesforce 元数据
- 支持 5 种元数据类型的创建操作:CustomObject、CustomField、ApexClass、ApexTrigger、Flow
- 实现异步操作日志记录,避免影响主流程性能
- 遵循 SSOT 流程,确保所有开发活动都有文档依据
- 生成符合项目规范的代码
实际产出
- 成功实现了 Tooling API 元数据操作功能,包括创建、查询、更新、删除操作
- 支持 5 种元数据类型的创建操作:CustomObject、CustomField、ApexClass、ApexTrigger、Flow
- 实现了异步操作日志记录机制,使用 Spring @Async 异步记录操作日志
- 严格按照 SSOT 流程执行,每个阶段都有相应的文档(需求、设计、决策、SQL、提示词、变更日志)
- 生成了 18 个代码文件(8 个基础代码 + 10 个业务代码),符合项目规范
- 提供了 9 个 REST API 接口
- 定义了 11 个标准错误码,覆盖所有可能的错误场景
成功经验
1. SSOT 流程的严格执行
从需求定义到变更日志的每个阶段都严格按照项目规则执行,确保了所有开发活动都有文档依据。这种严格执行带来了以下好处:
- 可追溯性:每个决策、每段代码都有文档依据,便于后续维护和问题排查
- 一致性:所有文档采用统一的格式和结构,便于阅读和理解
- 完整性:每个阶段都有明确的输出和验收标准,确保不遗漏关键内容
2. 详细的提示词设计
阶段 5 生成的提示词包含了详细的输出格式要求、代码规范要求和测试要求,确保了生成的代码符合项目规范和需求。具体做法包括:
- 明确指定需要生成的文件清单(18 个文件)
- 明确指定每个文件的包路径和类名
- 明确指定代码规范(继承关系、注解使用、异常处理等)
- 明确指定测试要求(单元测试覆盖率不低于 80%)
3. 异步日志记录机制
采用 Spring @Async 实现异步日志记录,避免了同步记录对主流程性能的影响。这种设计带来了以下好处:
- 性能优化:主流程无需等待日志记录完成,提高了响应速度
- 可靠性:即使日志记录失败,也不会影响主流程的执行
- 可配置性:可以通过配置线程池参数来调整异步处理的性能
4. SoqlBuilder 的复用
复用现有的 SoqlBuilder 工具类构建 SOQL 查询语句,提高了代码复用性和可维护性。这种做法体现了:
- DRY 原则:避免重复造轮子,复用现有工具类
- 一致性:使用统一的查询构建方式,便于维护和理解
- 可扩展性:SoqlBuilder 支持动态构建复杂查询,满足各种查询需求
改进点
1. 阶段间的过渡可以更流畅
在阶段转换时,可以更主动地向用户解释下一阶段的目的和流程,提高用户的理解和参与度。
具体建议:
- 在进入每个阶段前,简要说明该阶段的目标和主要任务
- 提供该阶段的预期输出和时间估算
- 在阶段完成后,总结该阶段的成果和关键决策
2. 代码生成前的验证可以更严格
在生成代码前,可以增加对设计文档和决策记录的再次验证,确保代码生成的准确性。
具体建议:
- 在生成代码前,检查设计文档是否完整、准确
- 验证决策记录中的关键技术决策是否在代码中得到正确实现
- 检查提示词是否涵盖了所有必要的代码规范和要求
3. API 文档的自动生成可以考虑
可以探索使用 Swagger 等工具自动生成 API 文档,提高文档的准确性和维护性。
具体建议:
- 在代码中添加 Swagger 注解,自动生成 API 文档
- 使用 Swagger UI 提供在线 API 文档浏览和测试功能
- 定期更新 Swagger 注解,确保文档与代码同步
4. 单元测试的生成可以更早
单元测试的生成可以在代码生成阶段就进行,而不是作为后续任务。
具体建议:
- 在提示词中明确要求生成单元测试
- 在代码生成阶段就生成完整的单元测试代码
- 确保单元测试覆盖正常和异常场景
问题分析
问题 1:代码生成器生成的基础代码需要手动调整
现象:代码生成器生成的 Entity、Mapper、Service 等基础代码虽然功能完整,但在命名规范和包结构上需要手动调整以符合项目规范。
根因:
- 代码生成器的模板与项目规范存在差异
- 表名前缀
datai_导致生成的类名包含Datai前缀,与项目命名规范不完全一致
解决方案:
- 在代码生成后,手动调整类名和包结构
- 考虑优化代码生成器模板,使其更符合项目规范
- 在提示词中明确指定命名规范,减少手动调整的工作量
问题 2:会话记录中的对话记录不够详细
现象:在阶段 7 更新会话记录时,发现部分对话记录缺失或不够详细。
根因:
- 会话记录的更新不及时,部分对话内容被遗忘
- 对话记录的格式不够规范,导致信息丢失
解决方案:
- 在每个阶段完成后立即更新会话记录,确保对话记录的完整性
- 采用统一的对话记录格式(时间、用户/AI、内容)
- 使用工具辅助记录对话,减少人工遗漏
问题 3:错误码体系的设计需要更多考虑
现象:在定义错误码时,部分错误场景的错误码不够明确,存在重叠或遗漏。
根因:
- 错误码的设计缺乏系统性规划
- 对 Salesforce 异常场景的分析不够全面
解决方案:
- 在设计阶段就进行全面的错误场景分析
- 建立错误码分类体系(如认证错误、操作错误、系统错误等)
- 定期审查和优化错误码体系
行动计划
| 序号 | 行动项 | 责任人 | 时间节点 | 优先级 |
|---|---|---|---|---|
| 1 | 在阶段转换时增加对下一阶段的目的和流程的解释 | AI Assistant | 立即执行 | 高 |
| 2 | 在生成代码前增加对设计文档和决策记录的再次验证 | AI Assistant | 立即执行 | 高 |
| 3 | 探索使用 Swagger 等工具自动生成 API 文档 | 项目团队 | 下一个迭代 | 中 |
| 4 | 在提示词中明确要求生成单元测试 | AI Assistant | 立即执行 | 高 |
| 5 | 优化代码生成器模板,使其更符合项目规范 | 项目团队 | 下一个迭代 | 中 |
| 6 | 在每个阶段完成后立即更新会话记录 | AI Assistant | 立即执行 | 高 |
| 7 | 建立错误码分类体系,定期审查和优化 | 项目团队 | 下一个迭代 | 中 |
提取模式
有效的 Prompt 技巧
1. 具体的输出格式要求
在提示词中明确指定需要生成的文件、路径、格式等,可以提高生成代码的准确性和规范性。
示例:
必须生成以下文件:
1. Controller:ToolingMetadataController.java,路径:com.datai.salesforce.tooling.controller
2. Service 接口:IToolingMetadataService.java,路径:com.datai.salesforce.tooling.service
3. Service 实现:ToolingMetadataServiceImpl.java,路径:com.datai.salesforce.tooling.service.impl
2. 引用真源
在提示词开头引用需求文档和设计文档的链接,可以确保生成的代码符合需求和设计要求。
示例:
基于以下文档生成代码:
- 需求文档:[004-02-元数据操作需求文档](../requirements/sub/2026-01-28-004-02-元数据操作.md)
- 设计文档:[004-02-元数据操作设计文档](../design/2026-02-03-004-02-元数据操作-设计.md)
3. 详细的代码规范要求
在提示词中明确指定代码规范、命名规范、注释规范等,可以提高生成代码的质量和可读性。
示例:
代码规范要求:
1. 类名使用大驼峰命名法(PascalCase)
2. 方法名使用小驼峰命名法(camelCase)
3. 常量使用全大写,单词间用下划线分隔
4. 使用 Slf4j 日志框架,使用 log.info()、log.error() 等方法记录日志
5. 使用 Swagger 注解(@Api、@ApiOperation、@ApiParam 等)标注 API 接口
避免的坑
1. 不要使用模糊的描述
在提示词中使用模糊的描述(如"请生成高质量的代码"),会导致生成的代码不符合预期。
错误示例:
请生成高质量的代码,确保代码符合项目规范。
正确示例:
代码必须遵循以下规范:
1. 使用若依框架的 R 类统一返回结果
2. 使用 @PreAuthorize("@ss.hasLogin()") 进行权限控制
3. 使用自定义异常 SalesforceAuthException 处理认证异常
4. 单元测试覆盖率不低于 80%
2. 不要忽略测试要求
在提示词中忽略测试要求,会导致生成的代码缺少单元测试,降低代码的质量和可靠性。
错误示例:
生成 Service 层代码。
正确示例:
生成 Service 层代码,并生成对应的单元测试类。
单元测试要求:
1. 使用 JUnit 5 和 Mockito 进行测试
2. 覆盖正常场景和异常场景
3. 测试覆盖率不低于 80%
4. 使用 @Mock 和 @InjectMocks 进行依赖注入模拟
3. 不要违反项目规则
在代码生成过程中违反项目规则(如不遵循若依框架规范),会导致生成的代码不符合项目要求,需要重新生成。
错误示例:
生成 Controller 代码,使用自定义的返回结果类。
正确示例:
生成 Controller 代码,使用若依框架的 R 类统一返回结果:
- 成功时返回 R.ok(data)
- 失败时返回 R.fail(errorCode, errorMessage)
- 分页查询时返回 R.ok(pageResult)
模板迭代
经过本次复盘,发现当前的提示词模板在以下方面可以优化:
1. 增加代码生成后的验证要求
在提示词中增加代码生成后的验证要求,确保生成的代码符合项目规范。
建议添加:
代码生成后,必须进行以下验证:
1. 检查类名和包路径是否符合规范
2. 检查是否使用了正确的继承关系和注解
3. 检查是否处理了所有必要的异常场景
4. 检查是否生成了对应的单元测试
2. 增加错误码设计的指导
在提示词中增加错误码设计的指导,确保错误码体系的完整性和一致性。
建议添加:
错误码设计规范:
1. 错误码格式:TOOLING_META_XXX(XXX 为 3 位数字)
2. 错误码分类:
- 001-099:认证和会话相关错误
- 100-199:创建操作相关错误
- 200-299:查询操作相关错误
- 300-399:更新操作相关错误
- 400-499:删除操作相关错误
- 500-599:系统错误
3. 每个错误码必须有明确的错误消息和说明
3. 增加异步处理的规范要求
在提示词中增加异步处理的规范要求,确保异步操作的正确性和可靠性。
建议添加:
异步处理规范:
1. 使用 Spring @Async 注解标记异步方法
2. 异步方法必须返回 void 或 Future 类型
3. 异步方法必须捕获所有异常,避免异常丢失
4. 异步操作失败时,必须记录错误日志
5. 考虑使用 @Async 的线程池配置,避免资源耗尽