函數式編程是未來的最佳編碼範例嗎?

2020-11-05 聞數起舞


函數式編程已經存在了六十年了,但是到目前為止,它並沒有停止克服面向對象編程的普遍使用。 隨著機器學習和大數據的爆炸性增長,由於可以並行化純函數的簡單性,函數式編程正變得越來越流行。 數據分析任務和工作流的代碼也更易於遵循,測試和維護,使用功能範式有助於日後的使用。

甚至像Java和Python這樣的面向對象的程式語言也從內置於地圖,過濾器和簡化功能的功能性編程中採用了巨大的概念。 它們還具有聲明純內聯lambda函數以及創建一等和高階函數以將函數作為參數傳遞的功能。

簡而言之,函數式編程需要為固定變量構建純函數並通過其響應更改狀態。 相反,其他程式語言具有通過更改程序中變量引用來更改應用程式狀態的能力。 您可以在本文中了解功能編程與面向對象程序的更多區別。

由於其純粹的性質,函數式編程對於令人垂涎的任務(如機器學習和數據分析)印象深刻。 但是,這並不意味著您應該放棄其他程式語言而完全發揮作用,因為每種程式語言都具有比其他程式語言更好的任務。 但是,至關重要的是要學習基本原理,以便在必要時可以將其應用於自己的利益。 出於這些原因,功能編程被稱為未來,但也許機器學習和大數據的未來才是軟體開發的全部。

考慮到這一點,讓我們看看為什麼軟體開發人員會愛上函數式編程,使它成為未來計算機科學的組成部分。 我們還考慮一下面向對象編程的一些功能,看看功能性編程是否可以完全替代它。 劇透:兩者可能會在軟體開發甚至同一應用程式中共存。

純函數的使用

純函數會重複產生相同的結果,並且沒有影響最終結果的外部值。 由於純函數的這一特性,使用函數編程創建的算法可輕鬆識別和糾正錯誤。

純函數通常採用數學求解方法。 例如,如果您在計算器中鍵入3 + 3,答案將為6。純函數也是如此。 不涉及外部元素,因此使功能程序純淨。 一個示例是內聯lambda函數,該函數將n作為輸入並返回n + n。

調試對於程式設計師和開發人員都是一個長期的問題,這就是為什麼他們轉向功能編程的原因,因為它的程序由於使用純函數而易於調試。

最佳透明度

> Photo by Pixabay on Pexels.com

純函數的使用使函數式編程完全透明。 函數式程式語言中純函數和不純函數之間的顯著區別極大地提高了這些程序實現的透明性。

此外,純函數僅在不考慮外部元素的情況下工作。 這意味著他們僅處理用戶的條目。 相反,非功能性程式語言會導致額外的輸入和返回輸出,這些輸入和返回輸出與用戶的信息有些不同。

由於函數式編程不涉及任何外部元素,因此該算法不會偏離用戶的輸入。 因此,無論輸出如何,它都符合信息並且沒有任何危險的方面。

提高可讀性

函數式編程提供了許多好處,包括提高了值的可讀性。 使用純值意味著它們的狀態一直保持到最後。 這些值還增強了程序的可讀性,這使開發人員不必費力即可掌握代碼。

由於絕大多數函數式程式語言都是高級語言,並且用戶將每個函數都視為一種價值,因此對於開發人員而言,毫不費力地調用該函數程序並將這些值最終合併到其他各種函數中即可。

靜態變量

用外行的語言來說,"變量"是不斷變化的狀態。 但是,這與功能編程相反。

在這裡,程式設計師/開發人員無法立即修改變量; 它已經被煽動。 人們可能會認為,變量的恆定性與遞歸結合可能會導致性能下降。

但是,有必要理解此功能可確保程序直到最後都保持不變。 除了函數式編程通過使用純函數提供的寶貴保護外,這種方法還使函數式程式語言在安全性方面優於同類語言。

安全性是軟體開發中的關鍵要素,促使開發人員轉向功能編程以提高其系統安全性。

無縫並行編程

> Photo by Isaac Quesada on Pexels.com

通常認為函數式編程具有開發完整的並行程序的能力。 不可否認,開發應用程式是最容易被理解的使用方案之一,尤其是在採用功能性編程的開發人員中。

其背後的主要因素是各種函數式程式語言中變量的靜態應用。 由於純函數不會修改變量,而只能在用戶輸入上起作用,因此處理並行性變得不太複雜。

此外,考慮到程序的可靠性提高,大大減少了出錯的餘地,從而提高了程序的效率。

驗證功能籤名

