协议与面向对象编程的介绍指南

本篇文章的目的是比较面向对象的编程和方例化编程之间的一些差异,同时使用这两种方法建模相同的功能。自20世纪70年代以来,面向对象的编程已经存在,而面向协议的编程在过去几年中只有流行,即使协议/接口已经存在一段时间。这篇文章的目标不是在架构之间选择一个胜利者,而是试图帮助您选择您正在努力的项目类型的最佳解决方案。

面向对象编程

Object-oriented programming is a paradigm based on the concept of an “object”, which in most programming languages is defined by a data structure (e.g. Class) that contains information about attributes in the form of properties, and the actions performed by or to an object in the form of methods. This paradigm allows us to encapsulate the properties and actions of an object into a single type, the entity we are trying to represent in our code.

让我们创建一个基本的类图,展示我们如何为面向对象设计设计动物类层次结构。

该图表明我们有一个名为一类名为的超级类动物和三个子类鸟,,它将继承超类的所有内部和公共属性和方法。

让我们假设我们正在开发一个Tamagotchi.我们可以使用以下要求创建动物的游戏类型:

  • 我们有三种不同的动物类别(陆地、空气和水)。
  • 动物可以是多个类别的成员。

让我们开始对面向对象的设计:

  • 创造一个alimalenvironment.用来确定动物可以生存的地方的枚举。
  • 创造一个动物超类,它将包含所有动物的属性。前三个属性是一系列alimalenvironment.,动物的名字和年龄。其他三个属性将包含每种动物可能出现的环境的速度。
  • 创造方法,前三种方法将用于使我们的动物锻炼和烧一些卡路里,另外三种是让我们知道动物可以做些什么。

现在,让我们看看如何子类化动物类,通过创建,类定义在我们的图中。

猫,鸟和鱼类是类的子类动物类,我们通过为每个初始化程序创建初始化来开始这些类。为了子类,例如,我们指定动物的环境是.land,空速沃特迈斯泊尔由于一只猫无法在这些环境中存活。我们还覆盖属于每只动物的功能并增加其实现。

正如您所看到的,来自超类的所有信息都暴露给子类,尽管不是所有子类都需要所有超类信息。很容易想象这样一种场景:越来越多的代码开始添加到超类中,而它变得越来越难维护。即使是最有经验的开发人员,也很容易在数组中输入错误的值或速度属性导致意外的行为。

好处

  • 通过继承的代码可重用性。
  • 多态性灵活性。
  • 封装。

缺点

  • Swift是一种单一的继承语言,我们只能为动物类拥有一个超级类,所以超类需要包含三个类别中的每一个所需的代码。
  • 遗传功能不需要的功能。它可以导致臃肿的超类,因为我们可能需要包括只有少数子类所需的功能。
  • 我们不能在超类中创建可以由子类设置的常量。
  • 在Swift中,值类型不能使用继承,只能使用引用类型。
  • 打破的机会太阳能发电(利斯科夫替代原则)如果设计不好。

协议方向编程

正如我们在面向对象的设计中所做的那样,让我们创建一个图表,展示如何以面向协议的方式设计动物类型。

正如我们所看到的,面向协议的设计关注于实现一个关注需求而不是面向对象设计中所设计的细节的协议。这是一个很好的例子ISP.(接口隔离原则),其中客户端不需要知道他们不使用的属性和方法,并且(依赖倒置原则),即设计依赖于抽象而不是具体。

让我们开始通过以下方式进行协议的设计:

  • 创造一个动物包含其他协议可以利用的共享需求的协议。
  • 创造A.Landanimal,Airanimal和Wateranimal协议,所有人都会继承动物协议并为每个协议添加速度属性。

该图表向我们展示了协议中使用的两种技术:

协议继承:当协议可以从一个或多个协议继承这些要求时。这类似于面向对象编程中的类继承,而不是继承功能,它继承了要求。

协议构成:它允许类型符合多个协议,我们可以看到发生这种情况结构。这在面向对象编程中也是可以实现的,在面向对象编程中,一个类可以有一个或没有继承,但要遵循多个协议。

重要的是要注意任何符合动物的协议,或符合从动物协议,将自动访问属性和方法。

现在,让我们来看看我们如何实施,在我们的图表中定义的结构。正如我们所看到的,面向协议的设计只公开每个动物的必要需求,这是分离关注点的一个很好的例子。此外,也不需要创建自定义初始化器,因为这里我们使用的是塑造而不是

我们还实现缺少的方法canRuncanFly,canSwim正如我们在面向对象的设计中,但这一次让我们延伸动物协议提供给我们为所有符合类型提供公共实现的能力的方法。

注意,在Swift中,我们使用关键字,以检查实例是否属于特定类型作为将实例视为特定类型的关键字。正如你所看到的,我们的结构可以访问所有的方法。

面向对象和协议的设计都为我们提供了使用多态性的能力,这是多种类型的单个接口。让我们看看它在两个设计中的样子。

正如您所看到的,在面向对象的设计中,使用多态性的工作看起来完全相同动物超类是否在面向协议的设计中动物是一个协议。

好处

  • 面向协议的设计允许我们处理类、结构和枚举。
  • 我们可以使用协议扩展向符合协议的类型添加功能。
  • 能够将任何属性定义为常量。
  • 协议组合允许数据结构实现多个需求。
  • 当与泛型结合时,协议变得非常强大。
  • 清洁代码。
  • 更容易发现错误。

缺点

  • 滥用协议继承和协议扩展可能导致复杂的系统。

结论

正如您所见,我们能够使用标准(面向对象编程和面向协议的编程)来实现相同的目标。在一天结束时,正确地设计您的体系结构是为您提供一个稳固稳定的系统,独立于您选择使用的方法。尝试收集您将在纸上设计的项目的所有要求,在纸上设计它,然后考虑范例将适合您更好。

最初出版https://tech.188bet金宝搏官网okcupid.com.2020年10月30日。

188bet金宝搏官网Okcupid Tech Blog.

阅读来自OkCupid工程团队的故事,每天连188bet金宝搏官网接着数百万人

188bet金宝搏官网Okcupid Tech Blog.

188bet金宝搏官网Okcupid的工程团队负责每天匹配数百万人。阅读Okcupid Tech Blog上的故事188bet金宝搏官网

188bet金宝搏官网Okcupid Tech Blog.

188bet金宝搏官网Okcupid的工程团队负责每天匹配数百万人。阅读Okcupid Tech Blog上的故事188bet金宝搏官网