今天我們來談談函數式編程。更具體地說,我們將研究聲明式編程和命令式編程之間的區別。
首先,讓我們快速回顧一下這些條款。然後我們將比較這些編程風格,看看它們如何出現在 Java 中,以及該語言是否支持它們的愉快共存。
函數式編程是一種範式,其中函數被理解為數學函數,而不是過程式編程中的子例程。也就是說,在這兩種範例中,對“功能”一詞的解釋不同。記住這一點,不要混淆它們。Java 不會讓您感到困惑,因為子程序被稱為“方法”,而函數是指數學函數(也稱為:lambda 函數或方法引用)。
實際上,在過程編程中,函數不僅依賴於輸入變量,還依賴於外部因素(例如函數之外的其他變量或系統的狀態)。這意味著使用相同的參數但在不同的上下文中調用相同的函數可能會產生不同的結果。在函數式編程中,當使用相同的參數調用函數時,它總是產生相同的結果,因為函數只依賴於輸入數據。
函數式編程的優點
- 提高代碼可靠性
- 方便的單元測試
- 編譯期間代碼優化的機會
- 並發機會
函數式編程的缺點
函數式編程的缺點源於所有這些相同的特性:
-
沒有賦值語句。相反,新值存儲在新變量中,導致需要不斷分配和自動釋放內存。因此,高效的垃圾收集是任何執行功能程序的系統的重要組成部分。
-
非嚴格評估意味著函數調用的順序是不可預測的,當操作順序很重要時會產生 I/O 問題。
我們對函數式編程的快速回顧到此結束。現在讓我們繼續討論編程風格。
命令式編程是一種編程範式,具有以下特點:
-
該程序的源代碼由指令(語句)組成。
-
必須按順序執行說明。
-
執行先前指令產生的數據可以由後續指令從內存中讀取。
-
執行一條指令得到的數據可以寫入內存。
以下是命令式語言的主要特點:
- 使用布爾變量。
- 賦值運算符的使用。
- 複合表達式的使用。
- 子程序的使用。
命令式程序就像自然語言中以命令式語氣表達的命令。換句話說,命令式程序是一系列命令。
命令式編程語言包括 C 和 C++。
聲明式編程是一種編程範式,其中指定了問題的解決方案。也就是說,描述的是最終結果,而不是實現它的方法。HTML 是聲明性語言的一個例子。用這種語言編寫標籤時,我們不會考慮元素將如何繪製在頁面上。我們只是描述頁面應該是什麼樣子。
另一種聲明式編程語言是 SQL。
讓我們通過考慮一個現實生活中的例子來比較這兩種編程風格:我們如何向一個人解釋如何到達某個地方?
想像一下這種情況:一個人在街上走過來問我們:“我怎麼去博物館?”
通過命令式方法,我們將為他提供如何步行到達那裡的算法:
- 在這裡轉身
- 直線步行 2 個街區
- 向右轉
- ……
使用聲明式方法,我們只需提供地址,然後該人就會自行到達正確的位置。
Java目前是一種多範式編程語言。多範式意味著該語言支持多種範式。
在其長期發展過程中,該語言擴展了它的面向對像模型,因此它的用戶可以使用不同的工具,並可以為他們的特定任務選擇最好的工具。
因此,Java 目前同時支持命令式方法(例如為方法調用編寫代碼)和聲明式方法(例如運行時可用的註釋)。
讓我們總結一下:
-
有各種編程範式。
-
有聲明式和命令式方法。
-
您應該選擇最適合手頭任務的那個。
-
Java 是一種支持這兩種方法的多範式語言。
GO TO FULL VERSION