solid 是五把实用尺子,助代码更稳、改得更快、读得更顺:单一职责强调类只管一件事;开放封闭主张新功能靠“加”而非“改”;里氏替换要求子类替换父类时行为一致;接口隔离提倡小而专的接口;依赖倒置通过抽象解耦模块。

直接说重点:SOLID 不是教条,而是帮你把代码写得更稳、改得更快、读得更顺的五把尺子。它不追求“看起来高级”,而是解决真实协作和迭代中的痛点——比如改个登录逻辑,结果订单流程崩了;加个新支付方式,要动十几个文件。
单一职责原则:一个类只管一件事
核心不是“拆得越细越好”,而是“谁变了,别连累别人”。当一个类需要修改时,如果原因不止一个(比如既要改校验规则,又要调新接口,还要加日志格式),就该拆。
- 把数据模型(User)、业务校验(UserValidator)、存储操作(UserRepository)、日志记录(Logger)分开,各自独立演进
- 避免在实体类里塞 save()、log()、format() 这类和核心职责无关的方法
- 前端组件也适用:一个 React 组件只负责渲染用户头像,就不该同时处理权限判断和图片压缩
开放封闭原则:新功能靠“加”,而不是“改”
稳定模块不该被反复打开修改。关键在于提前预留扩展点,让变化落在可插拔的位置。
一款AI工具,主要用于一款基于 Rust 的快速无头浏览器自动化命令行工具(CLI),支持 Node.js 回退机制,可使 AI agent 通过结构化命令实现页面导航、点击、输入及截图,适合需要提升相关任务效率的用户。
- 用抽象(如 Shape 接口)定义行为契约,新增 Circle 或 Triangle 无需动 AreaCalculator
- 用策略模式替代 if-else 判断:支付方式从微信扩展到支付宝、Apple Pay,只需新增策略类,不碰原有结算主逻辑
- 配置驱动扩展:通过 JSON 或 YAML 定义规则,让业务逻辑变化走配置,而非改代码
里氏替换原则:子类换父类,行为不能悄悄变
不是“能编译通过就行”,而是“运行时表现一致”。违反 LSP 往往埋下隐性 bug,尤其在多态调用场景。
- 子类重写父类方法时,不能缩小访问权限、不能抛出父类没声明的异常、返回值类型不能更宽泛
- 避免“伪继承”:比如 Square 继承 Rectangle 后,重写 setWidth() 和 setHeight() 强制保持相等,会破坏 Rectangle 的预期行为
- 优先组合优于继承;若必须继承,用接口或抽象类明确约定契约,再由具体实现去遵守
接口隔离与依赖倒置:解耦靠“中间层”,不靠“硬连线”
ISP 和 DIP 常一起起作用:小而专的接口 + 高层依赖抽象,才能真正切断模块间的强绑定。
- 拒绝“万能接口”:比如 ICrudService 包含 create/update/delete/find/all,实际使用者可能只用其中两个,却被迫实现全部
- 按角色定义接口:IOrderPlacer、IOrderNotifier、IOrderArchiver,各司其职,互不影响
- DIP 落地关键是注入抽象:Controller 不 new UserRepository(),而是接收 IUserRepository 接口实例;数据库换 MongoDB 或 Redis,上层完全无感










