文章目录
  1. 1.
  2. 2. 何为面向协议?
    1. 2.1. 编程范式
  3. 3. 简单认识面向协议
  4. 4. 面向对象与面向协议的差异
  5. 5. 怎样使用?

使用Swift的开发者可能都在讨论面向协议开发,为什么会使用这种开发模式,与我们之前所了解的面向对象的概念会有何区别。

何为面向协议?

面向协议编程 (Protocol Oriented Programming,以下简称 POP),是苹果提出的Swift的一种编程范式。

编程范式

是一类典型的编程风格,是指从事软件工程的一类典型的风格(可以对照方法学)。如:函数式编程、程序编程、面向对象编程、指令式编程等等为不同的编程范型。编程范型提供了(同时决定了)程序员对程序执行的看法。简单来说就是统一编程的价值观,以及编程方法。
例如,在面向对象编程中,程序员认为程序是一系列相互作用的对象,而在函数式编程中一个程序会被看作是一个无状态的函数计算的序列。面向协议也是一种编程范式,将程序看作依赖各个协议需要遵循的事情。

简单认识面向协议

从字面上来看用协议来编程,在我觉得和面向接口编程是类似的,将面向对象的思想抽离出来,转换成面向更高级的接口。Swift将这种编程思想运用了很巧妙的方式去做,其中Swift自身的标准库也是基于Protocol,绝大多类型都是满足各个Protocol。
一个比较常见的错误类型的协议

1
2
3
4
5
public protocol Error {
}

extension Error {
}

面向对象与面向协议的差异

用面向对象的编程思想来设计下面的业务场景,有飞机,汽车,自行车三种交通工具,它们都有出行的功能,并且有各自的出行费用,但是在古时候或者大草原上,马也有出行的功能,并且有它的费用价格,可是马又不属于交通工具。

马也需要有代步的功能,但在面向对象的世界中,必须要继承交通工具才能实现代步。这有一定的局限性,如何的更好的抽离代步功能,如同Java中实现的接口的方式,将代步方法抽离。面向协议就是这样的抽离方式,更好的划分职责,更加具像化,职责单一,在定义协议的时候,需要明确协议的职责。

在面向协议的编程中可以这样定义:

怎样使用?

Swift中绝大多数定义协议的命名方式是以able作为结尾,或者ible。我们需要为每个协议定义它的职责范围。比如以下定义(Requestable)