javascript函數(shù)式編程

參考書(shū)籍:《javascript 函數(shù)式編程》

什么是函數(shù)式編程户辱?

函數(shù)式編程通過(guò)函數(shù)將值轉(zhuǎn)換為抽象單元透揣,接著用于構(gòu)建軟件系統(tǒng)俺抽。

函數(shù)式編程技術(shù)有什么?

  • 確定抽象沸伏,并為其構(gòu)建函數(shù)
  • 利用已有的函數(shù)來(lái)構(gòu)建更為復(fù)雜的抽象
  • 通過(guò)將現(xiàn)有的函數(shù)傳給其他的函數(shù)來(lái)構(gòu)建更加復(fù)雜的抽象

為什么函數(shù)式編程很重要糕珊?

首先先從面向?qū)ο蟮慕嵌葋?lái)講,我們主要目標(biāo)會(huì)將問(wèn)題分解毅糟。如圖所示红选。

將一個(gè)問(wèn)題分解為面向?qū)ο蟮膸讉€(gè)部件

把這些對(duì)象聚集起來(lái),組合成更大的部件


對(duì)象組合起來(lái)形成更大的對(duì)象

從圖中不難看出姆另,里面有很多重復(fù)的函數(shù)纠脾,因?yàn)槊嫦驅(qū)ο螅詴?huì)著重于解決每個(gè)組件里的需求蜕青。
相比較而言苟蹈,嚴(yán)格的函數(shù)式編程也會(huì)將一個(gè)問(wèn)題分為幾部分函數(shù)來(lái)解決。

將一個(gè)問(wèn)題分解為幾個(gè)函數(shù)式的部分

與面向?qū)ο缶幊填?lèi)似右核,函數(shù)式編程也通過(guò)“黏結(jié)”或“組合”其他函數(shù)的方式來(lái)構(gòu)建更大的函數(shù)慧脱,實(shí)現(xiàn)更加抽象的行為。


通過(guò)函數(shù)組合來(lái)實(shí)現(xiàn)更多的行為

在一個(gè)面向?qū)ο笙到y(tǒng)的內(nèi)部贺喝,我們會(huì)發(fā)現(xiàn)對(duì)象之間的交互會(huì)引起各個(gè)對(duì)象內(nèi)部狀態(tài)的變化菱鸥,而整個(gè)系統(tǒng)的變化就是由這些狀態(tài)變化混合來(lái)形成的。
相比之下躏鱼,函數(shù)式編程系統(tǒng)則努力減少可見(jiàn)的狀態(tài)修改氮采。

函數(shù)式編程以命令的方式構(gòu)建系統(tǒng),并通過(guò)顯性的狀態(tài)改變縮減到最小來(lái)變得更加模塊化染苛。實(shí)踐中的函數(shù)式編程不是以消除狀態(tài)改變?yōu)槟康娜的菍⒁阎到y(tǒng)中突變盡量縮小到最小區(qū)域中

以函數(shù)為抽象單元

抽象方法是指隱藏了實(shí)現(xiàn)細(xì)節(jié)的函數(shù)。

    //未隱藏細(xì)節(jié)的函數(shù)
    function parseAge(age) {
        if (!_.isString(age)) throw new Error('Expecting a string');
        var a;
        console.log("Attempting to parse an age");

        a = parseInt(age, 10);
        if(_.isNaN(a)) {
            console.log(["Could not parse age:", age].join(' '));
            a = 0;
        }
        return a;
    }

    //隱藏細(xì)節(jié)
    function fail(thing) {
         throw new Error(thing);
    } 

    function warn(thing) {
        console.log(["WARNING", thing].join(' '));
    }

    function note(thing) {
        console.log(["NOTE", thing].join(' '));
    }

    function parseAge(age) {
        if(!_.isString(age)) fail("Expecting a string");
        var a;

        note("Attempt to parse an age");
        a = parseInt(age, 10);

        if(_.isNaN(a)) {
            warn(["Could not parse age:", age].join(' '));
            a = 0;
        }
        return a;
    }

對(duì)比上述代碼茶行,其實(shí)現(xiàn)的功能其實(shí)是一樣的躯概,不同的是現(xiàn)在報(bào)告錯(cuò)誤、信息和警告的想法已經(jīng)被抽象化了畔师。這樣在修改輸出錯(cuò)誤娶靡、信息和警告呈現(xiàn)的方式,就不用修改相應(yīng)的代碼行看锉,以及其他地方的類(lèi)似輸出模式姿锭,而是直接添加錯(cuò)誤函數(shù)的參數(shù)塔鳍。

封裝和隱藏

在面向?qū)ο笾校庋b是指一種將若干個(gè)數(shù)據(jù)與用來(lái)操縱它們的特定操作包裝起來(lái)的方式呻此。比如說(shuō)新建一個(gè)對(duì)象轮纫,就可以包含一個(gè)數(shù)組及操縱這個(gè)數(shù)組的push、pop方法趾诗,這就是封裝蜡感。
然而,有時(shí)在限制元素的可見(jiàn)性時(shí)也會(huì)用到封裝恃泪,這個(gè)時(shí)候就稱(chēng)為數(shù)據(jù)隱藏郑兴,在js中就使用閉包來(lái)隱藏?cái)?shù)據(jù)(閉包有好有壞,使用需慎重贝乎,否則很容易把自己搞暈情连,并且可能會(huì)使代碼可讀性變差。)

以函數(shù)為行為單元

