在JS中實踐函數式編程【1】 -- 前言

寫在文章前

最近在瞭解函數式編程,菜狗如我,不總結就忘了本身學過啥。因此有了這個新坑。文中都是在看過文章以及書籍以後,增長了本身理解用通俗一點的方式講出來。這篇文章是一篇不正經的勸學前言,若是喜歡這個文章勞煩各位點個贊。若是文章中有什麼不恰當的地方,還請大佬在評論下方指出。感謝各位看官姥爺的閱讀,祝你們有個快樂的週末~javascript

JS中實踐函數式編程 -- 前言

做爲開發人員,或多或少都會聽到過函數式編程這個概念。 不少人都對這個概念似懂非懂,或許也讀過一些文章,也瞭解過一些概念。 咱們都很想知道,這個函數式編程到底在有什麼樣的應用,他到底爲啥用過的人都真香了。前端

做爲一個前端搬磚工,平常最熟悉的語言就是javascript。但其實平心而論,js 絕對不是函數式編程的最佳實踐語言。java

由於當初領導的我不要你以爲我要我以爲,js在竭盡所能的模仿JAVA。不只創造者在模仿,使用者也在模仿。曾經,js沒有類,用function創造類也要上。現在ES6官宣個(假)類,使得OO的味道更濃了。編程

但,其實從某些方面來說,js也不是不能實踐函數式編程。前端小夥伴都知道,js中沒有那些極其複雜的內置的數據結構。這使得FP的應用變得簡單了些。數組

最最主要的緣由,我就js用的6,你讓我寫別的語言,我也寫很差啊。:)數據結構

那,若是你恰好對函數式編程有興趣,也恰好除了據說用reduce不用foreach以外不知道其餘實踐的話,咱們就一塊兒來了解了解怎麼用js實踐函數式編程吧😉框架

函數式編程

函數式編程是一種編程思想,他的做用是讓你的代碼可以結構化。按照歸類法,同類別的還有其餘耳熟能詳的編程思想,好比說面向對象編程,面向過程編程。函數式編程

函數式編程英文是Functional programming , 業界簡稱FP。FP粉絲們說,FP好優秀,可讀性高,可測試性高。固然,OO粉(OBJECT-ORIENTED)們也是這麼說OO的. 若是說OO 的R技能是實例的話,FP的R技能就是函數了。經過組合函數就能夠實現複雜的功能,同時還能避免共享狀態和反作用。函數

給個學習的理由啊

兩個愛豆若是定位相似,必定會有粉絲出來寫我家愛豆比他家哪里哪里好。FP和OO的PK 也不例外,通稿滿天飛。好比怎麼更容易繼承,好比測試方便,怎麼好維護blablabla...學習

但我想給出幾個我學習的理由,可能不是那麼正經,也不是那麼政治正確,但的確是我學習的原因。

火啊

娛樂圈裏面,粉絲們看自家愛豆都是自帶濾鏡的,常常能聽到我家愛豆演技好,比上次進步了不少balabala。。。但吃瓜羣衆內心都明白的很,你說你家愛豆演技好,演的電視劇豆瓣評分平均2分,誰信啊。。 因此仍是要用數聽說話的。

在目前主流的框架或者庫中,咱們都能看到FP的影子.好比前端的主流框架中,REACT 和 Vue 都使用了可複用的組件和純函數來實現他們的內部功能(固然, 框架中也使用了大量的面向對象思想,這不能否認)。再好比 那些年咱們都用過的庫 Underscore或者lodash等等。都有函數式編程的應用。

因而可知,你平常用的那些庫那些框架都用了函數式編程的思想,那 你又有什麼理由不試一試呢?

難啊

面向過程的思想,之因此用的人多,是由於他和咱們平常思惟的方式相似,說白了,就是閉着眼睛也能寫出來的。 你們調侃業務邏輯是if else的堆砌, 也是由於他和咱們的思惟方式相似,不用認認真真思考,也不燒腦。

