mcpField
A
arch-solid

arch-solid

github.com/yonatankarp开发140 次安装23 周前更新
代码仓库

关于 arch-solid

为面向对象和组件设计提供 SOLID 原则参考,适用于代码审查、组件设计与架构讨论。内容强调依具体情境判断,并指出原则过度应用时的反模式。

主要功能

  1. 01单一职责原则与变更原因
  2. 02开放封闭原则与扩展方式
  3. 03里氏替换原则与行为子类型
  4. 04接口隔离原则与小型接口
  5. 05依赖倒置原则与抽象
  6. 06识别 SOLID 过度应用的反模式

适用场景

  1. 01审查代码中的耦合与职责
  2. 02讨论类或接口如何划分
  3. 03解释设计模式背后的原则
  4. 04评估架构中的依赖方向

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/yonatankarp/software-design-skills --skill arch-solid

安装后在 Claude Code 中输入/arch-solid确认已加载。

详细介绍

一句话总结

塑造健康面向对象设计和组件设计的五项原则——运用时讲求判断,而非奉为教条。每项原则都有特定的动机,也有与之对应的过度应用反模式。

何时使用此技能

  • 代码审查关注结构、职责或耦合时。
  • 讨论组件设计:应该用一个类还是两个类;是否应该拆分这个接口。
  • 新人入职培训:解释许多 GoF 模式背后的原则。
  • 讨论依赖方向很重要的架构(DIP 是六边形架构的基石)。

何时不使用此技能

  • 针对单个代码异味的具体修复 → 各模式技能(gof-*、ddd-anti-patterns)更具体。
  • 将其教条式地用作清单(“这是否违反了任何 SOLID 原则?”)——这正是 SOLID 变成反模式的原因。每项原则都指明了一个方向,而非简单的是非判断。

核心内容

S — 单一职责原则。“一个类应该只有一个改变的理由。”Bob 大叔的解释是:“职责 = 改变的理由”,而非“职责 = 任务”。这项原则关注的是改变的轴线——不同的利益相关者不应因互不相关的原因而需要修改同一个类。过度应用:每个方法都单独设一个类,文件无处不在,增加间接层却没有收益。

**O — 开闭原则。**对扩展开放,对修改关闭——通过新代码(子类、策略、插件)添加新行为,而不修改已有的测试代码。通过对变化轴线进行抽象来实现(参见 gof-strategy、gof-template-method)。过度应用:每个类都声明为 abstract,“以防以后需要扩展”——这是过早追求灵活性。

**L — 里氏替换原则。**子类型必须能够替换其基类型,且不破坏调用方。如果 Square 继承 Rectangle 后破坏了 setWidth(w); setHeight(h) 的假设,那么这种继承就是错误的,即使两种类型都有宽度和高度。继承“是一个”关系时,如果这种关系并非真正的行为子类型,往往会违反此原则。

**I — 接口隔离原则。**不应强迫客户端依赖它们不会使用的方法。许多小而专注的接口,胜过一个臃肿的接口;后者会迫使每个实现者处理自己并不关心的方法。过度应用:每个方法都设一个接口,徒增摩擦却没有收益。

**D — 依赖倒置原则。**高层模块不依赖低层模块;二者都依赖抽象。抽象不依赖细节;细节依赖抽象。这是六边形架构(arch-hexagonal)背后的基础思想——接口由领域层定义,基础设施层负责实现。

SOLID 的误用方式。

  • 把它当作简单的是非标准,而非一个方向。
  • 用它为过度抽象辩护(“这里需要一个接口,以防将来要替换实现”——这是过早抽象)。
  • 把它当作唯一标准:代码可以符合 SOLID,却依然难以阅读、运行缓慢或存在错误。
  • 把它当作招聘筛选条件:“你懂 SOLID 吗?”会将其简化为术语检查,忽略了让这些原则真正有用的判断力。

决策启发

  • SOLID 是讨论耦合、内聚和变化的一套术语。这些原则是默认做法,不是规则。应结合具体代码作出判断。
  • 在架构层面,DIP 的影响最为深远(六边形架构、整洁架构)。其他原则主要作用于类或模块层面。
  • 违反 LSP 属于错误(被替换的子类型会破坏调用方)。其他 SOLID 违规属于设计异味——紧迫性较低,但修复成本不高时仍值得处理。
  • 不要为了遵循 SOLID 而引入接口。间接层的成本是真实存在的。等到出现第二种实现(或确实即将出现)时再引入。

反模式

  • SOLID 表演。 添加抽象、拆分类、引入接口——一切只为“满足 SOLID”——却没有改变代码的实际行为。有模式之名,却无模式之实。
  • 一类一方法。 过度拆分类,导致代码库变成由细小间接层构成的迷宫。SRP 被夸大到失去实用性。
  • 万物皆接口。 每个类都通过接口封装,而接口恰好只有一种实现。ISP 被过度应用。
  • 为复用代码而继承。 继承基类以复用其中 30% 的方法,却破坏了 LSP,因为子类的行为并不真正符合基类。
  • 把 SOLID 当作检查清单。 “这个 PR 违反 SOLID 了吗?”忽略了更重要的问题:这种违反是否有影响?有些确实有;很多则没有。

另请参阅

  • arch-hexagonal — 在架构层面应用 DIP。
  • arch-layered — 在层级上应用 SRP(每层承担一项职责)。
  • gof-strategy、gof-template-method — 通过特定模式实现 OCP。
  • gof-review — SOLID 违规往往会表现为 gof-review 中提到的模式误用异味。

参考资料

  • Robert C. Martin,《Clean Architecture》(Pearson,2017)——第 7–11 章介绍 SOLID。
  • Robert C. Martin,《Agile Software Development, Principles, Patterns, and Practices》(2002)——较早对 SOLID 的阐述。
  • 关于这些原则的论述十分广泛;Uncle Bob 的阐释具有代表性,但并非唯一合理的观点。

评论

支持 Markdown