就是用函數(shù)來(lái)進(jìn)行簡(jiǎn)單的存儲(chǔ)和傳遞基本行為览效,函數(shù)命名通常會(huì)讓人一目了然知道該函數(shù)得到的結(jié)果却舀,發(fā)出的行為。比如sort函數(shù)锤灿,就會(huì)知道是分類(lèi)的函數(shù)挽拔。

數(shù)據(jù)抽象

函數(shù)式編程旨在用最簡(jiǎn)單的數(shù)據(jù)來(lái)實(shí)現(xiàn)高層級(jí)的行為。在代入簡(jiǎn)單數(shù)據(jù)后最終實(shí)現(xiàn)復(fù)雜的行為 但校。


代入?yún)?shù)x得到各種行為

我們會(huì)發(fā)現(xiàn)螃诅,在處理與人有關(guān)的數(shù)據(jù)時(shí)更適合用函數(shù)式編程的方式,而面向?qū)ο蟮姆椒ǜm合與模擬人状囱。

函數(shù)式編程速度术裸。。

在函數(shù)式編程中經(jīng)常會(huì)把各種行為抽象出來(lái)成為單獨(dú)的函數(shù)亭枷,然后再組合起來(lái)執(zhí)行袭艺。這樣在我們之前講到的Event loop線(xiàn)程中我們會(huì)感動(dòng)困惑,因?yàn)樵趈avascript中那樣事件一次一次掛載起來(lái)執(zhí)行的話(huà)速度可能會(huì)很慢叨粘。

嗯猾编,是的,應(yīng)該是會(huì)這樣的宣鄙。因此袍镀,在一些把速度作為第一要領(lǐng)比如游戲界面的網(wǎng)站我們會(huì)更傾向于使用面向?qū)ο缶幊?/strong>。
然而在一些復(fù)雜度較高冻晤,項(xiàng)目較為龐大的時(shí)候,使用函數(shù)式編程則會(huì)讓我們的代碼可讀性增強(qiáng)绸吸,而且處理數(shù)據(jù)的時(shí)候出錯(cuò)的可能性更低瞳腌。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逗嫡,一起剝皮案震驚了整個(gè)濱河市加匈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌叉存,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件度帮,死亡現(xiàn)場(chǎng)離奇詭異歼捏,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)笨篷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)瞳秽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人率翅,你說(shuō)我怎么就攤上這事练俐。” “怎么了冕臭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵腺晾,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我辜贵,道長(zhǎng)悯蝉,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任托慨,我火速辦了婚禮鼻由,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘榴芳。我一直安慰自己嗡靡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布窟感。 她就那樣靜靜地躺著讨彼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪柿祈。 梳的紋絲不亂的頭發(fā)上哈误,一...
    開(kāi)封第一講書(shū)人閱讀 49,837評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音躏嚎,去河邊找鬼蜜自。 笑死,一個(gè)胖子當(dāng)著我的面吹牛卢佣,可吹牛的內(nèi)容都是我干的重荠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼虚茶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼戈鲁!你這毒婦竟也來(lái)了仇参?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤婆殿,失蹤者是張志新(化名)和其女友劉穎诈乒,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體婆芦,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怕磨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了消约。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肠鲫。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖荆陆,靈堂內(nèi)的尸體忽然破棺而出滩届,到底是詐尸還是另有隱情,我是刑警寧澤被啼,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布帜消,位于F島的核電站,受9級(jí)特大地震影響浓体,放射性物質(zhì)發(fā)生泄漏泡挺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一命浴、第九天 我趴在偏房一處隱蔽的房頂上張望娄猫。 院中可真熱鬧,春花似錦生闲、人聲如沸媳溺。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)悬蔽。三九已至,卻和暖如春捉兴,著一層夾襖步出監(jiān)牢的瞬間蝎困,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工倍啥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留禾乘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓虽缕,卻偏偏與公主長(zhǎng)得像始藕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • JavaScript是一門(mén)很神奇的語(yǔ)言鳄虱,作為一門(mén)現(xiàn)代化的語(yǔ)言弟塞,他有很多很有特色的東西凭峡,這些東西拙已,讓我們看到了一個(gè)十...
    一只當(dāng)飛行員的兔子閱讀 683評(píng)論 0 9
  • 長(zhǎng)久以來(lái),面向?qū)ο笤?JavaScript 編程范式中占據(jù)著主導(dǎo)地位摧冀。不過(guò)倍踪,最近人們對(duì)函數(shù)式編程的興趣正在增長(zhǎng)。函...
    神刀閱讀 459評(píng)論 0 0
  • 編程范式 編程范式是:解決編程中的問(wèn)題的過(guò)程中使用到的一種模式索昂,體現(xiàn)在思考問(wèn)題的方式和代碼風(fēng)格上建车。這點(diǎn)很像語(yǔ)言,語(yǔ)...
    vivaxy閱讀 346評(píng)論 0 3
  • 常用的編程思想有一下幾類(lèi):1椒惨、面向過(guò)程編程缤至,最初級(jí)的,想到哪寫(xiě)到哪康谆;2领斥、面向?qū)ο缶幊蹋允挛餅橹行牡木幊趟枷胛职担压?..
    JokerPeng閱讀 725評(píng)論 0 6
  • 我教會(huì)了你用刀 你竟用刀來(lái)捅我 然而你卻死的很慘 因?yàn)槟悴恢?其實(shí)我還準(zhǔn)備教你用槍 本想今天告訴你 刀的最高境界...
    清凈獨(dú)覺(jué)閱讀 464評(píng)論 6 29