籤名驗證是軟體開發的關鍵方面。 與其他排除函數程序的方式相比,函數程序設計因其使函數籤名極其有效和值得的能力而受到高度評價。 函數式程式語言的純變量可確保籤名概述有關函數工作的所有信息以及其參數詳細信息和任何其他必要的詳細信息。

此外,這是功能編程成為軟體開發的未來的另一個實際原因。

作為一種功能性程式語言,Scala允許開發人員同時使用OOP和FP(功能性編程)編寫代碼。 Scala主要致力於使用專有的純函數和恆定值編寫軟體。 該語言正在逐漸發揮作用。

為什麼函數式編程不會棄用面向對象的編程

> Photo by Christina Morillo on Pexels.com

面向對象編程(OOP)已成為軟體開發的重要組成部分。 儘管引入了許多程式語言(例如C ++和Java),但是希望開發移動軟體的開發人員必須掌握面向對象的方法。 考慮到OOP語言(例如PHP和Python)的流行,這同樣適用於複雜的Web開發。

一些IT專業人員認為面向對象的編程已過時,因此掌握其概念完全是浪費時間。 他們發現使用對象代替像Visual Basic這樣的語言中的傳統編程的自上而下的方法是不合邏輯的。

如果您已經編寫了此類軟體的代碼,則可能習慣於將複雜的問題分解為不太複雜的問題,並以代碼為單位分別解決它們。 如果您對函數式編程有所了解,可以將代碼元素視為適當的數學函數,並禁止它們篡改其他方面,即,輸出反映了用戶的輸入。

儘管功能編程越來越流行,但是仍然使用面向對象的編程。 函數式編程未棄用OOP的一些原因包括:

通過繼承重用代碼

假設一個人除了您的桌子對象還想要金屬桌子對象,而另一個人需要玻璃對象。 每個人都單獨構建對象,但是卻意識到它們之間的相似之處。 每個對象只是一個不同類型的表。 這就是繼承方法證明可以節省時間的地方。 在這裡,您需要創建一個通用類(表),然後定義子類(金屬和玻璃)以採用通用玻璃功能。

當然,金屬和玻璃桌具有其獨特的品質和功能。 由於兩者之間存在相似之處,因此兩個繼承類可以重用主流代碼,而不必再次編寫這些函數。

例如,如果您想對所有表對象進行更改,而不論其類型如何,您所需要做的就是對表類進行調整,並且所有表對象都將採用新代碼。 這就是為什麼某些開發人員仍然更喜歡OOP而不是函數式編程的原因。

多態性的靈活性

根據上面的示例,您不需要很多功能即可上手。 例如,金屬和玻璃物體具有某些共性,但每個物體都有其他獨特的特徵。

有效的問題解決

像C這樣的程式語言在編程世界中享有良好的聲譽,但是除非您對此感到滿意,否則強烈建議不要使用自上而下的語言開發軟體。 這是因為由於複雜性,項目崩潰的可能性更高。 另一方面,以功能程式語言(例如Haskell或ML)編寫程序可以是常規的。

一旦開始使用面向對象的編程,它通常是最自然,最明智的方法。 OOP語言使開發人員可以將您的軟體分為中等大小的問題,這些問題可以獨立解決。

數據抽象

數據抽象不會向用戶顯示瑣碎的元素; 相反,它僅顯示基本細節。 例如,汽車被視為車輛,而不是其零件。

數據抽象被稱為僅指出忽略無關細節的對象必不可少的特徵的過程。 對象的功能和特性使它與其他具有相似性的對象區分開來,以幫助對對象進行分類/分組。

以某人操作計算機為例。 他只知道按下電源按鈕可以打開/關閉計算機。 他或她不了解打開和關閉PC電源的PC內部機制。 這就是抽象的全部。

在OOP程式語言中,抽象是通過接口和抽象類實現的。 通過使用接口可以實現100%的抽象。

結論

對於不可變的代碼和並發而言,功能性編程儘管比面向對象的編程更受青睞,但離OOP的使用還有很遠的距離。 如上所述,只有通過面向對象的編程才能實現代碼的可重用性,數據抽象,有效的問題解決以及多態性的靈活性。 在系統安全方面,功能性編程勝過面向對象的編程,因此功能性編程才是未來。 尤其是隨著越來越多的大公司在其業務應用程式中依賴機器學習和人工智慧。 函數式編程在編寫代碼以訓練可在大型計算機主機網絡上進行訓練的ml模型方面尤其重要。

最初於2020年10月30日發布在http://beapython.dev上。

