【编程思想】

链式编程思想

链式编程思想: 是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好。a(1).b(2).c(3)

链式编程特点:方法的返回值是block,block必须有返回值(本身对象),block参数(需要操作的值)

代表:masonry框架。

@interface JiSuanQiManager : NSObject
@property (nonatomic, assign) NSInteger result;
- (JiSuanQiManager *(^)(NSInteger))add;
@end

#import "JiSuanQiManager.h"
@implementation JiSuanQiManager
- (JiSuanQiManager * (^)(NSInteger))add
{
    return ^(NSInteger value){
        _result += value;
        return self;   
    };
}
@end
JiSuanQiManager *mgr = [[JiSuanQiManager alloc] init];
mgr.add(5).add(5).add(7).add(8);
NSLog(@"%ld",mgr.result);
响应式编程思想

响应式编程思想:不需要考虑调用顺序,只需要知道考虑结果,类似于蝴蝶效应,产生一个事件,会影响很多东西,这些事件像流一样的传播出去,然后影响结果,借用面向对象的一句话,万物皆是流。

代表:KVO运用。

KVO的实现

#import 
@interface NSObject (KVO)
- (void)xmg_addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:( void *)context;
@end

#import "NSObject+KVO.h"
#import 
@implementation NSObject (KVO)
- (void)xmg_addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context
{
    /*
     1.runtime动态生成Person的子类(派生类)
     2.重写KVO_Person的属性set方法,目的:监听属性有没有改变
     3.修改对象的isa指针.
     */
    // 修改isa
    object_setClass(self, NSClassFromString(@"NSKVONotifying_Person"));
    
    // 保存观察者对象
    // self -> P;
    // 动态添加属性
    objc_setAssociatedObject(self, "observer", observer, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
#import "Person.h"
@interface NSKVONotifying_Person : Person
@end

#import "NSKVONotifying_Person.h"
#import 

@implementation NSKVONotifying_Person
- (void)setAge:(NSInteger)age
{
    // super:标志,去执行父类方法
    [super setAge:age];
    
    // 调用观察者的observeValueForKeyPath
    id observer = objc_getAssociatedObject(self, "observer");
    
    [observer observeValueForKeyPath:@"age" ofObject:self change:nil context:nil];
    
    NSLog(@"执行NSKVONotifying_Person");
//    NSLog(@"%@",[super class]);
    
}
@end
函数式编程思想

函数式编程思想:是把操作尽量写成一系列嵌套的函数或者方法调用。

函数式编程特点:每个方法必须有返回值(本身对象),把函数或者Block当做参数,block参数(需要操作的值)block返回值(操作结果)

代表:ReactiveCocoa

@interface JiSuanQiManager : NSObject
@property (nonatomic, assign) NSInteger result;
- (void)add:(NSInteger)value;
- (void)sub:(NSInteger)value;
- (JiSuanQiManager *)jisuan:(NSInteger(^)(NSInteger))block;
- (JiSuanQiManager *)log;
- (BOOL)equle:(NSInteger)value;
@end

#import "JiSuanQiManager.h"
@implementation JiSuanQiManager
- (JiSuanQiManager *)jisuan:(NSInteger (^)(NSInteger))block
{
    _result = block(_result);
    return self;
}

- (JiSuanQiManager *)log
{
    NSLog(@"%ld",_result);
    return  self;
}

- (BOOL)equle:(NSInteger)value
{
    return _result == value;
}
@end
JiSuanQiManager *mgr = [[JiSuanQiManager alloc] init];
    BOOL isReal = [[mgr jisuan:^(NSInteger reslut){
        // 计算的代码 写在这里面
        reslut+=5;
        reslut+=5;
        reslut+=5;
        reslut+=5;
        return reslut;
    }] equle:20];
    NSLog(@"%d",isReal);

你可能感兴趣的:(【编程思想】)