在网上看了很多关于编程思想的博客,感觉有的和我的理解不太一样,这里写下我对几种编程思想的理解,同时对链式编程进行代码分析及demo练习。
目录
一、定义
链式编程:我的理解为链式编程是一种表现方式为“.”+“()”并能够一直使用“.”连续的链式的进行开发的一种“语法”,其表现方式是由点语法和block来实现的,通过block传对应的参数并返回本身来实现连续调用。
响应式:响应式编程主要表现为监听改变,即代码的执行不是按代码的书写顺序,而是按响应的顺序,所以数据变化的结果才是最重要的,这点可以参考KVO。
函数式:我的理解函数式编程是一种封装,而且这种封装是完全独立的不受影响的,也就是函数式的特点是不依赖外部状态,不改变外部状态,完全解耦完全静态的。就像我们进行1+1的操作,这个“+”可以理解为一种封装,“+”方法通过代码实现了“+”逻辑,我们只需要使用就可以,外部数据不会影响“+”方法,“+”方法也不会影响外部数据。
在实际开发中各种编程思想交叉使用,并不会完全用一种方法开发,所以不需要太过纠结到底是什么编程方式,有自己的理解就可以。
二、关于Masonry
Masonry是典型的链式编程+函数式编程写法
[redView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.top.equalTo(@(100));
make.right.bottom.equalTo(@(-100));
}];
可以看到 mas_makeConstraints 就是运用的函数式编程,该方法与block中的约束处理是完全独立,完全解耦的,甚至里面的left方法,top方法也可以认为是函数式编程,因为其符合函数式编程的特点。
而整体的make.left.top.equalTo(@(100)) 是链式编程,因为其符合链式编程“.”+“()”结构组成,并且能够连续点语法。
这里可以发现单独的left方法即是函数式编程又是链式编程,因为他符合函数式编程的完全解耦的静态特点,也符合链式编程的返回block形式,不过他只是链式编程的其中一个单元。
三、链式编程
1、链式单元
链式编程的组成方式为“.”+“()”,通过用get方法+block传参的方式来实现。
这里模仿Masonry实现一个加法的功能。
首先写一个返回值为block的get方法,和一个总和sum
@property (nonatomic,assign)int sum;
-(SumManager * (^)(int))add
{
return ^(int a){
self.sum+=a;
return self;
};
}
然后在调用时是这样的:
SumManager * manager = [[SumManager alloc]init];
manager.add(1);
为了方便理解可以分解成:
SumManager *(^block)(int) = [manager add];
block(1);
就是add方法返回一个block。
也可以表达为:
[manager add](1);
这样一个链式单元就完成了。
2、添加category
为了方便引入,并且做成和Masonry的样式,我们需要加入category
#import "NSObject+Sum.h"
@implementation NSObject (Sum)
-(int)gs_getSumWithManager:(void (^)(SumManager * _Nonnull))block
{
SumManager * m = [[SumManager alloc]init];
block(m);
return m.sum;
}
这样通过category可以随时调用了。
3、效果
int sum = [self gs_getSumWithManager:^(SumManager * _Nonnull manager) {
manager.add(1).add(2);
}];
NSLog(@"%d",sum);
这样gs_getSumWithManager是一个函数式编程,其封装了add方法,并且是完全解耦的可以随时调用。
manager.add(1).add(2); 这里又是一个链式编程,符合链式编程的所有特点。
做到了和Masonry一样的效果。