SOLID原则

本文介绍了面向对象设计和编程中的五个重要原则:单一责任原则(SRP)、开放封闭原则(OCP)、里氏替换原则(LSP)、接口分离原则(ISP)及依赖倒置原则(DIP),并详细阐述了每个原则的含义及其应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SOLID是面向对象设计和编程(OOD&OOP)中几个重要编码原则

即:SRP单一责任原则;

  OCP开放封闭原则;

  LSP里氏替换原则;

  ISP接口分离原则;

  DIP依赖倒置原则。

1. 单一责任原则(SRP)
      当需要修改某个类的时候原因有且只有一个。换句话说就是让一个类只做一种类型责任,当这个类需要承当其他类型的责任的时候,就需要分解这个类。 类被修改的几率很大,因此应该专注于单一的功能。如果你把多个功能放在同一个类中,功能之间就形成了关联,改变其中一个功能,有可能中止另一个功能,这时就需要新一轮的测试来避免可能出现的问题,非常耗时耗力。

2. 开放封闭原则(OCP)
软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。这个原则是诸多面向对象编程原则中最抽象、最难理解的一个。

(1)通过增加代码来扩展功能,而不是修改已经存在的代码。
(2)若客户模块和服务模块遵循同一个接口来设计,则客户模块可以不关心服务模块的类型,服务模块可以方便扩展服务(代码)。
(3)OCP支持替换的服务,而不用修改客户模块。

3. 里氏替换原则(LSP)

当一个子类的实例应该能够替换任何其超类的实例时,它们之间才具有is-A关系

客户模块不应关心服务模块的是如何工作的;同样的接口模块之间,可以在不知道服务模块代码的情况下,进行替换。即接口或父类出现的地方,实现接口的类或子类可以代入。

4. 接口分离原则(ISP)

不能强迫用户去依赖那些他们不使用的接口。换句话说,使用多个专门的接口比使用单一的总接口总要好。 

客户模块不应该依赖大的接口,应该裁减为小的接口给客户模块使用,以减少依赖性。如Java中一个类实现多个接口,不同的接口给不用的客户模块使用,而不是提供给客户模块一个大的接口。

5. 依赖注入或倒置原则(DIP)

1. 高层模块不应该依赖于低层模块,二者都应该依赖于抽象 
2. 抽象不应该依赖于细节,细节应该依赖于抽象

这个设计原则的亮点在于任何被DI框架注入的类很容易用mock对象进行测试和维护,因为对象创建代码集中在框架中,客户端代码也不混乱。有很多方式可以实现依赖倒置,比如像AspectJ等的AOP(Aspect Oriented programming)框架使用的字节码技术,或Spring框架使用的代理等。

(1).高层模块不要依赖低层模块;
(2).高层和低层模块都要依赖于抽象;
(3).抽象不要依赖于具体实现; 
(4).具体实现要依赖于抽象;
(5).抽象和接口使模块之间的依赖分离。

具体可参见:http://www.cnblogs.com/lanxuezaipiao/archive/2013/06/09/3128665.html有详细例子说明

### SOLID原则的具体含义 #### 单一职责原则 (SRP, Single Responsibility Principle) 单一职责原则强调每个类或模块应仅有一个引起它变更的原因。这意味着一个类只负责一项功能,从而提高代码的可读性和可维护性[^2]。 #### 开闭原则 (OCP, Open/Closed Principle) 开闭原则主张软件实体应对扩展开放,对修改关闭。换句话说,当需要新增功能时,可以通过增加新的代码而不是更改现有的代码来实现。这有助于减少因修改现有代码而导致错误的风险[^3]。 #### 里氏替换原则 (LSP, Liskov Substitution Principle) 该原则规定任何子类对象应当能够替代其基类对象而不影响程序的行为。这是面向对象编程中继承机制的重要特性之一,确保了系统的稳定性和一致性。 #### 接口隔离原则 (ISP, Interface Segregation Principle) 接口隔离原则提倡将大而全的接口拆分为更小、更具体的接口。这样做的好处是可以让客户端只需知道它们感兴趣的部分接口即可工作,减少了不必要的依赖关系。 #### 依赖倒置原则 (DIP, Dependency Inversion Principle) 此原则建议高层模块不应该依赖于低层模块,而是共同依赖于抽象;同时,抽象也不应该依赖于细节,相反,细节应该依赖于抽象。这种设计方式增强了组件之间的松耦合程度,使得系统更加灵活和易于扩展。 ### 应用场景分析 在实际项目开发过程中,合理运用SOLID原则可以帮助开发者构建高质量的应用程序框架。例如,在C#环境中按照这些指导方针编写业务逻辑层和服务层代码,可以使整个解决方案具备更高的灵活性与适应能力[^1]^。另外,通过分离不同层次的关注点,还可以获得更好的代码组织形式以及简化单元测试流程等方面的优势[^4]^。 ```csharp // SRP Example: A class responsible only for logging errors. public class Logger { public void LogError(string message){ Console.WriteLine($"ERROR: {message}"); } } // OCP Example: Adding new features without modifying existing code by using inheritance or composition. abstract class Shape{ protected abstract double Area(); } class Circle : Shape{ private readonly double radius; public Circle(double r){radius=r;} override protected double Area()=>Math.PI*radius*radius; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值