design-pattern-advisor

设计模式决策顾问 skill。当用户**写代码时拿不准要不要用设计模式、用哪个**,或想**评审已有代码哪里该用模式、哪里过度设计**时触发。核心理念是「先证明你需要模式,再谈用哪个」——默认倾向不用,先过 YAGNI 闸门(变化真实出现≥2~3次才考虑)。典型措辞:『写代码不知道什么时候该用设计模式』『这段 if-else/switch 一大堆该用什么模式』『这里要不要上工厂/策略/单例模式』『

SKILL.md

GitHub

设计模式决策顾问(design-pattern-advisor)

把"要不要用设计模式、用哪个"从凭感觉,变成可走查、可对照、能挡住过度设计的工程动作。


核心理念(贯穿全程)

  1. 决策优先于目录:先答"该不该用模式",再答"用哪个",默认倾向不用。先有结论,模式目录只是备选库。
  2. YAGNI 闸门前置(Rule of Three):变化/重复现在真实出现 ≥2~3 次才考虑模式;想象中的"将来可能"不算理由。
  3. 坏味道驱动:模式是某个具体症状的解药,从症状反查模式,而不是从"我想用某模式"出发。
  4. 重构到模式 > 提前设计:需求被证实后重构到位,优于一上来就套模式。
  5. 反过度设计是红线:滥用模式本身就是坏味道,多写的抽象层和模式一样要还技术债。

现实边界:模式是工具不是目标。本 skill 不替你做"为用而用"的设计,也不承诺"用了模式 = 好代码"。它只帮你把"该不该用、用哪个"想清楚,把过度设计挡在门外。


何时使用 / 不使用

应触发(自然语言示意,不限于此):

  • "写代码不知道什么时候该用设计模式"
  • "这段 if-else / switch 一大堆,该用什么模式"
  • "这里要不要上工厂 / 策略 / 单例模式"
  • "我这个抽象层 / 继承体系是不是过度设计了"
  • "帮我看看这段代码哪能用模式、哪过度设计了"
  • "该用策略还是状态模式"
  • "想给这个类加日志又不改它本身,用哪个模式"

不触发(每条注明改用哪个):

场景 改用
设计后端接口契约 / 字段 / 错误码 api-contract-design
对代码做质量 / 安全 / 性能审查、找 bug、打分 code-review-deep-zh
读懂现有代码结构 / 调用链 / 某个方法 code-read-deep-*
只给代码加注释 code-annotating
调试排查 bug systematic-debugging
端到端实现一个完整功能 code-vibe-workflow(本 skill 可被其设计阶段调用)
只是科普"X 模式是什么" 直接回答即可,不必走本流程

双模式(进入时先判定)

用户给的 模式 产物
"我要写 X / 这段在写的代码该不该上模式" 建议模式 该不该用的判断 → 推荐模式 → 最小示例 → 更简单的替代写法对照
"看看我这段已有代码,哪能用模式 / 哪过度设计了" 审查模式 标注 ①该上没上 ②上了不该上,分级 + 给修改方向

判定不清就直接问用户一句:"你是写新代码时拿主意,还是评审已有代码?"


第 0 步(两模式共用):先过 YAGNI 闸门

这是本 skill 的招牌动作:把"别用"放在第一位。 三问连答:

  1. 这个变化 / 重复现在真实存在吗?出现了几次?(Rule of Three:< 2 次基本不考虑模式)
  2. 不用模式的最简写法是什么?它现在有什么具体痛点?(要能指名道姓,不是"将来不好扩展")
  3. 答不上具体痛点 → 停在"最简写法",不进模式目录。

只有当变化真实、重复够多、痛点具体,才往下走建议/审查流程。


建议模式(4 步)

