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

函数式编程思想

作者: 文瑶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