美文网首页
函数式编程思想

函数式编程思想

作者: 文瑶906 | 来源:发表于2018-08-10 14:19 被阅读0次

面向对象的话,写的方法都比较松散,东一个方法,西一个方法。
函数式编程: 写一个 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、 这个时候就可以优化一下了,可以用链式编程优化,也可以用函数式编程优化。那如何使用函数式编程优化呢?


二、函数式编程 - 计算器

  1. 函数式使用 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 赋值。

  1. 给 计算器中的 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];
}

相关文章

网友评论

      本文标题:函数式编程思想

      本文链接:https://www.haomeiwen.com/subject/yizqbftx.html