摘要:函數(shù)式編程的準則不依賴于外部的數(shù)據(jù),而且也不改變外部數(shù)據(jù)的值,而是返回一個新的值給你。函數(shù)式編程利用純函數(shù)的無狀態(tài)性,它的好處非常多結(jié)果可預(yù)期利于測試利于復(fù)用利于并發(fā),但一個系統(tǒng)工程的代碼,是不可能全部采用純函數(shù)來寫的。
什么是函數(shù)式編程
函數(shù)式編程是一種編程范式,常見的編程范式有以下三種:
命令式編程
聲明式編程
函數(shù)式編程
函數(shù)式編程的本質(zhì)是將計算描述為一種表達式求值。在函數(shù)式編程中,函數(shù)作為一等公民,可以在任何地方定義(在函數(shù)內(nèi)或函數(shù)外),可以作為函數(shù)的參數(shù)和返回值,可以對函數(shù)進行組合。
函數(shù)式編程的準則:不依賴于外部的數(shù)據(jù),而且也不改變外部數(shù)據(jù)的值,而是返回一個新的值給你。看個簡單的例子:
// 非函數(shù)式的例子 let count = 0; function increment() { count++; // 依賴于函數(shù)外部的值,并改變了它的值 } // 函數(shù)式的例子 function increment(count) { return count++; }為什么采用函數(shù)式編程
函數(shù)式編程不依賴外部的狀態(tài)也不修改外部的狀態(tài),函數(shù)調(diào)用的結(jié)果不依賴調(diào)用的時間和位置,這些寫代碼容易進行推理,不易犯錯,而且單測和調(diào)試都更簡單。即函數(shù)編程采用純函數(shù)。
純函數(shù)是這樣一種函數(shù),即相同的輸入,永遠會得到相同的輸出,而且沒有任何可觀察的副作用。
副作用可能包含,但不限于:
更改文件系統(tǒng)
往數(shù)據(jù)庫插入記錄
發(fā)送一個 http 請求
可變數(shù)據(jù)
打印/log
獲取用戶輸入
DOM 查詢
訪問系統(tǒng)狀態(tài)
副作用是在計算結(jié)果的過程中,系統(tǒng)狀態(tài)的一種變化,或者與外部世界進行的可觀察的交互。
純函數(shù)的好處:
純函數(shù)能根據(jù)輸入來做緩存(memoize技術(shù))
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]; } }
可移植性/自文檔化
純函數(shù)的輸出只依賴與它的輸入,依賴很明確,易于理解。由于純函數(shù)不依賴它的上下文環(huán)境,因此我們可以輕易的把它移植到任何地方運行它。
可測試性
我們不必在每次測試前都去配置和構(gòu)造初始環(huán)境,只需簡單給函數(shù)一個輸入,然后斷言它的輸出就好了。
合理性
由于純函數(shù)總是能夠根據(jù)相同的輸入返回相同的輸出,所以它們就能夠保證總是返回同一個結(jié)果,這也就保證了引用透明性。
并行執(zhí)行
我們可以并行運行任意純函數(shù)。因為純函數(shù)根本不需要訪問共享的內(nèi)存,而且根據(jù)其定義,純函數(shù)也不會因副作用而進入競爭態(tài)。
并行代碼在服務(wù)端 js 環(huán)境以及使用了 web worker 的瀏覽器那里是非常容易實現(xiàn)的,因為它們使用了線程(thread)。不過出于對非純函數(shù)復(fù)雜度的考慮,當(dāng)前主流觀點還是避免使用這種并行。
這里我們先不展開這些技術(shù)的細節(jié)內(nèi)容,本文我們先側(cè)重于對函數(shù)式編程有一個整體上的認識,具體的技術(shù)細節(jié)我們將在下一章展開。
curry(柯里化)
compose(代碼組合)
Monad(Monad就是一種設(shè)計模式,表示將一個運算過程,通過函數(shù)拆解成互相連接的多個步驟。你只要提供下一步運算所需的函數(shù),整個運算就會自動進行下去。)
如何正確看待函數(shù)式編程我們先來看以下幾種觀點:
你這段代碼用了 for 循環(huán),這是過程式的。為了優(yōu)雅,你應(yīng)該寫成函數(shù)式的。
你這段代碼有副作用,這是骯臟的。為了純凈性,你應(yīng)該把 IO 包在 Monad 里。
你這段代碼用了 class,這是面向?qū)ο蟮?。為了無狀態(tài),你應(yīng)該寫成高階函數(shù)。
我想說的是這種偏激的觀點是不正確的,我們不應(yīng)該把函數(shù)式編程和命令式編程對立起來,我們更多的時候需要考慮的是技術(shù)的適用場景。函數(shù)式編程寫起代碼來,有一定的難度,如果一個團隊的整體水平達不到,那么寫代碼的質(zhì)量和效率還不如采用命令式編程好。函數(shù)式編程利用純函數(shù)的無狀態(tài)性,它的好處非常多(結(jié)果可預(yù)期、利于測試、利于復(fù)用、利于并發(fā)),但一個系統(tǒng)工程的代碼,是不可能全部采用純函數(shù)來寫的。當(dāng)我們越貼近業(yè)務(wù),我們就離純函數(shù)與無狀態(tài)越遠。
函數(shù)式編程非常重要,學(xué)習(xí)它我們能打開我們的思維方式,使用它也有很多好處,但它也有一些局限,我們應(yīng)該客觀看待。保持開放的心態(tài),根據(jù)實際場景選擇合適的技術(shù),是一個工程師基本的素養(yǎng)。
參考資料https://llh911001.gitbooks.io...
http://www.ruanyifeng.com/blo...
https://coolshell.cn/articles...
https://www.zhihu.com/questio...
https://zhuanlan.zhihu.com/p/...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/102564.html
摘要:函數(shù)式編程,一看這個詞,簡直就是學(xué)院派的典范。所以這期周刊,我們就重點引入的函數(shù)式編程,淺入淺出,一窺函數(shù)式編程的思想,可能讓你對編程語言的理解更加融會貫通一些。但從根本上來說,函數(shù)式編程就是關(guān)于如使用通用的可復(fù)用函數(shù)進行組合編程。 showImg(https://segmentfault.com/img/bVGQuc); 函數(shù)式編程(Functional Programming),一...
摘要:聲明式編程一種編程范式,與命令式編程相對立。常見的聲明式編程語言有數(shù)據(jù)庫查詢語言,正則表達式邏輯編程函數(shù)式編程組態(tài)管理系統(tǒng)等。函數(shù)式編程,特別是純函數(shù)式編程,嘗試最小化狀態(tài)帶來的副作用,因此被認為是聲明式的。 編程范式與函數(shù)式編程 一、編程范式的分類 常見的編程范式有:函數(shù)式編程、程序編程、面向?qū)ο缶幊?、指令式編程等。在面向?qū)ο缶幊痰氖澜?,程序是一系列相互作用(方法)的對象(Class...
摘要:所以我覺得函數(shù)式編程領(lǐng)域更像學(xué)者的領(lǐng)域。函數(shù)式編程的原則是完善的,經(jīng)過了深入的研究和審查,并且可以被驗證。函數(shù)式編程是編寫可讀代碼的最有效工具之一可能還有其他。我知道很多函數(shù)式編程編程者會認為形式主義本身有助于學(xué)習(xí)。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson?。 禮ou-Dont-Know-JS》作者 關(guān)于譯者:這是一個流淌著滬江血液...
摘要:今天這篇文章主要介紹函數(shù)式編程的思想。函數(shù)式編程通過最小化變化使得代碼更易理解。在函數(shù)式編程里面,組合是一個非常非常非常重要的思想。可以看到函數(shù)式編程在開發(fā)中具有聲明模式。而函數(shù)式編程旨在盡可能的提高代碼的無狀態(tài)性和不變性。 最開始接觸函數(shù)式編程的時候是在小米工作的時候,那個時候看老大以前寫的代碼各種 compose,然后一些 ramda 的一些工具函數(shù),看著很吃力,然后極力吐槽函數(shù)式...
摘要:函數(shù)式編程的哲學(xué)就是假定副作用是造成不正當(dāng)行為的主要原因。函數(shù)組合面向?qū)ο笸ǔ1槐扔鳛槊~,而函數(shù)式編程是動詞。尾遞歸優(yōu)化函數(shù)式編程語言中因為不可變數(shù)據(jù)結(jié)構(gòu)的原因,沒辦法實現(xiàn)循環(huán)。 零、前言 說到函數(shù)式編程,想必各位或多或少都有所耳聞,然而對于函數(shù)式的內(nèi)涵和本質(zhì)可能又有些說不清楚。 所以本文希望針對工程師,從應(yīng)用(而非學(xué)術(shù))的角度將函數(shù)式編程相關(guān)思想和實踐(以 JavaScript 為...
閱讀 2225·2021-09-22 15:25
閱讀 3610·2019-08-30 12:48
閱讀 2197·2019-08-30 11:25
閱讀 2332·2019-08-30 11:05
閱讀 720·2019-08-29 17:28
閱讀 3279·2019-08-26 12:16
閱讀 2602·2019-08-26 11:31
閱讀 1683·2019-08-23 17:08