day18: pure function

今天我们提到 pure function,那相对的也会有, not a pure function, 以下
我们先来的, not a pure function 的实例吧。

Not a pure function

什麽是 pure function,

譬如我们今天去文具店想买笔和笔记本,

一支笔 20 元,一本笔记本 40 元。

想计算总共花了多少钱 ?

let pen = 20;
let notebook = 40;

const totalPrice = () => {
	return pen + notebook;
}

totalPrice(); // 60;

如果今天突然你在购买的途中,老板突然改了笔的定价为 30 元

那接下来你就会计算出 70 元的价格,如果你有很多状态都在外部,

这时候你就会因为 pen 和 notebook 的变数是 mutable,就会产生超过 side effect,

你根本不知道哪边 code 被改了,造成 totalPrice 的结果跟原本不一致。

这是就是 not a pure function 的坏处。

let pen = 20;
let notebook = 40;

const totalPrice = () => {
	return pen + notebook;
}

totalPrice(); // 60;

**pen = 30;**

totalPrice();// 70

Pure function

那什麽是 pure function

Pure function 意指相同的输入,永远会得到相同的输出,而且没有任何显着的 side effect。

那什麽是 side effect ?

副作用可以包含,但不限於:

- 更改档案系统
- 在资料库写入纪录
- 发送一个 http 请求
- 可变资料
- 印出至画面 / log
- 取得使用者输入
- DOM 查询
- 存取系统状态

所以我们要理解 pure function 就是只要是相同的 input 执行有相同的 output,

然後 input to output 可以是 一 对 一,也可以是多对一,如下图。

假设是相同的 input 每次显示结果 (output) 不一样,就不是 pure function 了。

https://ithelp.ithome.com.tw/upload/images/20211003/2010730737WRBMGsfy.png

图片出处: https://www.cuemath.com/algebra/one-to-one-function/

所以我们可以来看看哪些是 pure function

- map
const plusOne = [1,2,3,4].map(i=>i+1); // [2,3,4,5]

- reduce
const total = [1,2,3,4].reduce((total,target)=>total+target,0); // 10

以上的 function 就是只要相同 input 就永远是相同 output

那第一个范例怎麽改写呢?

let pen = 20;
let notebook = 40;

const totalPrice = (x,y) => {
	return x + y;
}

totalPrice(pen,notebook); // 60;

**pen = 30;**

totalPrice(pen,notebook);// 70

其实只要把 pen, notebook 的参数固定是从 function 的参数传入,

这样不管传入得数值为何,他的功能就是加总而已,在发生问题时,

就可以知道可能是 pen, notebook 的参数问题,让 function 功能单纯化。


<<:  [Q&A] 03 资安健诊/弱点检测报告不被重视

>>:  Day_21 : 让 Vite 来开启你的Vue 之 跨元件资料传递 Provide & Inject

关於AsyncTask

AsyncTask非同步任务,或称异步任务,是一个相当常用的类别,是专门用来处理背景任务与UI的类别...

【第22天】训练模型-模型组合与辨识isnull(三)

摘要 交叉验证不同方法组合的模型准确率 1.1 参数说明 1.2 程序码 选择模型组合方法 2.1 ...

[Day 19] 现在才讲全域注册、区域注册

选择在今天讲这个可能有点奇怪,但实在是不知道要在哪天讲比较适合,又很想把这篇打出来!!於是这篇文就诞...

Day18 Helm

今天我们要先来介绍一下 Helm,由於 Open-Match 是基於微服务建立的分散式架构,在部署上...

javascript函式的变形1

我们稍微改写一下之前所写的加法函式 ...