【Design】《The 6 Principles of Object-Oriented Design》 设计模式23种设计模式并不是凭空发明出来的它们大多遵循面向对象设计的 6 大原则SOLID 迪米特法则。可以理解为设计原则 → 设计模式 → 具体代码就像交通法规 → 驾驶技巧 → 开车先有原则再有模式。文章目录1. 单一职责原则Single Responsibility PrincipleSRP核心思想错误示例改进小学生版实际工程2. 开闭原则Open-Closed PrincipleOCP核心思想例子小学生版3. 里氏替换原则Liskov Substitution PrincipleLSP核心思想正确错误经典案例小学生版4. 接口隔离原则Interface Segregation PrincipleISP核心思想错误正确小学生版5. 依赖倒置原则Dependency Inversion PrincipleDIP核心思想错误正确小学生版6. 迪米特法则Law of DemeterLoD核心思想错误正确小学生版一张图记住 6 大原则在实际开发中什么时候最有感1. 单一职责原则Single Responsibility PrincipleSRP核心思想一个类只负责一件事。错误示例classUserService{voidlogin(){}voidregister(){}voidsendEmail(){}voidgenerateReport(){}}这个类既负责用户管理邮件发送报表生成职责太多。改进classUserService{}classEmailService{}classReportService{}每个类只负责自己的事情。小学生版学校里班长 学习委员 体育委员各管各的。不要一个同学 负责全班所有事情否则累死。实际工程例如 YOLO 项目Dataset Model Trainer Validator分别负责数据模型训练验证而不是全部塞进一个类。2. 开闭原则Open-Closed PrincipleOCP核心思想对扩展开放对修改关闭。新增功能尽量新增代码 不要修改旧代码例子支付系统interfacePayment{voidpay();}已有classWeChatPayclassAlipayPay新增classApplePay直接扩展即可。不用if(typewechat)if(typealipay)if(typeapple)不断修改旧代码。小学生版插线板增加新电器 直接插进去而不是每买一个电器 拆一次墙3. 里氏替换原则Liskov Substitution PrincipleLSP核心思想子类必须能够替换父类。正确Animal├─Dog└─Cat哪里需要Animal都能传DogCat错误经典案例Rectangle继承Square因为正方形 ≠ 长方形行为不同。违反里氏替换。小学生版如果老师说带一只动物来你带小狗没问题。但如果带机器人就不行。4. 接口隔离原则Interface Segregation PrincipleISP核心思想不要让一个类依赖它不需要的方法。错误interfaceAnimal{fly();swim();run();}企鹅classPenguinimplementsAnimal结果fly()根本不会飞。很尴尬。正确拆分interfaceFlyable{}interfaceSwimmable{}interfaceRunnable{}需要什么实现什么。小学生版学校发了一张万能学生证学生证□ 游泳馆 □ 图书馆 □ 实验室 □ 停车场 □ 教师办公室一年级小学生只需要✓ 图书馆结果必须携带全部权限这就有问题。更合理的是图书馆证 游泳馆证 实验室证按需发放。这就对应interfaceReadable{}interfaceSwimable{}interfaceExperimentable{}5. 依赖倒置原则Dependency Inversion PrincipleDIP核心思想依赖抽象标准不依赖具体实现。高层模块不应该依赖低层模块两者都应该依赖抽象。错误classPerson{CarcarnewBMW();}Person绑死BMW。正确classPerson{Carcar;}其中interfaceCar{}具体实现BMWTeslaBYD随便换。人 ↓ 汽车接口(Car) ↓ 宝马 特斯拉 比亚迪小学生版家里的手机、电视、风扇都使用统一标准的插头。因此换一个品牌的插座这些电器仍然能用换一个品牌的电器插座也不用改。大家依赖的是“标准”而不是彼此。这就是依赖倒置原则。6. 迪米特法则Law of DemeterLoD也叫最少知道原则Least Knowledge Principle核心思想只和直接朋友说话。错误person.getCompany().getDepartment().getManager().getPhone()访问链太长。正确person.getManagerPhone()由内部处理。小学生版你想借一本书。正常你 ↓ 图书管理员 ↓ 找到书你不需要知道第几排 第几个书架 第几层 第几个格子如果你必须知道图书馆布局那以后图书馆重装修全乱套这就是少知道 少耦合一张图记住 6 大原则原则关键词一句话总结SRP单一职责一个类只负责一种职责OCP开闭原则扩展开放修改关闭LSP里氏替换子类替换父类后行为保持正确ISP接口隔离别逼别人实现不用的方法DIP依赖倒置依赖抽象不依赖具体实现LoD迪米特法则少了解别人的内部细节在实际开发中什么时候最有感很多开发者刚学设计模式时会觉得“这些原则很抽象平时写业务代码根本用不到。”实际上当项目从1000 行代码增长到10万 100万时这些原则开始体现价值。例如你做过 YOLO 改模型新增 Backbone 新增 Neck 新增 Attention 新增 Loss如果代码遵循开闭原则依赖倒置你只需要modelbuild_model(cfg)增加一个 YAML 配置即可。如果没遵循这些原则可能需要改十几个文件甚至引入新的 Bug。所以设计模式的本质不是“炫技”而是降低修改成本提高代码可维护性和可扩展性。对于 AI 工程来说最常见、最有价值的通常是单一职责原则模块拆分开闭原则方便扩展新模型依赖倒置原则配置驱动、插件化这三条几乎贯穿了从 PyTorch 框架到大型训练平台的设计。