国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

函數(shù)式編程(一)

羅志環(huán) / 3040人閱讀

摘要:函數(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)前主流觀點還是避免使用這種并行。

實現(xiàn)函數(shù)式編程的技術(shù)

這里我們先不展開這些技術(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

相關(guān)文章

  • SegmentFault 技術(shù)周刊 Vol.16 - 淺入淺出 JavaScript 函數(shù)編程

    摘要:函數(shù)式編程,一看這個詞,簡直就是學(xué)院派的典范。所以這期周刊,我們就重點引入的函數(shù)式編程,淺入淺出,一窺函數(shù)式編程的思想,可能讓你對編程語言的理解更加融會貫通一些。但從根本上來說,函數(shù)式編程就是關(guān)于如使用通用的可復(fù)用函數(shù)進行組合編程。 showImg(https://segmentfault.com/img/bVGQuc); 函數(shù)式編程(Functional Programming),一...

    csRyan 評論0 收藏0
  • 編程函數(shù)編程

    摘要:聲明式編程一種編程范式,與命令式編程相對立。常見的聲明式編程語言有數(shù)據(jù)庫查詢語言,正則表達式邏輯編程函數(shù)式編程組態(tài)管理系統(tǒng)等。函數(shù)式編程,特別是純函數(shù)式編程,嘗試最小化狀態(tài)帶來的副作用,因此被認為是聲明式的。 編程范式與函數(shù)式編程 一、編程范式的分類 常見的編程范式有:函數(shù)式編程、程序編程、面向?qū)ο缶幊?、指令式編程等。在面向?qū)ο缶幊痰氖澜?,程序是一系列相互作用(方法)的對象(Class...

    noONE 評論0 收藏0
  • 翻譯連載 |《你不知道的JS》姊妹篇 |《JavaScript 輕量級函數(shù)編程》- 第 1 章:

    摘要:所以我覺得函數(shù)式編程領(lǐng)域更像學(xué)者的領(lǐng)域。函數(shù)式編程的原則是完善的,經(jīng)過了深入的研究和審查,并且可以被驗證。函數(shù)式編程是編寫可讀代碼的最有效工具之一可能還有其他。我知道很多函數(shù)式編程編程者會認為形式主義本身有助于學(xué)習(xí)。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson?。 禮ou-Dont-Know-JS》作者 關(guān)于譯者:這是一個流淌著滬江血液...

    omgdog 評論0 收藏0
  • javascript 函數(shù)編程思想

    摘要:今天這篇文章主要介紹函數(shù)式編程的思想。函數(shù)式編程通過最小化變化使得代碼更易理解。在函數(shù)式編程里面,組合是一個非常非常非常重要的思想。可以看到函數(shù)式編程在開發(fā)中具有聲明模式。而函數(shù)式編程旨在盡可能的提高代碼的無狀態(tài)性和不變性。 最開始接觸函數(shù)式編程的時候是在小米工作的時候,那個時候看老大以前寫的代碼各種 compose,然后一些 ramda 的一些工具函數(shù),看著很吃力,然后極力吐槽函數(shù)式...

    YPHP 評論0 收藏0
  • JavaScript 函數(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 為...

    hoohack 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<