摘要:所以我覺得函數(shù)式編程領(lǐng)域更像學(xué)者的領(lǐng)域。函數(shù)式編程的原則是完善的,經(jīng)過了深入的研究和審查,并且可以被驗(yàn)證。函數(shù)式編程是編寫可讀代碼的最有效工具之一可能還有其他。我知道很多函數(shù)式編程編程者會(huì)認(rèn)為形式主義本身有助于學(xué)習(xí)。
原文地址:Functional-Light-JS
原文作者:Kyle Simpson - 《You-Dont-Know-JS》作者
第 1 章:為什么使用函數(shù)式編程?關(guān)于譯者:這是一個(gè)流淌著滬江血液的純粹工程:認(rèn)真,是 HTML 最堅(jiān)實(shí)的梁柱;分享,是 CSS 里最閃耀的一瞥;總結(jié),是 JavaScript 中最嚴(yán)謹(jǐn)?shù)倪壿嫛=?jīng)過捶打磨練,成就了本書的中文版。本書包含了函數(shù)式編程之精髓,希望可以幫助大家在學(xué)習(xí)函數(shù)式編程的道路上走的更順暢。比心。
譯者團(tuán)隊(duì)(排名不分先后):阿希、blueken、brucecham、cfanlife、dail、kyoko-df、l3ve、lilins、LittlePineapple、MatildaJin、冬青、pobusama、Cherry、蘿卜、vavd317、vivaxy、萌萌、zhouyao
函數(shù)式編程人員: 沒有任何一個(gè)函數(shù)式編程者會(huì)把變量命名為 x,函數(shù)命名為 f,模塊代碼命名為“zygohistomorphic prepromorphism”。
James Iry ?@jamesiry 5/13/15
https://twitter.com/jamesiry/...
函數(shù)式編程(FP),不是一個(gè)新的概念,它幾乎貫穿了整個(gè)編程史。我不確定這么說是否合理,但是很確定的一點(diǎn)是:直到最近幾年,函數(shù)式編程才成為整個(gè)開發(fā)界的主流觀念。所以我覺得函數(shù)式編程領(lǐng)域更像學(xué)者的領(lǐng)域。
然而一切都在變。不只是從編程語言的角度,一些庫和框架都對(duì)函數(shù)式編程的興趣空前高漲。你很可能也在讀相關(guān)內(nèi)容,因?yàn)槟憬K于意識(shí)到函數(shù)式編程是不容忽視的東西。或者你跟我一樣,已經(jīng)嘗試很多次去學(xué)函數(shù)式編程,但卻很難理解所有的術(shù)語或數(shù)學(xué)符號(hào)。
無論你出于何目的翻閱本書,歡迎加入我們!
置信度我有一個(gè)非常簡單的前提,這是我作為軟件開發(fā)老師(JavaScript)所做的一切基礎(chǔ):你不能信任的代碼是你不明白的代碼。此外,對(duì)你不信任或不明白的代碼,你將不能確定這些代碼是否符合你的業(yè)務(wù)場景。代碼運(yùn)行時(shí)也只能祈求好運(yùn)。
信任是什么意思?信任是指你通過讀代碼,不僅是跑代碼,就能理解這段代碼能干什么事,而不只是停留在它可能是干什么的層面。也許我們不應(yīng)該總傾向于通過運(yùn)行測試程序,來驗(yàn)證程序的正確性。我并不是說測試不好,而是說我們應(yīng)該對(duì)代碼了如指掌,這樣我們在運(yùn)行測試代碼之前就會(huì)知道它肯定能跑通。
通過讀代碼就能對(duì)我們的程序更有信心,我相信函數(shù)式編程技術(shù)的基礎(chǔ)構(gòu)成,是本著這種心態(tài)設(shè)計(jì)的。理解函數(shù)式編程并在程序中用心實(shí)踐的人,得益于函數(shù)式編程已經(jīng)被證實(shí)的原則,能夠?qū)懗隹勺x性高和可驗(yàn)證的代碼,來達(dá)到他們想要的目的。
我希望你能通過理解輕量級(jí)函數(shù)式編程的原則,對(duì)你編寫的代碼更有信心,并且能在之后的路上越走越好。
交流渠道函數(shù)式編程為何如此重要?為了回答這個(gè)問題,我們退一萬步先來討論一下編程本身的重要性。
我認(rèn)為代碼不是電腦中的一堆指令,這么說你可能感到很奇怪。事實(shí)上,代碼能指示電腦運(yùn)行就是一個(gè)意外的驚喜。
我深信代碼的主要作用是方便人與人交流。
根據(jù)以往經(jīng)驗(yàn)?zāi)憧赡苤溃袝r(shí)候花很多時(shí)間“編程”其實(shí)只是讀現(xiàn)有的代碼。我們的大部分時(shí)間其實(shí)都是在維護(hù)別人的代碼(或自己的老代碼),只有少部分時(shí)間是在敲新代碼。
你知道研究過這個(gè)話題的專家給出了怎樣的數(shù)據(jù)嗎?我們在維護(hù)代碼過程中 70% 的時(shí)間花在了閱讀和理解代碼上。 也難怪全球程序員每天的平均代碼行數(shù)是 5 行。我們一天花七個(gè)半小時(shí)用來讀代碼,然后找出這 5 行代碼應(yīng)該寫在哪里。
我想我們應(yīng)該更多的關(guān)注一下代碼的可讀性。可能的話,不妨多花點(diǎn)時(shí)間在可讀性上。順便提一句,可讀性并不意味著最少的代碼量,對(duì)代碼的熟悉程度也會(huì)影響代碼的可讀性(這一點(diǎn)也是被證實(shí)過的)。
因此,如果我們要花費(fèi)更多的時(shí)間來關(guān)注代碼的可讀性和可理解性,那么函數(shù)式編程為我們提供了一種非常方便的模式。函數(shù)式編程的原則是完善的,經(jīng)過了深入的研究和審查,并且可以被驗(yàn)證。
如果我們使用函數(shù)式編程原則,我相信我們將寫出更容易理解的代碼。一旦我們知道這些原則,它們將在代碼中被識(shí)別和熟悉,這意味著當(dāng)我們讀取一段代碼時(shí),我們將花費(fèi)更少的時(shí)間來進(jìn)行定位。我們的重點(diǎn)將在于如何組建所有已知的“樂高片段”,而不是這些“樂高片段”是什么意思。
函數(shù)式編程是編寫可讀代碼的最有效工具之一(可能還有其他)。這就是為什么函數(shù)式編程如此重要。
可讀性曲線很重要的是,我先花點(diǎn)時(shí)間來講述一種多年來讓我感到困惑和沮喪的現(xiàn)象,在寫本書時(shí)該問題尤為尖銳。
這也可能是許多開發(fā)人員會(huì)遇到的問題。親愛的讀者,當(dāng)你讀這篇文章的時(shí)候,你可能會(huì)發(fā)現(xiàn)自己也會(huì)遇到同樣的狀況。但是要振作起來,堅(jiān)持下去,陡峭的學(xué)習(xí)曲線總會(huì)過去。
我們將在下一章更深入的討論這個(gè)問題。但是你可能寫過一些命令式的代碼,像 if 語句和 for 循環(huán)這樣的語句。這些語句旨在精確地指導(dǎo)計(jì)算機(jī)如何完成一件事情。聲明式代碼,以及我們努力遵循函數(shù)式編程原則所寫出的代碼,更專注于描述最終的結(jié)果。
還有個(gè)殘酷的問題擺在眼前,我在寫本書時(shí)花費(fèi)了很多時(shí)間在此問題上:我需要花費(fèi)更多的精力和編寫更多的代碼來提高代碼的可讀性,盡量減少乃至消除可能會(huì)引入程序錯(cuò)誤的代碼部分。
如果你期望用函數(shù)式編程重構(gòu)過的代碼能夠立刻變得更美觀、優(yōu)雅、智能和簡潔的話,這個(gè)有點(diǎn)不太現(xiàn)實(shí),這個(gè)變化是需要一個(gè)過程的。
函數(shù)式編程以另一種方式來思考代碼應(yīng)該如何組織才能使數(shù)據(jù)流更加明顯,并能讓讀者很快理解你的思想。這種努力是非常值得的,然而過程很艱辛,你可能需要花很多時(shí)間基于函數(shù)式編程來調(diào)整代碼直到代碼可讀性變得好一些。
另外,我的經(jīng)驗(yàn)是,轉(zhuǎn)換為聲明式的代碼之前,大約需要做六次嘗試。對(duì)我來說,編寫符合函數(shù)式編程的代碼更像是一個(gè)過程,而不是從一個(gè)范例到另一個(gè)范例的二進(jìn)制轉(zhuǎn)換。
我也會(huì)經(jīng)常對(duì)寫過的代碼進(jìn)行重構(gòu)。就是說,寫完一段代碼,過幾個(gè)小時(shí)或一天再看會(huì)有不一樣的感覺。通常,重構(gòu)之前的代碼是比較混亂不堪,所以需要反復(fù)調(diào)整。
函數(shù)式編程的過程并沒有讓我在藝術(shù)的畫布上筆下生輝,讓觀眾拍案叫好。相反,編程的過程很艱辛且歷歷在目,感覺像坐在一輛不靠譜的馬車穿過一片雜草叢生的灌木樹林。
我并不是試圖打消你的激情,而是真切希望你也能夠在編程的道路上披荊斬棘。過后我終于看到可讀性曲線向上延伸,所有付出都是值得的,我相信你也會(huì)有同樣的感受。
接受我們要系統(tǒng)的學(xué)習(xí)函數(shù)式編程,探索發(fā)現(xiàn)最基本的原則,我相信規(guī)范的函數(shù)式編程編程者會(huì)遵循這些原則并把它們作為開發(fā)的框架。但在大多數(shù)情況下,我們大都選擇避開晦澀的術(shù)語或數(shù)學(xué)符號(hào),否則很容易使學(xué)習(xí)者受挫。
我覺得一項(xiàng)技術(shù)你怎么稱呼它不重要,重要的是理解它是什么并且它是怎么工作的。這并不是說共享術(shù)語不重要,它無疑可以簡化經(jīng)驗(yàn)豐富的專業(yè)人士之間的交流。但對(duì)學(xué)習(xí)者來說,它有點(diǎn)分散人的注意力。
所以我希望這本書能更多地關(guān)注基本概念而不是花哨的術(shù)語。這并不是說沒有術(shù)語,肯定會(huì)有。但不要太沉迷于華麗的詞藻,追尋其背后的含義,這正是本書的目的。
我把這種欠缺正式實(shí)踐的編程思想稱為“輕量級(jí)函數(shù)式編程”,因?yàn)槲艺J(rèn)為真正的函數(shù)式編程的形式主義在于, 因?yàn)槲艺J(rèn)為如果你還不習(xí)慣函數(shù)式編程主張的思想,你可能很難用它。這不僅僅只是猜測,而是我的親身經(jīng)歷。即使在傳教函數(shù)式編程過程和完成這本書之后,我仍然可以說,函數(shù)式編程中術(shù)語和符號(hào)的形式化對(duì)于我來說是非常非常困難的。我已經(jīng)再三嘗試,發(fā)現(xiàn)大部分都是很難掌握的。
我知道很多函數(shù)式編程編程者會(huì)認(rèn)為形式主義本身有助于學(xué)習(xí)。但我認(rèn)為這是一個(gè)坑,當(dāng)你試圖用形式主義獲得某種安慰時(shí),你就會(huì)踩坑。但如果碰巧你有數(shù)學(xué)背景,甚至還有一些 CS 經(jīng)驗(yàn),這些問題對(duì)你來說就可能駕輕就熟。但是我們中的一些人不具備這些條件,不管我們怎么努力,形式主義總是阻礙我們前進(jìn)。
因此,這本書介紹了一些我認(rèn)為函數(shù)式編程會(huì)涉及到的概念,雖然不能直接讓你受益但可以幫你逐步理解函數(shù)式編程整個(gè)過程。
你不需要它如果你規(guī)劃一個(gè)項(xiàng)目花了很長時(shí)間,那么別人一定會(huì)告訴你“YAGNI” —— “你不需要它”。這個(gè)原則主要來自極限編程,強(qiáng)調(diào)構(gòu)建特性的高風(fēng)險(xiǎn)和成本,這個(gè)風(fēng)險(xiǎn)和成本源自于項(xiàng)目本身是否需要。
有時(shí)我們考慮到將來可能會(huì)用到一個(gè)功能,并且認(rèn)為現(xiàn)在構(gòu)建它能夠使得構(gòu)建其他應(yīng)用時(shí)更容易,后來意識(shí)到我們猜錯(cuò)了,原來這個(gè)功能并不需要,或者需要的完全是另外一套。另外一種情形是我們預(yù)估的功能是正確的,但構(gòu)建得太早的話,相當(dāng)于占用了開發(fā)現(xiàn)有功能的時(shí)間。有點(diǎn)像賠了夫人又折兵。
YAGNI 挑戰(zhàn),告訴我們:即使有的功能在某種情況下是反直覺的,我們也常常應(yīng)該推遲構(gòu)建,直到當(dāng)前需要這個(gè)功能。我們傾向于夸大一個(gè)功能未來重構(gòu)成本的心理估計(jì),但往往這個(gè)重構(gòu)是在將來需要時(shí)才會(huì)做。
上述情況對(duì)函數(shù)式編程也同樣適用,不過我還是要先敲個(gè)警鐘: 本書包含了大量你想去嘗試的有趣的開發(fā)模式,但這不意味著你的代碼一定要使用這些模式。
我與很多函數(shù)式編程開發(fā)人員的不同之處在于:你掌握了函數(shù)式編程并不意味著你一定得用它。此外,解決問題的方法很多,即使你掌握了更精煉的方法,能對(duì)維護(hù)和可擴(kuò)展性更"經(jīng)得起未來的考驗(yàn)",但更輕量的函數(shù)式編程模式可能更適合該場景。
一般來說,我建議你在代碼中尋求平衡,并且當(dāng)你掌握函數(shù)式編程的訣竅時(shí),在應(yīng)用的過程中也應(yīng)保持謹(jǐn)慎。在決定某個(gè)模式或抽象概念是否能使得部分代碼可讀性提高,或是否只是引入更智能的庫時(shí),YAGNI 的原則同樣適用。
提醒一句,一些未曾用過的擴(kuò)展點(diǎn)不僅浪費(fèi)精力,而且可能妨礙你的工作。
Jeremy D. Miller @jeremydmiller 2/20/15
https://twitter.com/jeremydmi...
記住,你編寫的每一行代碼之后都要有人來維護(hù),這個(gè)人可能是你的團(tuán)隊(duì)成員,也可能是未來的你。如果代碼寫的太過復(fù)雜,那么無論誰來維護(hù)都會(huì)對(duì)你炫技式的故作聰明的做法倍感壓力。
最好的代碼是可讀性高的代碼,因?yàn)樗谡_的(理想主義)和必然的(正確的)之間尋求到了恰到好處的平衡。
資源我撰寫這篇文章的過程參考了許多不同的資源。我相信你也會(huì)從中受益,所以我想花點(diǎn)時(shí)間把它們列出來。
書籍推薦一些你務(wù)必要閱讀的函數(shù)式編程 / JavaScript 書籍:
Professor Frisby"s Mostly Adequate Guide to Functional Programming by Brian Lonsdorf
JavaScript Allongé by Reg Braithwaite
Functional JavaScript by Michael Fogus
博客和站點(diǎn)一些其他作者和相關(guān)內(nèi)容供查閱:
Fun Fun Function Videos by Mattias P Johansson
Awesome函數(shù)式編程JS
Kris Jenkins
Eric Elliott
James A Forbes
James Longster
André Staltz
Functional Programming Jargon
Functional Programming Exercises
一些庫本書中的代碼段不使用庫。我們發(fā)現(xiàn)的每一個(gè)操作,將派生出如何在獨(dú)立的、普通的 JavaScript 中實(shí)現(xiàn)它。然而,當(dāng)你開始使用函數(shù)式編程構(gòu)建更多的真正代碼時(shí),你很快就會(huì)使用現(xiàn)有庫中所提供的更可靠高效的通用功能。
順便說一下,你要確保檢查你所使用的庫函數(shù)的文檔,以確保你知道它們是如何工作的。它與本文中構(gòu)建的代碼有許多相似之處,但毫無疑問即便跟最流行的庫相比還是會(huì)存在一些差異。
下面是一些流行的 JavaScript 版本的函數(shù)式編程庫,可以開啟你的探索之路:
Ramda
lodash/fp
functional.js
Immutable.js
附錄 C 展示了用到了本書中一些示例的庫。
總結(jié)這就是 JavaScript 輕量級(jí)函數(shù)式編程。我們的目標(biāo)是學(xué)會(huì)與代碼交流,而不是在符號(hào)或術(shù)語的大山下被壓的喘不過氣。希望這本書能開啟你的旅程!
【上一章】翻譯連載 |《JavaScript 輕量級(jí)函數(shù)式編程》- 引言&前言
【下一章】翻譯連載 |《JavaScript 輕量級(jí)函數(shù)式編程》- 第 2 章:函數(shù)基礎(chǔ)
iKcamp原創(chuàng)新書《移動(dòng)Web前端高效開發(fā)實(shí)戰(zhàn)》已在亞馬遜、京東、當(dāng)當(dāng)開售。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/85068.html
摘要:我稱之為輕量級(jí)函數(shù)式編程。序眾所周知,我是一個(gè)函數(shù)式編程迷。函數(shù)式編程有很多種定義。本書是你開啟函數(shù)式編程旅途的絕佳起點(diǎn)。事實(shí)上,已經(jīng)有很多從頭到尾正確的方式介紹函數(shù)式編程的書了。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson - 《You-Dont-Know-JS》作者 譯者團(tuán)隊(duì)(排名不分先后):阿希、blueken、brucecham、...
摘要:一旦我們滿足了基本條件值為,我們將不再調(diào)用遞歸函數(shù),只是有效地執(zhí)行了。遞歸深諳函數(shù)式編程之精髓,最被廣泛引證的原因是,在調(diào)用棧中,遞歸把大部分顯式狀態(tài)跟蹤換為了隱式狀態(tài)。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個(gè)流淌著滬江血液的純粹工程:認(rèn)真,是 HTML 最堅(jiān)實(shí)的梁柱;...
摘要:把數(shù)據(jù)的流向想象成糖果工廠的一條傳送帶,每一次操作其實(shí)都是冷卻切割包裝糖果中的一步。在該章節(jié)中,我們將會(huì)用糖果工廠的類比來解釋什么是組合。糖果工廠靠這套流程運(yùn)營的很成功,但是和所有的商業(yè)公司一樣,管理者們需要不停的尋找增長點(diǎn)。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個(gè)流淌...
摘要:這就是積極的函數(shù)式編程。上一章翻譯連載第章遞歸下輕量級(jí)函數(shù)式編程你不知道的姊妹篇原創(chuàng)新書移動(dòng)前端高效開發(fā)實(shí)戰(zhàn)已在亞馬遜京東當(dāng)當(dāng)開售。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個(gè)流淌著滬江血液的純粹工程:認(rèn)真,是 HTML 最堅(jiān)實(shí)的梁柱;分享,是 CSS 里最閃耀的一瞥;總...
摘要:為了盡可能提升互通性,已經(jīng)成為函數(shù)式編程庫遵循的實(shí)際標(biāo)準(zhǔn)。與輕量級(jí)函數(shù)式編程的概念相反,它以火力全開的姿態(tài)進(jìn)軍的函數(shù)式編程世界。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個(gè)流淌著滬江血液的純粹工程:認(rèn)真,是 HTML 最堅(jiān)實(shí)的梁柱;分享,是 CSS 里最閃耀的一瞥;總結(jié),...
閱讀 3043·2021-09-08 10:43
閱讀 1036·2019-08-30 15:53
閱讀 982·2019-08-30 13:51
閱讀 846·2019-08-29 14:03
閱讀 804·2019-08-26 18:35
閱讀 1235·2019-08-26 13:38
閱讀 1585·2019-08-26 10:34
閱讀 3503·2019-08-26 10:21