关于 arch-solid
为面向对象和组件设计提供 SOLID 原则参考,适用于代码审查、组件设计与架构讨论。内容强调依具体情境判断,并指出原则过度应用时的反模式。
主要功能
- 01单一职责原则与变更原因
- 02开放封闭原则与扩展方式
- 03里氏替换原则与行为子类型
- 04接口隔离原则与小型接口
- 05依赖倒置原则与抽象
- 06识别 SOLID 过度应用的反模式
适用场景
- 01审查代码中的耦合与职责
- 02讨论类或接口如何划分
- 03解释设计模式背后的原则
- 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 的阐释具有代表性,但并非唯一合理的观点。