导语
  函数式编程是一种编程范式,也就是如何编写程序的方法论。随着函数式编程被更多人广泛的关注。很多古老的函数式编程语言都重获新生,就连Java这样的老牌的编程语言都开始往函数式编程的方式开始靠近。例如Python、Rudy、JavaScript等等的语言对于函数式编程都有很好的支持。并且越来越多的迹象表明,函数式编程已经从学术界往工业界开始转移,很多的用于工业实践的方式都已经在工业界大批量的投入实用,并且获得了很好的效果。

  函数式编程是即面向对象编程之后又一关键的编程范式,对现在的以面向对象编程思维为主导的程序员提出了很大的挑战,大家应该或多或少的都要懂一点函数式编程的思想。

  虽然函数式编程的概念已经看上去比较流行了,但是在网上,对于什么是函数式编程还是众说纷纭。下面就来谈谈自己的见解

函数式编程

  函数式编程最主要的基础支持是Lambda Calculus,λ演算,是一套从数学逻辑中发展,以变量绑定和替换的规则,来研究函数如何抽象化定义、函数如何被应用以及递归的形式系统。lambda演算作为一种广泛用途的计算模型,可以清晰地定义什么是一个可计算函数,而任何可计算函数都能以这种形式表达和求值,它能模拟单一磁带图灵机的计算过程;尽管如此,lambda演算强调的是变换规则的运用,而非实现它们的具体机器,这个概念似乎有点复杂。

  首先简单的说,函数式编程是一种编程范式,也就是讨论如何编程的方法论。这里的函数并不是指计算机编程意义上的函数或者是方法,而是数学意义上的函数,也就是说表示的是某种变量的映射关系。也就是说给定一个参数就一定会有一个函数值的存在,并且这个函数值的存在不会因为其他状态的改变而改变。例如f(x) = x+1,给定一个x值就一定会有一个f(x)与之对应。无论任何时候,调用多少次,这个值始终是不变的。

  来看个小例子,下面有这样一个数学表达式

(1+2)*3-4

  很简单,在我们传统的编程过程中把它写成如下的一种方式

var a = 1+2;var b = a*3;var c = b-4;

  在使用函数式编程,要求将所有的操作过程定义为一个函数,然后将函数进行组合

var result = subtract(multiply(add(1,2),3),4)

  从这里可以看出来,所有的函数都完成的一件事情,就是计算输入参数的结果并且返回。也就是说将函数作为一个参数进行了传入。这有点类似于数学概念上的复合函数也就是y = f(g(h(x)))。一个函数的结果是另一个函数的输入。并且在执行过程中,最终的结果不会受到外部其他条件的干扰。

云计算

  云计算是分布式计算的一种,是指利用网络,将巨大的计算处理过程拆分成很多的小的过程,然后通过多个服务器组成的分布式系统来进行计算,将最终的结果反馈给用户的过程。

  从狭义的角度上来讲,云计算其实就是一个提供资源的网络环境。使用者可以随时的获取云上的资源,并且按照自己的需求进行计费,并且可以根据自己的需求,对于网络上的资源进行无限的拓展。只需要按照使用量进行付费就可以了。

  广义上来说,云计算是为互联网资源提供相关服务的一种资源池。将所有的计算资源统一到云资源上,用户可以从资源池中按照需求进行获取。现在很多的云服务商都在做这件事情,为很多的中小型企业提供了云计算的资源。不需要每个企业再建设自己的服务器资源、文件存储资源、以及数据存储资源等等的一些内容,而是将自己空余的资源利用虚拟化的技术进行了共享。将并行计算、网络存储、热备份、虚拟化、大数据等诸多技术进行的混合,形成了一种新的云计算理念,出现了IaaS、PaaS、SaaS等解决方案。

云函数

  云函数,其实也就是函数即服务 FaaS 的具体实现,通过函数提供计算能力,原有的计算能力,无论是容器也好,还是虚拟机也好,都是在操作系统基础上的也就是在IaaS的基础上的。云函数的实现只不过是将计算能力进行进一步的抽象。

云函数与函数式编程思想结合会产生什么?

  确实从概念上讲,两者根本就是两个相互没有关系的概念。但是如果将两者进行整合,将函数式编程思想与云函数实现方案结合会有什么样的效果。

  将复杂逻辑通过函数是编程的方式进行实现,然后提供一个公共的云函数库。通过某种方式对这些云函数进行调用。开发者从一个云函数资源池中进行函数的查找,然后组合自己的业务,通过调用链路组合的方式来实现自己的业务逻辑,包括但不限于数据存储、文件存储等等。

  或者有点类似于Spring容器这种,在使用的时候,我们将编写好的函数式代码注入到一个容器中,这个容器就是我们云函数实现方案。这样的操作完成之后,我们就可以在程序的任何地方随意的去调用这些函数。

  对于并发的控制可以通过设置一个调用函数的个数来进行一个简单的解决,当然随着技术的不断发展也会出现新的解决方案,这里只是举了一个小例子。

  例如当并发量为1000W的时候,调用的函数个数是100W个相同的函数进行业务逻辑处理。在函数式编程中有这样的一个前提,就是说一个输入只有一个输出,并且这个输出是不会随着其他条件的改变而改变的。也就说,这100W个函数会接收到1000W并发中的100W个,并且这些处理逻辑的输入是唯一的,也就意味着经过一系列的处理之后,得到的结果也是唯一的,并且对应的是这100W的输入。

  从某种程度上来说,函数式编程本身就是天然并行并发的,当然这是由函数式编程的确定性/不变性所决定的。所以说在高并发的场景下,可能更有优势。

这样做的缺点

