函数式编程一

48次阅读

共计 239 个字符,预计需要花费 1 分钟才能阅读完成。

之前包括现在偶尔也有在用函数式的方式编程,但总感觉写的不够自然,像是一只脚踏进了门里另一只脚却还在门外。周末的时候粗略的看了下《java8 函数式编程》,的确是刷新了自己之前的不少对编程的方法和看法,这里先简单记两点:
1,函数式编程的核心思想:在思考问题时,使用不可变值和函数,函数对值进行处理,映射成另一个值。
2,面向对象编程是让操作围绕数据;函数式编程相反,是让数据围绕操作,通过函数对数据进行转换(这也正是函数式编程的无副作用:不修改外部状态)
先简要写一点,后期进一步完善。

正文完
 0

函数式编程(一)

48次阅读

共计 1677 个字符,预计需要花费 5 分钟才能阅读完成。

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

命令式编程
声明式编程
函数式编程

函数式编程的本质是将计算描述为一种表达式求值。在函数式编程中,函数作为一等公民,可以在任何地方定义(在函数内或函数外),可以作为函数的参数和返回值,可以对函数进行组合。
函数式编程的准则:不依赖于外部的数据,而且也不改变外部数据的值,而是返回一个新的值给你。看个简单的例子:
// 非函数式的例子
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,这是面向对象的。为了无状态,你应该写成高阶函数。

我想说的是这种偏激的观点是不正确的,我们不应该把函数式编程和命令式编程对立起来,我们更多的时候需要考虑的是技术的适用场景。函数式编程写起代码来,有一定的难度,如果一个团队的整体水平达不到,那么写代码的质量和效率还不如采用命令式编程好。函数式编程利用纯函数的无状态性,它的好处非常多(结果可预期、利于测试、利于复用、利于并发),但一个系统工程的代码,是不可能全部采用纯函数来写的。当我们越贴近业务,我们就离纯函数与无状态越远。
函数式编程非常重要,学习它我们能打开我们的思维方式,适用它也有很多好处,但它也有一些局限,我们应该客观看待。保持开放的心态,根据实际场景选择合适的技术,是一个工程师基本的素养。

正文完
 0