函数式编程(一)

什么是函数式编程

函数式编程是一种编程范式,罕见的编程范式有以下三种:

  • 敕令式编程
  • 声明式编程
  • 函数式编程

函数式编程的实质是将盘算形貌为一种表达式求值。在函数式编程中,函数作为一等国民,可以在任何地方定义(在函数内或函数外),可以作为函数的参数和返回值,可以对函数举行组合。

函数式编程的原则:不依靠于外部的数据,而且也不转变外部数据的值,而是返回一个新的值给你。看个简朴的例子:

    // 非函数式的例子
    let count = 0;
    function increment() {
        count++; // 依靠于函数外部的值,并转变了它的值
    }
    
    // 函数式的例子
    function increment(count) {
        return count++;
    }

为何采纳函数式编程

函数式编程不依靠外部的状况也不修正外部的状况,函数挪用的效果不依靠挪用的时刻和位置,这些写代码随意马虎举行推理,不容易出错,而且单测和调试都更简朴。即函数编程采纳纯函数。

纯函数是如许一种函数,即雷同的输入,永久会获得雷同的输出,而且没有任何可视察的副作用。

副作用可以包括,但不限于:

  • 变动文件体系
  • 往数据库插进去纪录
  • 发送一个 http 要求
  • 可变数据
  • 打印/log
  • 猎取用户输入
  • DOM 查询
  • 接见体系状况

副作用是在盘算效果的历程当中,体系状况的一种变化,或许与外部天下举行的可视察的交互。

纯函数的优点:

纯函数能依据输入来做缓存(memoize手艺)

    const memoize = function(f) {
        const cache = {};
        return function() {
            const argStr = JSON.stringify(arguments);
            
            if (!cache[argStr]) {
                cache[argStr] = f.apply(f, arguments);
            }
            
            return cache[argStr];
        }
    }

可移植性/自文档化
纯函数的输出只依靠与它的输入,依靠很明白,易于明白。由于纯函数不依靠它的上下文环境,因而我们可以随意马虎的把它移植到任何地方运转它。

可测试性
我们没必要在每次测试前都去设置和组织初始环境,只需简朴给函数一个输入,然后断言它的输出就好了。

合理性
由于纯函数老是可以依据雷同的输入返回雷同的输出,所以它们就可以保证老是返回同一个效果,这也就保证了援用透明性。

并行实行
我们可以并行运转恣意纯函数。由于纯函数基础不须要接见共享的内存,而且依据其定义,纯函数也不会因副作用而进入合作态。
并行代码在服务端 js 环境以及运用了 web worker 的浏览器那边是异常随意马虎完成的,由于它们运用了线程(thread)。不过出于对非纯函数复杂度的斟酌,当前主流看法照样防止运用这类并行。

完成函数式编程的手艺

这里我们先不睁开这些手艺的细节内容,本文我们先侧重于对函数式编程有一个团体上的熟悉,详细的手艺细节我们将在下一章睁开。

  • curry(柯里化)
  • compose(代码组合)
  • Monad(Monad就是一种设想形式,示意将一个运算历程,经由过程函数拆解成相互衔接的多个步骤。你只需供应下一步运算所需的函数,悉数运算就会自动举行下去。)

怎样正确对待函数式编程

我们先来看以下几种看法:

  • 你这段代码用了 for 轮回,这是历程式的。为了文雅,你应当写成函数式的。
  • 你这段代码有副作用,这是邋遢的。为了纯洁性,你应当把 IO 包在 Monad 里。
  • 你这段代码用了 class,这是面向对象的。为了无状况,你应当写成高阶函数。

我想说的是这类过火的看法是不正确的,我们不应当把函数式编程和敕令式编程对峙起来,我们更多的时刻须要斟酌的是手艺的实用场景。函数式编程写起代码来,有肯定的难度,假如一个团队的团体程度达不到,那末写代码的质量和效力还不如采纳敕令式编程好。函数式编程应用纯函数的无状况性,它的优点异常多(效果可预期、利于测试、利于复用、利于并发),但一个体系工程的代码,是不可以悉数采纳纯函数来写的。当我们越切近营业,我们就离纯函数与无状况越远。

函数式编程异常重要,进修它我们能翻开我们的头脑体式格局,运用它也有许多优点,但它也有一些范围,我们应当客观对待。坚持开放的心态,依据现实场景挑选适宜的手艺,是一个工程师基础的素养。

参考资料

https://llh911001.gitbooks.io…
http://www.ruanyifeng.com/blo…
https://coolshell.cn/articles…
https://www.zhihu.com/questio…
https://zhuanlan.zhihu.com/p/…

    原文作者:felix
    原文地址: https://segmentfault.com/a/1190000018519264
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