美文网首页
方法链的思想

方法链的思想

作者: bonoCat | 来源:发表于2017-10-13 15:39 被阅读10次

不知什么时候出现了一个叫“链式编程”的词,平时运用中在 Masonry 中使用的比较多,非常的清晰,自然。在百科中没有找到“链式编程”的定义,但是找到了“方法链”,目测应该是同一个东西。

定义

方法链(method chaining)是面向对象的编程语言中的一种常见语法,可以让开发者在只引用对象一次的情况下,对同一个对象进行多次方法调用。

优势

  • 调用过程更接近自然语言
  • 减少代码量
  • 简化调用过程

缺点

  • 不能在需要返回值中使用

Masonry 中方法链的运用

Masonry 中的使用方式:

源码:

// View+MASAdditions.h
- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block {
    self.translatesAutoresizingMaskIntoConstraints = NO;
    MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
    block(constraintMaker);
    return [constraintMaker install];
}

// MASConstraintMaker.h
- (NSArray *)install {
    if (self.removeExisting) {
        NSArray *installedConstraints = [MASViewConstraint installedConstraintsForView:self.view];
        for (MASConstraint *constraint in installedConstraints) {
            [constraint uninstall];
        }
    }
    NSArray *constraints = self.constraints.copy;
    for (MASConstraint *constraint in constraints) {
        constraint.updateExisting = self.updateExisting;
        [constraint install];
    }
    [self.constraints removeAllObjects];
    return constraints;
}

// MASConstraint.h
- (MASConstraint * (^)(id attr))equalTo;

实例调用:

  [view mas_makeConstraints:^(MASConstraintMaker *make) {
        make.width.equalTo(@(self.buttonSize.width));
        make.height.equalTo(@(self.buttonSize.height));
    }];

调用过程分析:

- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block 

mas_makeConstraints 返回的的是 NSArray 暂且不管,看他传入的参数为一个 Block ,输入参数为 MASConstraintMaker

block(constraintMaker); 将初始化的 constraintMaker 放入block中,既 make 为 constraintMaker,提供给 block 内部使用。并且执行block内部函数

return [constraintMaker install]; 完成布局配置

- (MASConstraint *)width {
    return [self addConstraintWithLayoutAttribute:NSLayoutAttributeWidth];
}

- (MASConstraint *)height {
    return [self addConstraintWithLayoutAttribute:NSLayoutAttributeHeight];
}

- (MASConstraint * (^)(id))equalTo {
    return ^id(id attribute) {
        return self.equalToWithRelation(attribute, NSLayoutRelationEqual);
    };
}

width、height、equalTo 返回的都是 MASConstraint,这样就形成了一个链式,可以通过 make.width.equalTo ,这种方式。其中 equalTo 为传入值返回 MASConstraint 的 block。

所以方法链,通过block调用,返回相同原型,形成的一种链式结构。

实现一个方法链

通过对方法链的定义,以及 Masonry 方法链使用的分析,尝试实现一个方法链。

功能:

实现个人信息录入

  Person *p = [Person makeAddPeople:^(Person *make) {
        make.changeName(@"张三").changeAge(11).changeAddress(@"地球");
    }];
     

实现

step 1:

/// Person.h
+ (Person *)makeAddPeople:(void (^)(Person *make))block
{
    Person *p = [[Person alloc] init];
    
    block(p);
    
    return p;
}

创建一个 makeAddPeople 方法,包含block,并且将 make 进行赋值,block内部操作将会使用make

step 2:

/// Person.h
- (Person *(^)(NSString *))changeName
{
    return ^(NSString *nameValue){
        
        self.name = nameValue;
        
        return self;
    };
}

添加 Person 信息时将返回 Person,作为后面原型链接,通过返回 block 的输入,用于外部调用传参,内部对make进行赋值

step 3:

    Person *p = [Person makeAddPeople:^(Person *make) {
        
        make.changeName(@"张三").changeAge(11).changeAddress(@"地球");
        
    }];
    
    NSLog(@"%@",p.name);

实现原来设计功能,能返回 ”张三“

相关文章

  • 方法链的思想

    不知什么时候出现了一个叫“链式编程”的词,平时运用中在 Masonry 中使用的比较多,非常的清晰,自然。在百科中...

  • 原型链学习整理

    原型链的作用: 原型链是实现继承的主要方法。基本实现思想是利用原型链让一个引用类型继承另一个引用类型的属性和方法。...

  • iOS 获取view当前UIViewController的几种方

    通过响应链的方法 利用递归的思想查找当前视图控制器 遍历的方法获取 补充:presentedViewControl...

  • JavaScript继承

    原型链 ECMAScript中描述了原型链的概念,并将原型链作为实现继承的主要方法。其基本思想是利用原型让一个引用...

  • 【面向对象的程序设计(3)】原型链继承

    ECMAScript只支持实现继承(继承实际的方法),主要依靠原型链来实现。 原型链 基本思想:利用原型让一个引用...

  • 继承之组合继承

    组合原型链和借用构造函数 设计思想:1.使用原型链实现对原型属性和方法的继承:Man3.prototype = n...

  • 利用原型链和借用构造函数实现继承

    原型链继承 原型链是实现继承的主要方法,其基本思想是利用原型让一个引用类型继承另外一个引用类型的属性和方法。在介绍...

  • javascript高级程序设计读书笔记(六)

    继承 NO.1 原型链 基本思想是让一个引用类型继承另一个引用类型的属性和方法。所以原型链是用来实现继承的主要方法...

  • JavaScript 原型与原型链以及继承方式

    原型 ECMAScript 中描述了原型链的概念,并将原型链作为实现继承的主要方法。其基本思想是利用原型让一个引用...

  • 责任链模式

    责任链的主要思想是,对象引用同一类型的对象,形成一条链,链中的每个对象实现了相同的方法,处理链中对一个对象发起的同...

网友评论

      本文标题:方法链的思想

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