Objective-c 函数式编程和点语法

函数式编程简介

背景

现在越来越多的人开发接受并进行函数式编程。
目前最当红的Objective-c,Python,Ruby,Javascript等引入函数式是编程。
现在最新的swift要借鉴了这个函数式编程。

定义

是一种编程范例,他将计算机运算视为书序上的函数计算,并避免使用程序状态及易变对象。函数编程语言最重要的基础是λ演算(lambda calculus)。λ演算中最关键的要素就是函数被当作变量处理,能够参与运算。

函数式编程特性

封装,继承,多态是面向对象编程的三大特征。函数式编程也有自己的语言特征。
数据不可变性:多有的变量只可以辅助一次,变了不可变,如果想改变变了就创建一个新的变量。
函数是第一公民:函数可以像普通变量一样去使用。函数可以像变量一样被创建,修改,并当成变量一样传递,返回或是在函数中嵌套函数。


  引用透明:指的是函数的运行不依赖于外部变量或“状态”,只依赖于输入的参数,任何时候只要参数相同,调用函数所得到的返回值总是相同的。天然适应并发编程,因为调用函数的结果具有一致性,所以根本不需要加锁,也就不存在死锁的问题。


  —尾递归化: 因为函数调用要压栈保存现场,递归层次过深的话,压栈过多会产生性能问题。所以引入尾递归优化,每次递归时都会重用栈,提升性能。

Masnory

在iOS 开发中我看到了他的编写的特征,他和传统OC编程开发有点不太习惯,我刚开始使用这个库的时候我是感觉很容易上手,但是他一开始与OC的编程习惯很不一样,理解和学习还是用了一些时间:

make.centerY.equalTo(self.view).offset(100);

//显然上面就像一句话一样 : view的Y轴中心等于self.viewY中心偏移100 这个是链编程 

上面的链式编程 显而易见 他的可读性 非常的好

链式编程

1.新建项目command+shift+N
2.创建一个Person类
并添加两个方法:

-(void)run;
-(void)study;

简单实现:

-(void)run{
    NSLog(@"run");
}

-(void)study{
    NSLog(@"study");
}

3.实例化并调用相关的方法

Person *person=[[Preson alloc] init];
[person run];
[person study];

//这个是OC的代码风格

最终目标

    person.runBlock().studyBlock().runBlock();
    person.studyBlock().studyBlock().runBlock();

分解目标1.先实现这种方式调用

 [[person run1] study1];

2.再实现最终目标

显然,如果想要实现[person run1]调用一个方法,那么run1就需要一个返回一个对象,让这个对象去调用study1。这样分析后,就简单了,就是增加一个返回值。

代码方法的声明

-(Person*)run1;
-(Person*)study1;

//返回Preson类 ->里面有run1和study1 返回对象是是链式编程的关键

方法的实现

- (Person*)run1 {
        NSLog(@"run");
        return [[Personalloc] init];
}
- (Person*)study1{
         NSLog(@"study");
         return[[Personalloc]init];
}

实现最终目标:

person.runBlock().studyBlock().runBlock();

在OC中,`()`block是以 () 的形式去执行的,猜想如果返回一个block的话,那么我就可以用 () 来实现runBlock()这种效果了吧!

再结合我们的分解步骤,runBlock()代表执行了一个block,如果这个block的返回值的是一个对象的话,那么调用另外一个方法;这样就可以一直链接下去吧!实现了我们想要的目标!

代码:声明

- (Person* (^)())runBlock;
- (Person* (^)())studyBlock;

实现:


//block 嵌套方法可以增加代码的内聚性

 - (Person* (^)())runBlock {  
     //这个的block 有 有一个Preson类放回值(^name)(传入值)
       Person* (^block)() = ^() {            
                NSLog(@"run");           
               return self;        
        };       
       return block;
}
 - (Person* (^)())studyBlock {
       Person* (^block)() = ^()  {            
              NSLog(@"study"); 
              return self;        
       };
        return block;
}

再来看一下Masonry的一个函数式编程

make.right.equalTo(self.right).insets(kPadding);

最终调用的函数:返回的就是一个返回值为MASConstraint的block

- (MASConstraint* (^)(id))equalTo {   
 return ^id(idattribute) {               
      return self.equalToWithRelation(attribute,NSLayoutRelationEqual);
    };
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值