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

来源:互联网 发布:韩语配音软件 编辑:程序博客网 时间:2024/04/28 18:43

函数式编程简介

背景

现在越来越多的人开发接受并进行函数式编程。目前最当红的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
原创粉丝点击