不要 4 步一口气跑完。第 1-2 步先定方向,让用户确认,再产示例和替代方案。

  1. 识别变化点 — 一句话说清要解决的"变化 / 重复"到底是什么,而不是"我想用模式":
    • 算法/行为要多态切换? → 偏 Strategy / State
    • 对象创建复杂、需隔离? → 偏 Factory / Builder
    • 接口不兼容要适配? → 偏 Adapter
    • 一处变化要通知多方? → 偏 Observer
    • 想给对象加能力又不改它本身? → 偏 Decorator
  2. 过 YAGNI 闸门 — 同时给出"暂不用模式"的最简写法作对照;没过闸门就停在这里,明确告诉用户"现在不必上模式"。
  3. 坏味道 → 候选模式映射 — 查 references/smell-to-pattern.md,定位 1~2 个候选模式,说明它的适用边界与代价(多写的类、间接层、理解成本)。
  4. 给最小落地示例 + 替代方案 — 查 references/examples-<lang>.md,给带注释的最小骨架,并并排给出不用模式的更简单写法,让用户看到取舍。

审查模式(3 步)

  1. 扫两类信号:
    • 漏用(坏味道):大量 if/switch 分支、重复的创建逻辑、僵硬耦合、改一处要动多处。
    • 滥用(过度设计):只有一种实现的工厂/策略/接口、为单例而单例、一次性用途的抽象层、为"将来"预留的空抽象。
  2. 分级标注(每条都要说清"会导致什么后果"):
    • 🔴 建议引入 / 移除 — 有实际维护痛点,不改会持续付出代价
    • 🟡 可考虑 — 看后续演进,现在动也行不动也行
    • ⚪ 当前合理 — 保持现状,不要为了"显得专业"而加模式
  3. 给修改方向 — 关键点给最小重构示例(漏用 → 引入模式的骨架),或"拆掉模式"的简化示例(滥用 → 退回最简写法)。

反过度设计 Top 红线速查

完整版见 references/anti-overengineering.md。设计 / 审查时每段代码都扫一遍:

# 症状 正确做法
1 为"将来可能"而抽象 等变化真出现(≥2 次)再重构到模式
2 只有一种实现的 Factory / Strategy / 接口 直接 new / 直接调用
3 为单例而单例(无状态工具类强行单例) 静态方法或交给 DI 容器
4 一次性用途套继承 / Template Method 一个函数解决
5 处处包 Manager / Helper / Wrapper 抽象层、无第二个消费者 不抽
6 用"模式名"驱动设计 用"我要解决什么问题"驱动
7 深继承体系替代组合 优先组合
8 小项目无脑全套 DTO / VO / DO / BO 分层 按规模裁剪
9 简单 CRUD 提前上 CQRS / 事件溯源 等读写真分化再说
10 为"可扩展"预留一堆只有单一实现的抽象 删掉,需要时再加

参考资源导航

文件 用途
references/smell-to-pattern.md 坏味道 / 症状 → 候选模式 对照表(核心)
references/gof-patterns.md GoF 23 速查(意图 / 何时用 / 何时别用 / 代价 / 频率)
references/engineering-patterns.md DI / Repository / DTO / Specification 等高频工程模式
references/anti-overengineering.md 反过度设计红线 + 正确做法
references/examples-java.md 高频模式最小示例 + 更简单替代(Java)
references/examples-python.md 同上(Python)
references/examples-go.md 同上(Go)
references/examples-ts.md 同上(TypeScript)

示例文件仅覆盖高频模式(Strategy / Factory / Observer / Decorator / Adapter / Template Method / State / Builder / Repository / DI)+ 更简单的替代写法;其余模式在 gof-patterns.md 内联示意。


边界与例外

  • 极简场景主动降级:若只是一点点逻辑,直接告诉用户"这点逻辑最简写法即可,不必上模式",不要为流程而流程。
  • 不替代架构评审:跨系统、高并发、强一致这类设计另说,本 skill 聚焦"类/方法级别该不该用模式"。
  • 不写完整实现:只给最小示例骨架,完整功能落地交给 code-vibe-workflow。
  • 遵守仓库规则:代码示例带注释;不硬编码敏感值;事务只标注在方法级,不写类级。