前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS 面向函数编程的理解

iOS 面向函数编程的理解

作者头像
星宇大前端
发布2019-01-15 14:39:16
6990
发布2019-01-15 14:39:16
举报
文章被收录于专栏:大宇笔记大宇笔记

序:前段时间有些膨胀了,以为3年开发三年的我什么都见过了,这段时间又看了许多大神的博客。发现自己还是一个跳梁小丑,编程的大海我只在一个水滴里打转。学海无涯,以梦为马,不负韶华。

大学对于编程思想,局限了我的想象。我一直认为程序只有面向过程和面向对象这么两种说法。在后面学习的语言中面向对象的占大多数,所以就没有想过这个问题了。

这几天突然听过了这几个词语:函数式编程(FB),响应式编程等等思想。

函数编程的概念:

函数编程(简称FP)不只代指Haskell Scala等之类的语言,还表示一种编程思维,软件思考方式,也称面向函数编程。 编程的本质是组合,组合的本质是范畴Category,而范畴是函数的组合。

        什么是函数式编程,这并没有唯一定义,它只是广泛聚合了一些编程风格的特性,我们可以将它与面向对象编程OOP进行对比, 两者区别是,OOP主要聚焦于数据的区别,而FP则注重数据结构的一致性。

特点理解:

  • 与面向对象编程(Object-oriented programming)和过程式编程(Procedural programming)并列的编程范式。
  • 最主要的特征是,函数是第一等公民
  • 强调将计算过程分解成可复用的函数,典型例子就是map方法和reduce方法组合而成 MapReduce 算法
  • 只有纯的、没有副作用的函数,才是合格的函数。

点击深入理解函数编程的概念

函数编程和面向对象的对比:

面向对象:

  1. 数据和对数据的操作紧紧耦合
  2. .对象隐藏它们操作的实现细节,其他对象调用这些操作只需要通过接口。
  3. .核心抽象模型是数据自己 
  4. 核心活动是组合新对象和拓展已经存在的对象,这是通过加入新的方法实现的。

函数编程:

  1. 数据与函数是松耦合的
  2. 函数隐藏了它们的实现,语言的抽象是函数,以及将函数组合起来表达。
  3. 核心抽象模型是函数,不是数据结构
  4. 核心活动是编写新的函数。
  5. 变量缺省是不变的,减少可变性变量的使用,并发性好

代码对比:

面向对象编程如下:

var sumOfSquares = function(list) {   var result = 0;   for (var i = 0; i < list.length; i++) {     result += square(list[i]);   }   return result; };

console.log(sumOfSquares([2, 3, 5])); 函数编程代码如下:

var sumOfSquares = pipe(map(square), reduce(add, 0)); console.log(sumOfSquares([2, 3, 5]));

函数编程的语言:

Scala, Haskell, Erlang,F#,Lisp等

iOS中函数编程的理解:

OC:OC是一个面向对象的语言,用OC编程面向函数思想我觉得是有点生硬的。面向函数编程,函数就像一个管道,有输入,有输出。起点和终点(运行结果)之间可以用多个管道(函数)多种拼接(函数的组合)手段组成。

  比如下面的一个例子:

      我们可用不同的函数拼接都让这个人走5步,每个函数的输出都能拼接到下一个函数。

@implementation Person

-(instancetype)runStep1{

NSLog(@"走了1步");

returnself;

}

-(instancetype)runStep2{

NSLog(@"走了2步");

returnself;

}

-(instancetype)runStep3{

NSLog(@"走了3步");

returnself;

}

-(instancetype)runStep4{

NSLog(@"走了4步");

returnself;

}

-(instancetype)runStep5{

NSLog(@"走了5步");

returnself;

}

#import "ViewController.h"

#import "Person.h"

@interfaceViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {

    [superviewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

    [[[selfpersoninit]runStep1]runStep4];

    [[[selfpersoninit]runStep2]runStep3];

    [[selfpersoninit]runStep5];

}

-(Person  *)personinit{

Person  *  person  =  [[Personalloc]init];

return  person;

}

自己的理解,可能和函数思想有偏差,欢迎指正。

参考博客:http://www.jdon.com/functional.html

http://www.ruanyifeng.com/blog/2017/02/fp-tutorial.html

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年06月08日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档