博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
函数式编程
阅读量:4653 次
发布时间:2019-06-09

本文共 1041 字,大约阅读时间需要 3 分钟。

What

Functional Programming(函数式编程)在概念上和Object Oriented Programming(面向对象编程), Procedural Programming(过程化编程)类似, 是一种编程范式。

与OOP以对象为中心的理念不同,FP将所有计算机的操作视为函数运算,函数是操作的基本单位。函数拥有和基本类型一样的地位,可以将一个变量赋值为函数(First class -- 一等公民),可以在函数的参数中传递函数(higher-order function -- 高阶函数)

Why

  1. 学习一点新的编程范式可以有效防止老年痴呆。
  2. 真的很有趣
  3. 相比于过程化、面向对象,函数式书写的代码更易读,更简短。
  4. 因为函数式编程是无副作用(side effects)的,不需要考虑死锁问题,适合并发编程,因此在云计算领域得到了广泛应用(Scala)

How

好了,进入正题

以下示例代码均为JavaScript

1. 副作用--Side Effects

先来看两段代码

//代码片段1let minium = 20;const checkAge = (age)=> age >= minium;
//代码片段2let number = 2;const multipleNumber = (n) => { number = number * n; return number; }

这两段代码有问题吗?

通常情况下,代码片段1并不会发生什么问题, 我们传入年龄,并且判断是不是大于20岁。

但如果有人修改了minium呢?此时判断的条件改变了,导致我们的结果也会改变。当我们第二次运行checkAge(22)的时候,可能返回的并不是第一次运行的结果。

对于checkAge这个函数来说,它需要观测的值不仅有入参age,还有一个全局变量minium,它的运行结果依赖系统状态,这对于程序员来说是十分痛苦的。

而代码片段2就很容易发现问题了,这个函数修改了一个全局变量,换言之,它修改了系统状态,当第二次输入相同参数的时候你会得到一个不一样的结果。

不,这太让人难过了,这不是我们想要的,我们希望我们的函数足够纯净,相同的输入永远得到相同的输出。而且,不要做多余的事:

偷偷在console里打一个log
偷偷给某个api发送一个request
偷偷修改本地文件系统

转载于:https://www.cnblogs.com/dpqq/p/10467837.html

你可能感兴趣的文章
LoadLibrary 失败 GetLastError 126
查看>>
Monty Hall 问题与贝叶斯定理的理解
查看>>
利用JavaScript的字符串操作实现简单查字
查看>>
安全发布的模式
查看>>
python的N个小功能(更新文件)
查看>>
【bzoj 4390】 [Usaco2015 dec]Max Flow(树上差分)
查看>>
java之sleep、wait、yield、join、notify乱解
查看>>
DEDECMS 关键字不能小于2个字节!
查看>>
Flutter学习笔记(10)--容器组件、图片组件
查看>>
gitlab 的使用策略和简单介绍
查看>>
Web.py Cookbook 简体中文版 - 保存上传的文件
查看>>
MongoDB学习笔记二—Shell操作
查看>>
Docker——入门实战
查看>>
UIView
查看>>
List 的一个有用的高效的操作 removeAll
查看>>
呵呵 不能相信
查看>>
jQuery小测验
查看>>
C#继承与多态
查看>>
关于面试总结2-SQL学生表
查看>>
Python小技巧
查看>>