链式编程思想
:是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好。a(1).b(2).c(3)
链式编程特点
:方法的返回值是block,block必须有返回值(本身对象),block参数(需要操作的值)代表
:masonry框架。BabyBluetooth
Masonry中的链式可能相对比较零散,并不能体现出链式的任务逻辑连贯性。
下面介绍另外一个优秀的第三方框架BabyBluetooth,BabyBluetooh是简单易用的蓝牙库,基于CoreBluetooth的封装,并兼容ios和mac osx。
CoreBluetooth所有方法都是通过委托完成,代码冗余且顺序凌乱。BabyBluetooth使用block方法,可以重新按照功能和顺序组织代码,并使用链式编程将一组任务用一条链完成。
baby.having(self.currPeripheral).and.channel(channelOnPeropheralView).then.connectToPeripherals().discoverServices().discoverCharacteristics().readValueForCharacteristic().discoverDescriptorsForCharacteristic().readValueForDescriptors().begin();
用一条链就完成了一整套的连接peripheral,发现服务,发现特性,读取特性值,发现描述,读取描述值的任务链,而不需要多次的分散调用,流程逻辑非常清晰。
下面用链式编程思想写一个Demo
以分类形式进行计算操作
.h
#import <Foundation/Foundation.h>
@class CalculateManager;
@interface NSObject (Calculate)
+(NSInteger)xw_makeCalculate:(void(^)(CalculateManager *))block;
@end
.m
#import "NSObject+Calculate.h"
#import "CalculateManager.h"
@implementation NSObject (Calculate)
+(NSInteger)xw_makeCalculate:(void(^)(CalculateManager *))block{
CalculateManager *mgr = [[CalculateManager alloc] init];
block(mgr);
return mgr.result;
}
@end
自定义计算类,使所有方法用block代码块形式表示
.h
#import <Foundation/Foundation.h>
@interface CalculateManager : NSObject
@property (nonatomic, assign) NSInteger result;
-(CalculateManager *(^)(NSInteger))add;
-(CalculateManager *(^)(NSInteger))subtract;
-(CalculateManager *(^)(NSInteger))mult;
-(CalculateManager *(^)(NSInteger))division;
@end
.m
#import "CalculateManager.h"
@implementation CalculateManager
-(CalculateManager *(^)(NSInteger))add{
return ^(NSInteger value){
_result += (value);
return self;
};
}
-(CalculateManager *(^)(NSInteger))subtract{
return ^(NSInteger value){
_result -= (value);
return self;
};
}
-(CalculateManager *(^)(NSInteger))mult{
return ^(NSInteger value){
_result *= (value);
return self;
};
}
-(CalculateManager *(^)(NSInteger))division{
return ^(NSInteger value){
_result /= (value);
return self;
};
}
@end
在使用链式编程思想调用对象方法就可以这样操作:
-(void)calculate{
NSInteger result = [NSObject xw_makeCalculate:^(CalculateManager * mgr) {
mgr.add(100).add(200).division(2).mult(3).subtract(50).add(121);
}];
NSLog(@"result: %zd",result);
}
java程序员熟悉的点语法