1、需要对各个业务进行更加细粒度的拆分,推进的成本,维护的成本都是相当高的。

2、这种方案可能不适合长时间运行的系统,长时间运行本身也是对云资源的一种消耗。

总结

  基于上述的一些讨论,对于一些快速开发,并且业务逻辑较为简单的场景来说,通过上述的这种方式实现起来比较省时省力,但是对于一些复杂的业务逻辑来说,可能不太适合。对于现阶段来说,云函数的应用也只是在小范围内去使用,结合现在炒的比较火热的一个DDD(领域驱动设计)。我想在不久的将来,很多的大厂都会往上述描述的这种方案上来靠拢。函数式编程与自然语言比较相似,而DDD所提出的一个概念就是将程序员编写的代码与实际业务结合的更加紧密。基于这些,既然业务与人有关,函数式编程与自然语言有关,再结合云函数实现方案。

云函数与函数式编程思想结合会产生什么?相关推荐

  1. Rxswift学习之(一)函数响应式编程思想

    Rxswift学习之(一)函数响应式编程思想 1. 函数响应式编程思想必备基本概念简介 2. iOS中三种编程思想:链式.函数式和响应式编程 2.1 链式编程 2.2 函数式编程 2.3 响应式编程 ...

  2. [js] 纯函数和函数式编程有什么关系?

    [js] 纯函数和函数式编程有什么关系? 函数式编程是一种编程思想,纯函数是这种思想的基本要实现函数式编程,我们所封装的方法应该是抽象的,应该是和外部状态无关系的,也就需要是纯函数的,这样才能保证抽象 ...

  3. android 函数式编程,思想交融,Android中的函数式编程(2):什么是函数式编程...

    上一篇文章,咱们通过 DiffUtil 来引出了函数式的那么一点点内容.今天的文章,将会重点聊一聊函数式编程所能给我们 开发模式 上的改变. 一.什么是函数式编程 解答这个问题,让我们直接上维基百科吧 ...

  4. 《JavaScript函数式编程思想》——递归

    第7章  递归 王二.张三和赵四一日无聊,决定玩击鼓传花讲冷笑话的游戏.王二和张三围成一圈传花,赵四负责击鼓.张三接连讲了几个诸如小菜.狐狸狡猾的笑话.花停在了王二的手中. 王二:这个笑话很短.你要保 ...

  5. JavaScript函数式编程思想

    欢迎访问个人网站 最开始接触函数式编程的时候是在小米工作的时候,那个时候看老大以前写的代码各种 compose,然后一些 ramda 的一些工具函数,看着很吃力,然后极力吐槽函数式编程,现在回想起来, ...

  6. 《JavaScript函数式编程思想》

    自序 伴随着Web技术的普及,JavaScript已成为应用最广泛的编程语言之一.由于其在Web前端编程中的统治地位.语言本身的表现力.灵活性.开源的本质和ECMAScript标准近年来的快速发展,J ...

  7. 《JavaScript函数式编程思想》——名称

    第1章  名称 一般对函数式编程的介绍都会从一等值和纯函数等概念开始,本书却准备在那之前先花些篇章讨论两个通常未得到足够重视的主题:名称和类型系统.前者包括名称绑定.作用域和闭包等内容,后者包括类型的 ...

  8. SECTION 16 函数和函数式编程(三)

    函数和函数式编程 16.1 "函数式编程" 16.2 函数式编程 16.2.1匿名函数与 lambda 16.2.2 核心笔记:lambda 表达式返回可调用的函数对象. 16.3 ...

  9. 过程或函数的副作用是_Python函数和函数式编程(两万字长文警告!一文彻底搞定函数,建议收藏!)...

    Python函数和函数式编程 函数是可重用的程序代码段,在Python中有常用的内置函数,例如len().sum()等. 在Pyhon模块和程序中也可以自定义函数.使用函数可以提高编程效率. 1.函数 ...

最新文章

  1. 4.html 头部随笔
  2. jQuery操作Dom、jQuery事件机制、jQuery补充部分
  3. Mybatis加入Ehcache支持
  4. MyEclipse 16(汉化版)安装教程
  5. leetcode 分饼干 贪心算法python
  6. 安卓app 获取view的id_隐私保护问题不小 研究表示1325个安卓APP未经授权获取用户数据...
  7. ajaxReturn 之前dump调试,导致$.ajax不能正常运行
  8. python中提取几列_Python一键提取PDF中的表格到Excel(实例50)
  9. Android学习_ContentProvider和Uri
  10. web 开发 —— html 与 css(div)
  11. MSP430 MSP430单片机软件开发集成环境CCS
  12. GRE_××× 配置(建议选择Cisco2811路由器)
  13. Node.js单例模式
  14. 推荐一款微信小程序《诗词万卷》
  15. uni.getUserProfile获取的微信昵称是微信用户,头像获取的是默认头像
  16. SAS:Proc Freq ,输出结果控制小数位数
  17. QGIS-wgs坐标和gcj坐标的区别
  18. 2021年过氧化工艺模拟试题及过氧化工艺证考试
  19. 基本数据类型和引用类型
  20. 软件授权协议:Everything

热门文章

  1. java自动化执行javascript,Js代码执行__实现自动化
  2. 自动化运维工具Ansible连续剧之--介绍安装与连接
  3. 分页,条件查找后再分页
  4. 可以打开mdb文件的小软件
  5. POJ 2431 Expedition 优先队列
  6. Java基础-SSM之mybatis快速入门篇
  7. The Distribution File System
  8. BizTalkServer 如何发送 EDI 消息(3)
  9. Solr6.1 smartCN配置
  10. HT for Web的HTML5树组件延迟加载技术实现