面向对象的设计和面向协议的设计都使用了多态让我们使用同样的接口来跟不同的类型进行交互。在面向对象的设计中,我们使用了基类提供的接口来跟所有的子类进行交互。在面向协议的设计中,我们使用了协议和协议扩展提供的接口来跟遵守该协议的类型进行交互。

两种设计方式写出的代码都很好而且易懂。但个人感觉协议/协议扩展代码更好,因为协议/协议扩展的方法整体更干净和易懂些。

当我们谈到面向协议编程的时候应该从协议开始构思而不是从基类开始。然后我们可以使用协议扩展来为遵守该协议的类型添加功能,而对于面向对象编程,我们还得从基类开始。

在面向协议设计中我们更多的使用了值类型(结构体struct)而非引用类型(类class)。Apple已经说了我们应该在合适的地方尽可能地偏好使用值类型而非引用类型。
【struct与class的区别会在下一篇博客中讲到】

协议/协议扩展相比基类有 3 个优点:

第一个优点是类型可以遵守多个协议而只能拥有一个基类。这意味着我们可以创建很多个协议以添加每个特定的功能而不是把所有功能都写到一个巨大的类中。例如,使用一个的 People 协议,我们还能创建包含特定需求和功能的 Teacher、Fireman、和 Doctor 协议。然后,English Teacher 和 Surgery Doctor 类型会遵守 People、Teacher 和 Doctor 协议。使用基类, 我们需要把定义在 People、Teacher 和 Doctor 协议中的功能组合到单个巨大的超类中。这种类如果足够庞大也常被称为上帝类,容易造成遍地bugs的后果,耦合度太高。

第二个优点是我们不需要源代码就可以使用协议扩展来添加功能。这意味着我们可以扩展任何协议,即使是 Swift 自己内建的协议也能扩展。而给超类添加功能我们需要知道源代码。我们可以使用扩展给超类添加功能,这意味着所有的子类会继承那个功能。然而,我们一般使用扩展来为特定的类添加功能而非为类的层级添加功能。

第三个优点是协议可以被类、结构体和枚举遵守,而类层级被约束为类类型。协议/协议扩展让我们可以在尽可能合理的地方使用值类型

面向协议编程的例子更易懂而且更安全。在面向对象编程的例子中,所有的属性都定义在基类中。我们需要查看基类的代码或文档来看看基类中定义了哪些属性,并且这些属性是怎么定义的。使用协议,我们也需要查看协议自身或协议的文档来查看要实现的属性,但是实现是在类型自身中做的。这允许我们在类型自身中查看所实现的所有东西而不需要来回查看超类的代码,或者穿梭于类的层级来查看东西是怎么实现和初始化的。

子类中的构造函数也必须调用基类的构造函数以确保基类的所有属性都被合理地设置了。虽然这的确保证了子类之间初始化的一致性,但是它也隐藏了类是如何初始化的。在面向协议的例子中,所有的初始化都是在类型自身中完成的。因此,我们不需要在类的层级之间来回穿梭以查看所有东西是如何初始化的。

Swift 中的基类提供了我们要求的实现。Swift中的协议仅仅是一个约定,任何遵守给定协议的类型必须填充协议指定的需求。因此,使用协议,所有的属性、方法和构造函数都被定义在遵守协议的类型自身中。这让我们很容易地查看到所有东西是怎么被定义和初始化的。

很明显面向协议的目的是为了降低代码的耦合性。 比如说几个类有一些共同点,那么以前我可能会让他们继承同一个父类,再这个父类中去实现他们共同的部分,但是实际的事物往往是一系列特质的组合,而不单单是以一脉相承并逐渐扩展的方式构建的。以后慢慢会发现面向对象很多时候其实不能很好地对事物进行抽象,我们可能需要寻找另一种更好的方式。

1.代码清晰,便于维护和阅读
2.组件化模块化,降低类之间的耦合
3.代码规范化,面向协议的代码几乎如同写了readme一般,他把一些类通过协议归纳到一块,各个类却又是相互独立的。对于大型项目价值很大。

总而言之,面向协议相对于面向对象来说更具有可伸缩性和可重用性,并且在编程的过程中更加模块化,通过协议以及协议扩展替代一个庞大的基类,这在大规模系统编程中会有很大的便捷之处。

