本文是我在团队内部分享的ppt中摘出来的,因此可能节奏有点快。算法
而且充满了误解编程
从电视剧的最后一集开始看,因此看不懂设计模式
最初的语言充满了goto,goto是强大的,可是代价是巨大的 架构
直到有人提出结构化编程,来限制goto的权力 编程语言
可是结构化编程只解决了函数执行的复杂度,而数据仍是乱的不行 这促使一个新的理念诞生了:Object-Oriented Programming 函数
面向对象有三个特性解决过去混乱不堪的数据存放,也被称为OOP三原则:学习
数据抽象 Abstraction
数据封装提供了一个信息隐藏的机制,让一个类黑盒化,这种设计减小了人们理解一块代码的难度。spa
继承 Inheritance
继承提供了共享代码的方式,不一样于另外一个世界线的原型链。 设计
多态性 Polymorphism
多态提供了针对父类的算法能够直接应用到子类上。3d
过去的数据存放虽然混乱,可是很是灵活,OOP则对这种能力加以限制(如同控制流对goto的限制)
简单和灵活的辩证关系
OOP在蓬勃发展以后,出现了两个分支,单一继承和多继承。前者表明是JAVA,后者是C++。 多继承首先暴露出很严重的问题:著名的The Diamond Problem
其次,多继承会让你的代码结构混乱不堪
单一继承虽然避免了这个问题,可是他引发另外一个问题:不够用!从多个类共享代码是一个钢需!
通常的单一继承语言只好选择组合(composition),可是组合引发没必要要的层级和依赖。主要是用起来很麻烦。
因此Java在第8版的时候选择一条少有人走的路,Mix-in范式,Java里叫接口扩展(interface extension)。
Mix-in也是比较古老的范式,它是被近代的Ruby(1995)发扬光大。
Mix-in的解决思路是:既然多继承很差,可是想共享代码,那么就用重重约束容许某种受限的多继承存在。
因而简单和自由的取舍又出现了
Mix-in通常分为traits和接口扩展两个流派,Ruby选择是前者,而Java选择增强他原本就有的pure interface,让接口能够提供默认的方法实现,来完成和traits同样的功能性。(这一点和Swift的发展路线是一致的)
实现Mix-in只须要这一个小小的改动,可是对整个软件设计模式都产生了深远影响。
由于Mix-in提供了功能实现,这些代码就能够当作一种组件,组合到任意的类里,从而实现了相似多继承的代码复用。
软件架构再也不是一尘不变的继承+类组合,今后有了新的样貌:
Swift的POP就是Mix-in -> Java interface extension的延续,只不过改了名字叫protocol extension。
那充其量也就是Java的那种样貌,怎么能上升到Oriented的程度?
答案都在Swift的源码中。
咱们来看一下Swift对Int的实现
你没看错,除了Int本人是一个struct(甚至不是class)其它全都是Protocol! 谁还敢说不是Protocol-Oriented
Mix-in既然已经被证明是OOP的一个好的发展方向,Swift不但选择引入Mix-in,而且把它提升到核心教义,而且用这个思想搭建起Swift语言自己。
能够说Swift不是Java那样以为Mix-in是OOP的补充,而是试图证实Mix-in能够代替Class Inheritance成为优选的范式。
连名字都改了不是吗,OOP都不要了。
POP是Swift提出的一个全新理念
不是,他是古老的Mix-in,而且是被不少现代语言应用。
POP就是狂用Protocol
不是,重点在于继承架构是不是围绕Protocol设计的。
POP站在OOP的鄙视链上游
POP自己就是OOP的演化,只是在OOP(99%)的基础上又迈进了一小步(1%)。
经过Swift源码结构能够看出一个POP的软件产生了大量的组件
具体类型(class/struct/enum)用来组合各类组件
甚至核心逻辑也是某一级的Protocol来组合,而具体类型只是一个能new出来的门面。
软件设计的重心再也不是建模对象,而是划分能力。
父类和协议是OOP能提供的最高级抽象。他们是类的元类型。
POP提倡的就是在更高抽象层级上编程。
毕竟,越远离goto,代码就越简单。