(本文翻譯自Use Ubuntu Server 20.04 Cloud Image to Create a KVM Virtual Machine with Fixed Network Properties的文章《Is Functional Programming the Future's Best Coding Paradigm》,參考:https://medium.com/swlh/is-functional-programming-the-futures-best-coding-paradigm-63461115abc3)

相關焦點

  • 函數式編程那些事兒
    函數式編程是一種編程範式,在其中它試圖將每個函數都綁定到純數學函數中。這是一種聲明式的編程風格,著重於解決什麼而不是如何解決。Clojure,Common Lisp,Erlang,Haskell和Scala是遵循函數式編程方法的一些著名程式語言。編程範例基於lambda演算,下面簡要說明:Lambda演算它使用表達式來代替語句。
  • Java函數式編碼結構-好程式設計師
    好程式設計師Java培訓分享Java函數式編碼結構,本文將探討三種下一代JVM語言:Groovy、Scala和Clojure,比較並對比新的功能和範例,讓Java開發人員對自己近期的未來發展有大體的認識
  • JavaScript函數式的React
    它的成功有很多因素,但也許其中一個因素是清晰有效的編程方法。在 React的世界中,UI 是由一個一個組件所組成的。組件可以組合在一起以創建其他組件, 應用本身就是一個包含了所有組件的一個大組件。開發者使用 React 會很容易聯想到:面向對象編程 。因為定義組件的語法本身,就會給人這種感覺:然鵝,在面向對象的的表象之下,React隱藏了一種函數式的特質。
  • 函數式編程
    來源:酷殼網-陳皓 連結:https://coolshell.cn/articles/10822.html當我們說起函數式編程來說,我們會看到如下函數式編程的長相:函數式編程的三大特性函數式編程的幾個技術map & reduce:這個技術不用多說了,函數式編程最常見的技術就是對一個集合做Map和Reduce操作。這比起過程式的語言來說,在代碼上要更容易閱讀。
  • Java如何支持函數式編程?
    Java是面向對象的語言,無法直接調用一個函數。Java 8開始,引入了函數式編程接口與Lambda表達式,便於開發者寫出更少更優雅的代碼。什麼是函數式編程?函數式編程的特點是什麼?函數式編程並非一個很新的東西,早在50多年前就已經出現了。近幾年,函數式編程越來越被人關注,出現了很多新的函數式程式語言,比如Clojure、Scala、Erlang等。一些非函數式程式語言也加入了很多特性、語法、類庫來支持函數式編程,比如Java、Python、Ruby、JavaScript等。除此之外,Google Guava也有對函數式編程的增強功能。
  • Web開發的最佳程式語言——根據IEEE Spectrum發布的2020年的報告
    如果您來自軟體開發領域,那麼就會知道為Web開發選擇正確的程式語言的痛苦。 每年,幾種程式語言都在流行,然後流行。 因此,選擇最佳的程式語言始終是一個令人困惑的話題。今天,我們將通過IEEE Spectrum提供的2020年排名前10位的程式語言的介紹,優勢,市場研究和未來範圍,來解決您採用正確的程式語言所面臨的問題。
  • 程式設計師為何與函數式編程「墜入愛河」?
    簡單來說,函數式編程就是為不可變變量構建函數。與之相反,面向對象的編程則是有一組相對固定的函數,而用戶主要是修改或添加新變量。由於函數式編程的特性,它非常適合完成諸如數據分析和機器學習之類的需求任務。但是這並不意味著用戶要告別面向對象的編程,轉而完全使用函數式編程。但用戶需要了解其基本原理,以便在適當的時候使用它們以發揮優勢。
  • Python的最佳實踐和技巧,助您快速有效地編碼
    全文共5425字,預計學習時長16分鐘Python作為最受初學者歡迎的程式語言之一,是世界各地學校中被最廣泛教授的語言。然而,學習Python並非易事。首先,需要找到最佳的在線學習途徑,而這本身就很困難。市面上有成千上萬種不同的Python課程和輔導,都聲稱自己是最好的。的確,僅憑練習是不夠完美的,但完美的練習卻是完美的。
  • javascript函數式編程基礎指北
    JavaScript 作為一種典型的多範式程式語言,這兩年隨著React\vue的火熱,函數式編程的概念也開始流行起來,lodashJS、folktale等多種開源庫都使用了函數式的特性。程序的本質是:根據輸入通過某種運算得到輸出函數式編程(Functional programming)是一種編程思想/範式 ,其核心思想是將運算過程抽象成函數(指數學的函數而不是程序的方法或函數即純函數),也就是面向函數編程,描述函數/數據 之間的映射,做到最大程度的復用; 學習函數式編程真正的意義在於讓你認識到一種用函數的角度去抽象問題的思路
  • 面試被虐題:說說 JVM 系語言的函數式編程
    >函數式編程在上世紀五十年代就有了,只不過在工業界一直不溫不火,最近十年才被廣泛認知。其理論基礎也並非為編程而設計,而是一種數學抽象(Lamda演算),其實初中就學過了,λ表達式。在 JS(建議把 JS 作為函數式編程思想學習的入門語言,Java 的實現略顯臃腫,可能不太便於理解)當中,函數式編程算是應用比較多的了。各現代高級程式語言,都或多或少地支持了函數式編程。
  • 函數式編程/lambda表達式入門
    函數式編程/lambda表達式入門本篇主要講解 lambda表達式的入門,涉及為什麼使用函數式編程,以及jdk8提供的函數式接口 和 接口的默認方法 等等1.什麼是命令式編程命令式編程就是我們去告訴程序如何實現
  • 致開發人員:沉迷面向對象編程不可自拔?函數式編程了解一下
    函數式編程已經存在了60多年,但是到目前為止,它一直都很小眾。只有像Google這樣的改變遊戲規則的企業才會依賴函數式編程,普通程式設計師對此幾乎一無所知。這並不意味著所有的函數代碼都使用 map、reduce 等。這也不意味著你需要函數式編程來理解 map 和 reduce。只是當你抽象循環時,這些函數會彈出很多。1.Lambda函數在談到函數式編程的歷史時,許多人都是從lambda函數的發明開始的。 儘管 lambda 是函數式編程毫無疑問的基石,但它們並不是根本原因。
  • 大數據入門:Scala函數式編程
    提到Scala,首先會提到的一個概念,就是函數式編程,這也是Scala語言區別與其他程式語言的典型特徵。Scala是一門多範式(multi-paradigm)的程式語言,設計初衷是要集成面向對象編程和函數式編程的各種特性。
  • 函數式編程簡介—Lambda 表達式
    Java作為面向對象的程式語言,如果按照編程種類劃分屬於命令式編程(Imperative Programming)。常見的編程範式還有邏輯式編程(Logic Programming),函數式編程(Functional Programming)。
  • Java函數式編程快速入門:Lambda表達式與Stream API
    函數式編程(Functional Programming)是一種編程範式。它已經有近60年的歷史,因其更適合做並行計算,近年來開始受到大數據開發者的廣泛關注。Python、JavaScript等當紅語言對函數式編程支持都不錯,Scala更是以函數式編程的優勢在大數據領域攻城略地,即使是老牌的Java為了適應函數式編程,也加大對函數式編程的支持。
  • java8的函數式編程解析
    其實在java8就已經有java的函數式編程寫法,只是難度較大,大家都習慣了對象式用法,但在其它語言中都有函數式的用法,如js,scala,函數式其實是抽象到極致的思想。什麼是函數式編程 函數式編程並不是Java新提出的概念,其與指令編程相比,強調函數的計算比指令的計算更重要;與過程化編程相比,其中函數的計算可以隨時調用。
  • 為什麼函數式編程在Java中很危險?
    在我的日常工作中,我身邊的開發者大多是畢業於CS編程頂級院校比如MIT、CMU以及Chicago,他們初次涉及的語言是Haskell、Scheme及Lisp。他們認為函數式編程是一種自然的、直觀的、美麗的且高效的編程樣式。
  • 使用JavaScript對象數組進行函數式編程
    我們著眼於使用map,filter和reduce來操縱對象數組,使用從函數式編程中借用的技術。數據操作是任何JavaScript應用程式中的常見任務。幸運的是,新的陣列處理運營商map,filter以及reduce廣泛的支持。雖然這些功能的文檔是足夠的,但它通常會顯示非常基本的實現用例。
  • 組合軟體:為什麼要在 JavaScript 中學習函數式編程?
    最後從零開始探索 ES6 和 函數式編程!希望所有新概念在這個過程中都被解釋到了 - 但是別指望會太舒適。如果你是一個已經熟悉 JavaScript 或者純函數式語言的老手,也許你會認為用 JavaScript 來探究函數式編程簡直個笑話。請把這些想法放一邊,試著用開放的心態來接觸這份資料。
  • 從Python到Haskell:程式設計師為何與函數式編程「墜入愛河」?
    不僅是Java或Python這樣的語言越來越多地採用了函數式編程的概念,類似Haskell這樣的新語言也正在完全實現函數式編程。簡單來說,函數式編程就是為不可變變量構建函數。與之相反,面向對象的編程則是有一組相對固定的函數,而用戶主要是修改或添加新變量。由於函數式編程的特性,它非常適合完成諸如數據分析和機器學習之類的需求任務。