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