在软件开发中,面向对象设计在编写灵活、可扩展、可维护和可重用的代码方面起着至关重要的作用。使用 OOD 有很多好处,但每个开发人员还应该了解 SOLID 原则,以便在编程中进行良好的面向对象设计。 SOLID 原理是由Robert C. Martin (也称为Uncle Bob )引入的,它是编程中的一种编码标准。该原则是以下五个原则的首字母缩写词……
- 单一职责原则 (SRP)
- 开闭原则
- Liskov 替换原则 (LSP)
- 接口隔离原则 (ISP)
- 依赖倒置原则 (DIP)
SOLID 原则有助于减少紧耦合。紧耦合意味着一组类高度依赖于彼此,您应该在代码中避免这种情况。与紧耦合相反的是松散耦合,当您的代码具有松散耦合的类时,它被认为是好的代码。松散耦合的类可以最大限度地减少代码中的更改,有助于使代码更可重用、可维护、灵活和稳定。现在让我们一一讨论这些原则……
1.单一职责原则:该原则指出“一个类应该只有一个改变的理由”,这意味着每个类应该有一个职责或单一的工作或单一的目的。以开发软件为例。任务分为不同的成员做不同的事情,前端设计师做设计,测试员做测试,后端开发人员负责后端开发部分,可以说每个人都有一个工作或责任。
大多数情况下,当程序员必须添加功能或新行为时,他们将所有内容都实现到现有类中,这是完全错误的。这使得他们的代码冗长、复杂,并且在以后需要修改某些内容时会消耗时间。在您的应用程序中使用层并将 God 类分解为更小的类或模块。
2. 开放/封闭原则:该原则指出“软件实体(类、模块、函数等)应该对扩展开放,对修改关闭”,这意味着你应该能够扩展一个类的行为,而不需要修改它.
假设开发人员 A 需要发布库或框架的更新,而开发人员 B 想要对其进行一些修改或添加一些功能,则允许开发人员 B 扩展开发人员 A 创建的现有类,但开发人员 B 不应直接修改该类.使用此原则将现有代码与修改后的代码分开,从而提供更好的稳定性、可维护性并最大限度地减少代码中的更改。
3. Liskov 替换原则:该原则由 Barbara Liskov 于 1987 年提出,根据该原则“派生类或子类必须可替换其基类或父类”。该原则确保作为父类的子类的任何类都可以代替其父类使用,而不会出现任何意外行为。
你可以这样理解,农民的儿子应该继承父亲的农艺,必要时可以代替父亲。如果儿子想成为农民,那么他可以取代他的父亲,但如果他想成为一名板球运动员,那么即使他们都属于同一个家庭等级,儿子也绝对不能取代他的父亲。
该原理的经典示例之一是具有四个边的矩形。矩形的高度可以是任何值,宽度可以是任何值。正方形是宽度和高度相等的矩形。所以我们可以说我们可以将矩形类的属性扩展为方形类。为了做到这一点,您需要将子(正方形)类与父(矩形)类交换以适应具有四个相等边的正方形的定义,但派生类不会影响父类的行为,因此如果您愿意这将违反里氏替换原则。查看链接 Liskov Substitution Principle 以获得更好的理解。
4.接口隔离原则:该原则是第一个适用于接口而不是SOLID中的类的原则,类似于单一职责原则。它指出“不要强迫任何客户端实现与他们无关的接口”。在这里,您的主要目标是专注于避免胖接口,并优先考虑许多特定于客户端的小型接口。您应该更喜欢多个客户端接口而不是一个通用接口,并且每个接口都应该有特定的职责。
假设您进入一家餐厅并且您是纯素食者。那家餐厅的服务员给了你一张菜单卡,里面有素食、非素食、饮料和糖果。在这种情况下,作为客户,您应该有一张菜单卡,其中只包含素食项目,而不是您在食物中不吃的所有东西。这里的菜单对于不同类型的客户应该是不同的。每个人的通用或通用菜单卡可以分为多张卡而不是一张。使用此原则有助于减少所需更改的副作用和频率。
5.依赖倒置原则:在我们讨论这个话题之前,请记住依赖倒置和依赖注入都是不同的概念。大多数人对此感到困惑,并认为两者是相同的。现在有两个关键点要记住这个原则
- 高级模块/类不应依赖于低级模块/类。两者都应该依赖于抽象。
- 抽象不应该依赖于细节。细节应该取决于抽象。
上面几行简单地说,如果高级模块或类将更多地依赖于低级模块或类,那么您的代码将具有紧密耦合,如果您尝试对一个类进行更改,则可能会破坏另一个有风险的类在生产层面。所以总是尽量让类松散耦合,你可以通过抽象来实现这一点。该原则的主要动机是解耦依赖关系,因此如果类 A 发生更改,则类 B 不需要关心或了解更改。
您可以考虑电视遥控器电池的真实示例。您的遥控器需要一块电池,但这与电池品牌无关。你可以使用任何你想要的 XYZ 品牌,它会起作用。所以我们可以说电视遥控器与品牌名称松散耦合。依赖倒置使您的代码更可重用。