搜索
您的当前位置:首页正文

函数式编程,链式编程

来源:二三娱乐

导语

在使用Masonry的时候,一直很好奇作者是怎么写出这么优雅的代码的,自己也学习了一下函数式编程的思想,以上为索引


函数式编程和链式编程在Masonry的使用

    UIView *redView = [[UIView alloc] init];
    redView.backgroundColor = [UIColor redColor];
    [self.view addSubview:redView];
    [redView makeConstraints:^(MASConstraintMaker *make) {
        make.center.equalTo(self.view).offset(0);
        make.width.height.equalTo(200);
    }];

上面这段代码是创建了一个view并添加到父视图上面,可以看到使用Masonry一句话就可以设置几句约束,代码看起来很优雅
上面涉及到两个概念函数式编程 equalTo(self.view)链式编程 (多个方法调用呈现链式的一次性调用)


如何自己在项目中实现

首先在项目里面创建一个Person类,在里面实现对象方法run 和 eat两个方法,并且在控制器声明调用这两个方法

- (void)eat {
    NSLog(@"%s",__func__);
}
- (void)run {
    NSLog(@"%s",__func__);
}
 Person *person = [[Person alloc] init];
    [person eat];
    [person run];
这种写法的缺点:
        * 1 方法需要分开来调用
        * 2 不能实现想让对象吃一种东西,跑另外一种东西的任意混合调用

链式编程的实现

给eat和run方法一个返回值

- (Person *)eat1 {
    NSLog(@"%s",__func__);
    return self;
}
- (Person *)run1 {
    NSLog(@"%s",__func__);
    return self;
}
    [[person run1] eat1];

实现了链式编程,接下来看函数式编程的实现原理

函数式编程的实现
- (void(^)())run2 {
    void(^block)() = ^() {
        NSLog(@"人在跑");
    };
    return block;
}
    [person run2]();
考虑到run2可以看做是一个get方法可以写成下面这个样子
    person.run2();

简单的函数式编程实现了

函数编程配合链式编程的实现

- (Person *(^)())run3 {
    Person* (^block)() = ^() {
        NSLog(@"人在跑3");
        return self;
    };
    return block;
}
- (Person *(^)())eat3 {
    Person* (^block)() = ^() {
        NSLog(@"人在吃2");
        return self;
    };
    return block;
}
    person.run3().eat3().run3().eat3();

上面实现了函数式和链式编程

模仿masonry的函数式编程和链式编程

- (Person *(^)(NSString *))eat4 {
    Person *(^block)(NSString *) = ^(NSString *foodName) {
        NSLog(@"人在吃4");
        return self;
    };
    return block;
}
- (Person *(^)(int))run4 {
    Person *(^block)(int) = ^(int juLi) {
        NSLog(@"人在跑4");
        return self;
    };
    return block;
}
    person.eat4(@"麻辣火锅").run4(4).eat4(@"黄焖鸡米饭").run4(10);

这样的代码是不是和Masonry很像了?


总结:下面复制一段Masonry的代码来看下基本就是这种思路.熟悉了这种编程思想接可以让自己写的代码或者优雅并且逼格高一点,并且阅读其他人的框架时候帮助也会很大

- (MASConstraint * (^)(id))mas_equalTo {
    return ^id(id attribute) {
        return self.equalToWithRelation(attribute, NSLayoutRelationEqual);
    };
}
- (MASConstraint * (^)(id))greaterThanOrEqualTo {
    return ^id(id attribute) {
        return self.equalToWithRelation(attribute, NSLayoutRelationGreaterThanOrEqual);
    };
}
- (MASConstraint * (^)(id))mas_greaterThanOrEqualTo {
    return ^id(id attribute) {
        return self.equalToWithRelation(attribute, NSLayoutRelationGreaterThanOrEqual);
    };
}
- (MASConstraint * (^)(id))lessThanOrEqualTo {
    return ^id(id attribute) {
        return self.equalToWithRelation(attribute, NSLayoutRelationLessThanOrEqual);
    };
}
Top