| name | design-an-interface |
| description | 使用并行子代理为一个模块生成多种截然不同的接口设计方案。当用户想要设计 API、探索接口选项、比较模块形态,或提到"设计两次"时使用。 |
设计接口(Design an Interface)
基于《软件设计哲学》(A Philosophy of Software Design)中的"设计两次"(Design It Twice)原则:你的第一个想法不太可能是最好的。生成多种截然不同的设计,然后进行比较。
工作流程
1. 收集需求
在设计之前,需要了解:
提问:"这个模块需要做什么?谁会使用它?"
2. 生成设计(并行子代理)
使用 Task 工具同时启动 3 个以上的子代理。每个子代理必须提出一种截然不同的方案。
每个子代理的提示模板:
为以下模块设计接口:[模块描述]
需求:[收集到的需求]
本次设计的约束条件:[为每个代理分配不同的约束]
- Agent 1:"最小化方法数量——目标是最多 1-3 个方法"
- Agent 2:"最大化灵活性——支持多种使用场景"
- Agent 3:"针对最常见的情况进行优化"
- Agent 4:"从[特定范式/库]中汲取灵感"
输出格式:
1. 接口签名(类型/方法)
2. 使用示例(调用者如何使用)
3. 该设计在内部隐藏了什么
4. 该方案的权衡
3. 展示设计
展示每个设计时包含以下内容:
- 接口签名 - 类型、方法、参数
- 使用示例 - 调用者在实际中如何使用
- 隐藏的内容 - 保留在内部的复杂性
按顺序展示设计,以便用户在比较之前能够理解每种方案。
4. 比较设计
展示所有设计后,从以下方面进行比较:
- 接口简洁性:更少的方法、更简单的参数
- 通用性与专用性:灵活性与专注度的权衡
- 实现效率:接口形态是否允许高效的内部实现?
- 深度:小接口隐藏大量复杂性(好的设计) vs 大接口搭配薄实现(不好的设计)
- 易于正确使用 vs 易于误用
用文字而非表格来讨论权衡。重点突出设计之间差异最大的地方。
5. 综合
通常,最佳设计会结合多个方案的优点。提问:
- "哪种设计最适合你的主要用例?"
- "是否有其他设计中的元素值得引入?"
评估标准
来自《软件设计哲学》:
接口简洁性:更少的方法、更简单的参数 = 更容易学习和正确使用。
通用性:能够在不修改的情况下处理未来的用例。但需注意不要过度泛化。
实现效率:接口形态是否允许高效的实现?还是会强制使用笨拙的内部结构?
深度:小接口隐藏大量复杂性 = 深模块(好)。大接口搭配薄实现 = 浅模块(应避免)。
反模式
- 不要让子代理产出相似的设计——必须强制要求截然不同
- 不要跳过比较——价值在于对比
- 不要实现——这纯粹是关于接口形态的设计
- 不要基于实现难度来评估