📜  面向对象编程 (OOP) 的最佳实践

📅  最后修改于: 2021-09-10 02:50:33             🧑  作者: Mango

顾名思义,面向对象的编程或 OOP 是指在编程中使用对象的语言。面向对象编程旨在在编程中实现诸如继承、抽象、多态和封装等现实世界的实体。 OOP 的主要目的是将数据和对它们进行操作的函数绑定在一起,这样除了该函数之外,代码的其他部分不能访问这些数据。在本文中,我们将了解 OOP 的一些最佳实践。

SOLID 首字母缩写词被认为是最好的面向对象编程哲学。让我们了解这实际上意味着什么以及其他一些重要原则。

  1. 单一职责原则:根据这个原则,一个类应该只有单一职责或单一工作或单一目的。我们应该严格避免使用在同一个类中给出整个实现的通用类。它还指出责任应该完全由类、模块或函数封装。
  2. 开放/封闭原则:根据这一原则,类、模块、函数等软件实体应该对扩展开放,类应该对修改关闭。这意味着我们应该能够扩展类行为,而无需修改它。
  3. Liskov 替换原则:根据此原则,派生类或子类必须可替换其基类或父类。该原则确保作为父类的子类的任何类都可以代替其父类使用,而不会出现任何意外行为。
  4. 接口隔离原则:这是适用于接口的第一个原则。它类似于单一职责原则。它指出我们不应该强迫任何客户端实现与他们无关的接口。这个概念的主要目标是专注于避免胖接口并优先考虑许多特定于客户端的小型接口。
  5. 依赖倒置原则:根据这个原则,高级模块/类不应该依赖于低级模块/类,而应该依赖于抽象。我们还需要确保抽象不应该依赖于细节,而细节应该依赖于抽象。

除了上述原则外,在面向对象编程中还需要练习的其他一些重要实践是:
1.有意义的名字:在OOP的概念中需要遵循的第一个实践是使用有意义的名字。而且,所有方法都必须遵循驼峰命名约定。我们应该始终以这样一种方式进行设计,即一个类只负责一项特定的任务。如果项目中存在一个执行多个任务的类,则应进一步划分,使其仅承担一个责任。然而,当我们使用面向对象的设计原则时,职责是预定义的。例如,

  • 在构建器模式中,类创建对象。因此,我们使用名称作为构建器类。
  • 如果一个类充当两个功能之间的中介,则将其命名为中介。像 CatMediator、DogMediator 等。
  • 如果我们使用消费者类型的设计,那么我们可以使用Adapter后缀来解释类的职责。

2. 更少的参数:我们总是需要以参数数量尽可能少的方式编写方法。我们总是可以使用来自同一类中其他对象的值,而不是多次询问用户相同的输入。而且,参数过多的方法难以阅读。

3. 避免全局和非确定性行为:每当我们使用 OOP 概念时,我们总是需要确保变量和对象的全局行为被最小化。这可以通过创建动物猎豹的示例进行可视化。动物的颜色在创建后不会改变。因此,我们需要确保该属性不是全局的且不可访问,以确保不会发生数据冲突。因此,需要避免使用全局变量或对象。我们可以使用数据成员上的封装概念来解决这个问题。

4. 避免静态方法:除上述原因外,还必须尽可能避免静态方法,因为它们的作用几乎与全局变量类似。而且,另一个需要避免的重要原因是它们与创建它的类创建了一个秘密依赖项,并且在更改类的整个结构之前不会观察和显示依赖项。这使得可维护性变得更加困难。而且,不能单独测试静态方法。

5. 避免使用构造函数:必须严格避免使用构造函数,因为从客户端的角度来看,它们使程序的可用性变得困难。为了使用由构造函数调用的程序,客户端需要记住参数的顺序,如果忘记了正确的顺序,则无法进行对象初始化。在构造函数需要多个参数的情况下,程序的可用性变得更加困难。一种替代解决方案是构建器模式。

6. 减少条件语句:必须尽可能减少条件语句的使用。在程序中使用过多的条件语句会增加复杂性,并且代码无法重用。相反,我们可以利用接口和抽象类,在可以重用的不同方法中实现条件逻辑,并且保持方法和类的单一职责。无论何时需要重用相同的条件,我们只需调用实现它的方法,而不是再次编写代码。

总而言之,不同的程序和软件中使用的做法可能不同,主要倾向于最终结果,但上述做法是其中一些普遍遵循的做法,它使程序更加高效、可读、可重用和易于使用维持。