可是面向對象和函數式編程,你們會以爲應用起來略難,是由於他須要你仔細的思考,仔細的抽象,他和人類天然思考的方式不同。過程雖然痛苦,雖然艱難,雖然你的大腦宕機了n次,可是這會使你的代碼可讀性高,可複用行高,可延伸性高,媽媽不再擔憂產品加需求加功能了,仔細想想仍是美滋滋的呢,對吧。

新啊

維基百科中說, OO是在上個世紀70年代左右提出來的。這是什麼概念,就是他是媽媽輩的思想。歲月沉澱了OO, 大牛們慢慢總結出了一些極佳的OO實踐,以致於後人無需再探路便可用這個思想。

FP雖然他的數學相關歷史淵源比OO要早的多得多,可是正式的書面標準倒是在90年代左右才提出的,能夠說FP是咱們這一輩的。

學習FP,能讓你也成爲探路者之一,一不留神,也許你也是其餘人心中的大牛了。本身開拓的路走起來的成就感比走柏油馬路要高的多得多。

從我的角度來說,學習新鮮事物的一個好處就是能讓你更全面的看待你瞭解的事物。若是說閱讀源碼是在深度上進行知識的擴充,那麼學習新語言新思想就是在廣度上拓展認知。

兩代愛豆的PK

函數式編程爲啥你們都說難,比OO難?甲之蜜糖,乙之砒霜,OO和FP究竟有哪些差別?爲啥你們如今都在學習FP? OO難道要退役了?魯迅說,不作對比的通稿都是在耍流氓,看個哈利波特都在站隊呢,如今咱們也總結一下OO 和 FP。

實現方式

在OOP 語言中,對象Object是基本的實現方式。他是類Class的實例。 這和咱們的現實生活很類似。你們都是東西,東西和東西之間存在着關係。類就是對東西的抽象,人是人類的一個實例,我家狗是犬類的一個實例。

黑格爾說「純粹」的思想就是指擺脫了任何感性具體性和拘泥於外在對象的性質的思想。函數式編程就是這樣的一種思想。邏輯與數據徹底分離, 對象一旦創造出來就不可變,儘可能的避免共享狀態,以及純函數的提倡,這些規範都是以純粹爲核心的。(若是說純粹的定義是如此的話,人類就不是純粹的,畢竟人是會變心的。)

思想

舉個例子【1】,假設你是某部門主管,恰逢年終,是時候給各位小弟漲一波工資。若是用程序實現的話,要怎麼實現?

若是使用OOP思想,你的程序會這麼寫:

  1. 有個員工類,內置name和工資屬性,有個改變工資的方法來更改工資。
  2. 實例化你的員工們。
  3. 運行每一個員工的改工資函數,完成加工資。

那若是使用FP思想有什麼區別?

  1. 創造個員工羣數組,每一個員工是這個數組中的一員,他們都有名字和薪資這兩個屬性。
  2. 建立一個更改薪水的函數返回值是每一個員工的更改後薪水的副本。
  3. 建立一個遍歷員工數組的函數,使用上面更改某個員工薪水的函數進行更改薪水。
  4. 運行上面的這個函數,返回一個新的叫作快樂的小弟們的數組。

咱們能夠看到,這兩種思惟方式的不一樣。OOP中,更改的是本來的數據。可是FP中都是每次返回新的副本體現出不可更改性。

總結

咱們從思想和實現方式上概述了一下OO和FP的區別,在後面更新的文章中,會詳細的說明函數式編程以及在js的應用。固然,不存在不霸道的黃教主,也不存在某個單一思想就走天下的狀況,OO 和 FP 都頗有趣,選擇合適的纔是最好的。

另外,公司在招聘,有須要內推的小夥伴能夠私戳我~

【1】www.codenewbie.org/blogs/objec…

相關文章
相關標籤/搜索