在我的上一篇文章中,详细介绍了我的一个实践经验。当初写完之后感觉意犹未尽,总觉得缺少点什么,后来想想缺少理论知识的说明,今天就来补上这一部分的知识。
概念
面向协议编程(Protocol Oriented Programming,简称POP),是一种目前流行的编程范式,它主要通过协议来定义接口(接口可以理解为模块间通讯的口子,这就明显区别于面向对象编程范式,面向对象编程是通过继承来实现代码的可复用和可扩展的)。这种编程范式在Swift中广泛应用,通过提供一种面向协议的开发方式,使得代码具有可复用性和可扩展性。
历史过程
面向协议编程的概念在软件开发领域中已有一段时间。最早的面向协议编程概念出现于20世纪70年代的Smalltalk语言中,它提倡通过消息传递而不是继承来进行代码复用。后来,这个概念被一些其他编程语言所借鉴,并发展出了不同的编程模型和范式。在Swift语言中,面向协议编程得到了特别的重视和支持,成为了一种重要的开发模式。
与面向对象编程的区别和联系
面向协议编程是与面向对象编程相对的一种编程范式。在面向对象编程中,继承是主要的代码复用机制,通过继承一个父类来获得其属性和方法。而面向协议编程更加注重对象之间的交互和协作,通过定义和实现接口协议来实现代码复用和灵活性。这种方式可以让不同类型的对象之间互相通信和交互,更加灵活和解耦。
正如我的上文实例举例:使用面向对象编程,需要一层层地继承父类,最终得到一个得到一个拥有父类特性(接口功能)的子类。代价就是代码量超多。而使用面向协议编程。定义和实现接口协议,子类就可以自由的组合不同的协议。避免了一层层的传递,增加的代码的灵活性。
前面说了很多面向协议的好处,作者并不是说面向协议编程可以替换面向对象编程了。其实两种编程范式相辅相成、相互独立、又共存的。正如讨论架构中的设计模式一样,设计模式也是共存的。如在某个模式是MVC,而在另一个模块就是MVVM。如果一定要说出一份代码中,是使用哪种编程范式的,那就看这代码主要是以什么范式为主了。
面向协议编程的优点
首先,它强调代码的复用和灵活性,通过协议定义接口,不关心具体的实现细节,可以在不同的对象之间共享和复用代码,提高代码的可维护性和可扩展性。
其次,面向协议编程可以实现多态性,即一个对象可以遵循多个协议,使得对象能够适应不同的使用场景和需求。
此外,面向协议编程还能更好地支持单元测试,因为可以轻松地模拟对象,并进行接口测试。
在我的实际项目中,对优点1,优点2有深刻的体会。确实在代码复用和接口的灵活组合上很方便。面向协议的缺点就不说了,首先得承认每一个编程范式都有优缺点,而本文是鼓励使用面向协议编程,所以就有所取舍了。
最后补充下:本文不是系统地介绍面向协议编程的理论知识。若对此知识有兴趣,可以参考下面的链接:
https://toutiao.io/posts/t9pd6x/preview
https://www.ngui.cc/el/1347148.html?action=onClick
有兴趣,可以关注程序员华仔