iOS 中常见的五种编程模式:
-
链式编程
- 函数式编程(Functional Programming FP)
- 面向对象编程(Object Oriented Programming OOP)
- 面向切面编程(Aspect Oriented Programming AOP)
- 响应式编程(Reactive Programming RP)
面向对象编程
相对于面向过程编程,世间万物皆“对象”,特点是继承,多态与封装。
其中多态是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(允许将子类类型的指针赋值给父类类型的指针)
这在OC中都可实现,所以OC是面向对象的语言, 而在OC中只支持单一继承,若要实现多继承,需要使用代理模式。
面向切面编程
面向切面编程是对面向对象的补充,就是在运行时动态的将代码切入到类的指定方法、指定位置上的编程方式(在不改变原有类的结构,来动态的为类添加代码片段)
而OC作为动态语言,在运行时才会查找所需要的执行方法。声明通过不会报错,比如未初始化变量,未分配内存,不会报错。编译会通过,当运行时,调用变量的方法,会崩溃(这也说明了OC在运行期才检查对象的内存管理情况)
所以我们可以利用OC中的Runtime的方法交换来实现AOP编程(关联对象与Method Swizzing)
链式编程
链式编程将多个方法用点语法链接起来,让代码更加简洁, 可读性更强。原理是调用者的属性或者方法反回的是对象本身。这也是第三方库Masonry使用的编程方式(对象的方法或者属性返回值是Block,而Block的返回值是对象本身,这样就可以通过点语法无限调用函数)
函数式编程
函数式编程面向数学的抽象,将计算描述为一种表达式求值,一句话,函数式程序就是一个表达式,属于“结构化编程”的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。函数式编程通常与命令式编程相对立,命令式编程注重于逻辑过程,而函数式编程完全是函数或函数的组合(函数式编程关心数据的映射,命令式编程关心解决问题的步骤)
在函数式编程中,函数是“一等公民”,拥有闭包和高阶函数,惰性计算,递归的特性。
如我们要计算两个数的和与差:
swift写法:
func sum(a:Int, b:Int) -> Int {
return a + b
}
func sub(a:Int, b:Int) -> Int {
return a - b
}
sum(a,b),sub(a,b)
即可
那么用函数式编程的思想:
func operation(additon:(Int, Int) -> Int, a:Int,b:Int) -> Int {
return additon(a,b)
}
operation(additon: sum, a: 6, b: 6)
operation(additon: sub, a: 6, b: 6)
这是高阶函数的特性,体现了把运算过程尽量写成一系列嵌套的函数调用的思想
OC中的写法:
- (int)sumOfa:(int)a b:(int)b{
return a + b;
}
- (int)subOfa:(int)a b:(int)b{
return a - b;
}
[self sumOfa:6 b:6],[self subOfa:6 b:6];
即可
那么用函数式编程的思想:
- (int)anotherOfa:(int)a b:(int)b block:(int(^)(int a,int b))block{
return block(a,b);
}
__weak typeof(self) weakself = self;
[self anotherOfa:10 b:20 block:^int(int a, int b) {
return [weakself sumOfa:a b:b];
}];
[self anotherOfa:10 b:20 block:^int(int a, int b) {
return [weakself subOfa:a b:b];
}];
这里会出现循环引用因为self持有block,block中又引用self需要弱化self
响应式编程
响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。
响应式它是依赖于事件的,响应式的代码它的运行不是按代码的顺序,而是跟多个按时间发生的事件有关。依赖的事件本质就是Block,但在响应式编程里,这些按时间排列的事件,被称为“流”
在iOS中第三方ReactiveCocoa框架通过函数式编程的方式来实现响应式的编程,ReactiveCocoa通过创建信号,订阅信号,发送信号完成“流”,也就是使用大量的block通过函数之间的回调,实现响应。
总结
可以看出不论是响应式编程,函数式编程,链式编程还是面向切面试编程基础都为面向对象的编程,其中链式编程,响应式编程更多依赖于回调闭包的方式,函数式编程更多依赖于函数之间的调用,但不完全是依赖回调闭包(如递归),这些设计模式在开发中极为常见,学习了解这些思想在实际运用中灵活使用这些编程模式并与设计模式相互配合,将会事半功倍!