面向协议与面向对象的区别相关推荐

  1. 面向过程、面向函数、面向对象的区别浅谈

    Python的面向过程.面向函数.面向对象的区别浅谈 转自--猎奇古今,加上其他 有人之前私信问我,python编程有面向过程.面向函数.面向对象三种,那么他们区别在哪呢? 面向过程就是将编程当成是做 ...

  2. JAVA入门级教学之(面向过程和面向对象的区别)

    目录 JAVA入门级教学之(面向过程和面向对象的区别) 面向过程和面向对象的区别: -面向过程: -面向对象: -发展历程: -生命周期中包括: -什么是类: -什么是对象: -软件开发的过程: -重 ...

  3. 简单抽象的去理解 面向过程和面向对象 的区别

    面向过程和面向对象的区别 兴趣所致录 面向过程 场景:你是一条不折不扣的单身狗,然后还想吃苹果[手动滑稽狗头] 首先吃苹果得有苹果,所以得去买苹果,然后洗苹果, 如果焦作一下不想吃皮,你得先削皮, 要 ...

  4. 面向过程和面向对象的区别及优缺点

    面向过程和面向对象的区别及优缺点 面向过程: 面向过程是一种自顶向下的编程. 面向过程优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机.嵌入式开发. Linux/U ...

  5. 你真的知道面向过程和面向对象的区别吗?

    在面试时经常会被问到面向过程和面向对象有什么区别,虽然都是编程的一种思想,但是他们的侧重点不同,我们从以下几个方面进行简单总结. 1. 面向过程 面向过程是一种以事件为中心的编程思想,编程的时候把解决 ...

  6. 什么是面向对象、面向过程与面向对象的区别

    要讲区别,首先我们得先来弄弄清楚什么是面向过程,什么是面向对象. 面向过程是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了. 比如把大象放进冰箱,第一 ...

  7. php面向过程和面向对象的区别

    PHP语言是同时可以应用面向过程和面向对象方式的编程,面向过程与面向对象在许多编程语言中只能使用二者之一来进行编程,但是PHP语言与其他编程语言有不同之处,那就是我们可以自由的选择某种编程方式,或者将 ...

  8. 面向过程与面向对象的区别

    一.区别简述 面向过程(Procedure Oriented):以过程为核心,强调事件的流程.顺序,如:C语言. 面向对象(Object Oriented):以对象为核心,强调事件的角色.主体,如:C ...

  9. Python 面向对象编程(一) —— 面向过程和面向对象的区别

    [无限嚣张(菜菜)]:hello您好,我是菜菜,很高兴您能来访我的博客,我是一名爱好编程学习研究的菜菜,每天分享自己的学习,想法,博客来源与自己的学习项目以及编程中遇到问题的总结. 座右铭:尽人事,听 ...

最新文章

  1. 努力学习 HTML5 (2)—— 元素的增和删
  2. css hack 学习总结
  3. 我犯了一个错误,您能指出吗?
  4. 基于nanopi的即时通讯系统
  5. 阻击恶意软件--清除和保护你的网站的小技巧
  6. 面试官问:能否模拟实现JS的new操作符(高频考点)
  7. iphone双卡双待机型_运营商确认苹果将通过软件更新来让iPhone 12支持双卡5G!
  8. [转]ng-grid
  9. 使用SVN的导出功能,( 目的 : 使导出的文件目录中,不带有svn相关的文件 )
  10. 禁止拖放对象文本被选择的方法
  11. 安全分析:叫好不叫座
  12. 《红周刊》独家对话芒格:你可以随自己喜欢一辈子不理性,那必然承受糟糕结果
  13. mmap 文件不能为空
  14. 10分钟教你从零开始python_10分钟教你从零开始学python入门
  15. JSP内置对象response常见用法
  16. C++之我见--delete指针
  17. 在线JSON转TSV工具
  18. FITC cy3/cy5荧光标记达卡巴嗪/托瑞米芬/盐酸阿霉素/替莫唑胺等药物 FITC-DTIC
  19. 【Matlab图像去噪】改进非局部均值红外图像混合噪声【含源码 1640期】
  20. WIN7,让光驱走开

热门文章

  1. python 爬取数据intraday_使用Python检索Fitbit心率数据
  2. 系分 - 案例分析 - 系统维护与设计模式
  3. 2022T电梯修理考试题库及答案
  4. 群晖nas安装python_为群晖DSM安装python的easy_install
  5. C19 the silver doe 银鹿
  6. XMind Zen 2020 10.3.1注册使用
  7. 曾经无数人在巴黎圣母院里祈祷, 如今轮到人们为她祈祷了…
  8. 资深数据科学家教你如何在求职过程中找到心仪工作
  9. java调用.sh文件_java 调用cmd/sh文件
  10. 网页下拉框智能诱导输入