面向对象的话,写的方法都比较松散,东一个方法,西一个方法。
函数式编程: 写一个 bloc k,在 block 里面写方法。这样方法比较聚拢。
函数式编程思想:是把操作尽量写成一系列嵌套的函数或者方法调用。
特点: 每个方法必须有返回值(本身的对象),把函数或者 Block 当做参数, block 参数(需要操作的值) block 返回值 (操作结果)
代表: ReactiveCocoa
举例: 计算器
面向对象:
@interface CalculatorManager : NSObject
@property (nonatomic, assign) NSInteger result;
- (void)add:(NSInteger)num;
@end
// 调用 计算器
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
CalculatorManager *manager = [CalculatorManager new];
[manager add:3];
}
@end
1、 当计算器中有很多方法,比如:减法、乘法、除法等
@interface CalculatorManager : NSObject
@property (nonatomic, assign) NSInteger result;
/// 加法
- (void)add:(NSInteger)num;
/// 减法
- (void)subtraction:(NSInteger)num;
/// 乘法
- (void)multiplication:(NSInteger)num;
/// 除法
- (void)division:(NSInteger)num;
@end
1.1 、调用一次计算器类
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 调用 计算器
CalculatorManager *manager = [CalculatorManager new];
[manager add:3];
[manager subtraction:2];
}
@end
1.2、调用多次计算器类的方法,就会感觉眼睛累
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 调用 计算器
CalculatorManager *manager = [CalculatorManager new];
[manager add:3];
[manager subtraction:2];
[manager add:3];
[manager subtraction:2];
[manager add:3];
[manager subtraction:2];
[manager add:3];
[manager subtraction:2];
[manager add:3];
[manager subtraction:2];
}
@end
1.3、 这个时候就可以优化一下了,可以用链式编程优化,也可以用函数式编程优化。那如何使用函数式编程优化呢?
二、函数式编程 - 计算器
- 函数式使用 Block 。所以:可以先写一个方法,在方法里面写就算的代码。
@interface CalculatorManager : NSObject
@property (nonatomic, assign) NSInteger result;
/// 计算器
- (void)Calculator:(void(^)(void))block;
@end
1.1、外界调用
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 调用 计算器
CalculatorManager *manager = [CalculatorManager new];
[manager Calculator:^{
// 在这个 block 里面写计算的代码
}];
}
@end
1.2、但是基本没什么用处,最好是在上一个计算的结果上再次进行计算。这就需要一个参数。在这个参数上再次进行计算:
// 给 block 添加参数
@interface CalculatorManager : NSObject
@property (nonatomic, assign) NSInteger result;
/// 计算器
- (void)Calculator:(void(^)(NSInteger))block;
@end
@implementation CalculatorManager
- (void)Calculator:(void (^)(NSInteger))block {
// 调用 block
block(_result);
}
@end
1.2.1、 外界调用
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 调用 计算器
CalculatorManager *manager = [CalculatorManager new];
[manager Calculator:^(NSInteger num) {
num += 2;
num -= 3;
}];
}
@end
1.2.2、这样只有外界的block里的值才会变化,外界的 result 一直都没有变。因为 没有给 计算器的 result 赋值。所以下一步,给 计算器中的 rusult 赋值。
- 给 计算器中的 result 属性赋值。就需要 给 计算器方法中的block 的返回值由
void
改成NSInteger
.
@interface CalculatorManager : NSObject
@property (nonatomic, assign) NSInteger result;
/// 计算器
- (void)Calculator:(NSInteger(^)(NSInteger))block;
@end
@implementation CalculatorManager
- (void)Calculator:(NSInteger (^)(NSInteger))block {
// 调用 block
_result = block(_result);
}
@end
2.1 外界调用
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 调用 计算器
CalculatorManager *manager = [CalculatorManager new];
[manager Calculator:^(NSInteger num) {
num += 2;
num -= 3;
return num;
}];
}
@end
三、 函数式编程,连续调用方法
执行第一函数后,紧跟着执行第二个函数...
可以参考 链式编程思想,返回类本身(返回类名 *)
@interface CalculatorManager : NSObject
@property (nonatomic, assign) NSInteger result;
/// 计算器
- (CalculatorManager *)calculator:(NSInteger(^)(NSInteger))block;
/// 打印结果
- (void)log;
@end
@implementation CalculatorManager
- (CalculatorManager *)calculator:(NSInteger (^)(NSInteger))block {
// 调用 block
_result = block(_result);
return self;
}
- (void)log {
// 如果在这个log后面,也想要再调用别的方法,那么可以让 log 方法返回类本身。 returen self;
NSLog(@"%ld",_result);
}
@end
外界调用
- (void)viewDidLoad {
[super viewDidLoad];
// 调用 计算器
CalculatorManager *manager = [CalculatorManager new];
[[manager calculator:^(NSInteger num) {
num += 2;
num -= 3;
return num;
}] log];
}
网友评论