当设计面向对象的程序时,我们需要遵循五个相关原则,也被称为“SOLID”原则。以下是这些原则的详细介绍和示意:
单一职责原则(Single Responsibility Principle)
一个类应该有一个单一职责。也就是说,一个类只应该有一项引起它的变化的原因。应该将每个职责分配给具有单独职责的不同类。
示例:
我们考虑编写一个计算器类。如果我们将计算逻辑和显示逻辑合并到同一个类中,这个类就有了两个职责,即计算和显示。这没有遵循单一职责原则。相反,我们应该将这两个职责分配给两个不同的类:一个计算器类和一个显示结果的类。这样,我们就可以通过修改不同的类来实现需求的变化。
开放/关闭原则(Open/Closed Principle)
一个类应该对扩展开放,对修改关闭。这意味着,当需要添加新功能时,我们应该尽量在不修改现有代码的情况下进行。
示例:
假设我们编写了一个程序在点A处打印“Hello, world!”和在点B处打印“Goodbye, world!”。现在我们需要在点C处打印“Hello, human!”。我们不应该对原有的代码进行修改,而应该创建一个新类来打印出新的消息。
里氏替换原则(Liskov Substitution Principle)
子类应该能够替换掉它们的父类。这意味着,当使用基类类型的一个对象时,我们应该能够在不知道它是基类还是子类的情况下,能够使用该对象的子类。
示例:
我们考虑一个抽象的形状类,其中有一个计算面积的方法。如果我们创建了一个正方形类,并从形状类中继承计算面积的方法,此时我们应该能够用正方形来替换形状类中的任何一个实例。也就是说,我们应该像对待形状类一样对待正方形类。
接口分离原则(Interface Segregation Principle)
客户端不应该强制地依赖于它们不需要使用的接口。应该为客户端提供单独的接口。
示例:
考虑一个动物类,我们使用这个类的客户端可以通过访问一个通用接口来使用不同的动物。但是,如果我们在该通用接口中包含某些不同的方法,这会导致一些不必要的负担。例如,如果狗和鸟可以发出叫声,但狗不能飞行,鸟也不能像狗一样叫唤,这样通用接口中就不应该包含“叫声”和“飞行”这两种方法,因为不是所有的动物都需要这些方法。
依赖反转原则(Dependency Inversion Principle)
高层模块不应该依赖于底层模块,它们都应该依赖于抽象。抽象不应该依赖于具体实现。具体实现应该依赖于抽象。
示例:
假设我们需要一个记录日志的服务。我们可以创建一个logger类,并在其它类的构造函数中实例化这个类。但是这将导致这些类依赖于logger类的具体实现。相反,我们可以定义一个抽象的logger接口,并将这个接口注入到依赖它的类中,这样实现了高层模块不依赖于底层实现的依赖反转。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++ 面向对象设计五大原则 - Python技术站