比較函數式編程、命令式編程和面向對象編程

如今,由於 Oracle 公司在 Java SE 8 中引入了一些函數式構造,所以如今大多數面試官都對函數式編程提出了一些問題。作為 Java/Groovy/Scala 開發人員或任何函數式編程開發人員,我們應該學習以下問題和答案來應對面試:

  1. 什麼是函數式編程?
  2. 函數式編程的“優缺點”是什麼?
  3. 函數式編程與命令式編程之間有什麼區別?
  4. 函數式編程與面向對象編程之間有什麼區別?
  5. 函數式編程、命令式編程和面向對象編程之間有什麼區別?
  6. 函數式編程相對於命令式編程或面向對象編程的主要優勢是什麼?
  7. 什麼時候應該使用函數式編程?
  8. 什麼時候應該使用面向對象編程?
  9. 面向對象編程的缺點是什麼?
  10. 面向對象編程-繼承的缺點是什麼?…以及更多

在這篇文章中,我們將依次討論以下三種流行的編程範式,並回答上述問題:

  1. 函數式編程(FP)
  2. 命令式編程(IP)
  3. 面向對象編程(OOP)

什麼是函數式編程?

簡單來說,函數式編程(FP)是流行的編程範式之一,它像數學函數一樣進行計算,而不改變狀態或修改數據。在函數式編程中,函數是第一類候選者。我們通過定義一組函數和不可變數據來編寫程序。FP 語言的例子:Scala、Haskell、Erlang 等是流行的 FP 語言。Java SE 8 也具有一些函數式構造(請參閱 Java 8 文章了解更多細節)

FP 的特點是什麼?

函數式編程語言(如 Scala)具有以下特點

  1. 不存在狀態。
    在FP程序中,不存在狀態。這意味著所有數據都是不可變的數據,並且函數不能更改狀態。2. 執行順序的低重要性
    在FP語言中,我們使用一組獨立的函數編寫程序。函數包含一組語句。在FP中,這些函數的執行順序並不重要,因為它們沒有狀態,所有函數都是獨立的。即使我們改變執行順序,它們仍然產生相同的結果。3. 無狀態編程模型
    所有FP程序使用不可變數據和不能修改該數據的函數。這意味著FP語言支持無狀態的編程模型。4. 函數是一等公民
    在FP語言中,函數是一等對象。函數是獨立的單元,我們可以按任何順序執行它們。5. 主要操作單元
    在FP語言中,主要操作單元是函數和數據結構,因為所有程序都是使用這些單元構建的。6. 模塊化編程
    在FP語言中,我們需要編寫更小而獨立的單元,稱為純函數,以支持無狀態的編程模型。這意味著FP支持比OOP更好的模塊化。7. 高階函數和惰性評估
    函數式編程語言應該支持高階函數和惰性評估功能。8. 主要流程控制
    FP語言不使用像For…Loop,Do…While Loop,While…Loop等流程控制,也不使用條件語句,如If…Else或Switch語句。所有FP語言使用以下事物編寫程序:
  • 函數
  • 函式呼叫
  • 使用遞迴的函式呼叫
  1. 抽象化、封裝、繼承和多型
    像物件導向程式設計一樣,函數式程式語言支援所有 4 個概念:抽象化、封裝、繼承和多型。函數式程式語言使用類型類別或隱式來支援繼承。它們透過泛型來支援多型。這也被稱為參數多型。

函數式程式設計的主要焦點是什麼?

與物件導向程式設計語言不同,所有函數式程式語言的程式主要關注於「你正在做什麼」或「應該做什麼」。它們主要關注以下事項:

  • 所需的資訊,即輸入。
  • 所需的轉換,即實際邏輯。

這意味著函數式程式設計主要關注於「應該做什麼」。它並不太關注「該如何做」。這就是為什麼我們可以將函數式程式設計寫成類似於問題域描述的方式。這也是為什麼不僅開發人員,而且其他人都可以非常容易地理解函數式程式碼。現在我們將討論函數式程式設計的「優缺點」(優勢和劣勢)。

函數式編程的優勢?

函數式編程語言具有以下優勢或好處:

  • 無 Bug 的程式碼
    函數式程式語言不支援狀態,因此它們不會引發任何副作用,這意味著我們可以撰寫無錯誤的程式碼或無 Bug 的程式碼或較少出錯的程式碼。- 高效的平行程式設計
    函數式程式語言沒有可變狀態,因此它們不會引發任何狀態變更問題。這意味著它們僅使用不可變數據。它們使用獨立的單元來撰寫程式,即「函數」。我們可以撰寫非常高效的平行或並行程式,因為它們獨立運行而不會改變狀態。- 更好的性能
    由於函數式程式組合了所有獨立的單元,它們可以平行或並行運行。因此,函數式應用程序獲得了更好的性能。- 更好的封裝
    與面向對象編程(OOP)不同,函數式編程支持使用純函數進行更好的封裝。純函數表示無副作用。- 支援嵌套函數
    嵌套函數意味著在其他函數中組合函數以解決問題。函數式程式語言支援嵌套函數。- 增加可重用性
    由於函數式程式由獨立的單元組成,即「函數」,我們可以非常容易地重用它們。- 更好的模組化
    在函數式語言中,我們需要撰寫較小且獨立的單元,稱為純函數,以支援無狀態程式設計模型。這意味著函數式比OOP支援更好的模組化。- 易於惰性評估
    在函數式程式語言中,撰寫惰性評估非常容易。它們支援惰性函數構造,如惰性列表、惰性映射等。- 增加可讀性和可維護性
    函數式編程(FP)還提高了可讀性和可維護性,因為它們獨立運行並且不改變狀態。- 增加可測試性
    由於我們使用獨立的單元,即「函數」來撰寫FP程序,因此我們可以非常容易地對其進行單元測試。- 支援行為抽象
    與OOP不同,FP支援「對行為的抽象」和「對數據的抽象」。因為現實世界包含兩者。- 支援大數據
    由於FP支援平行編程和更好的性能,FP非常適合開發大數據應用程序。- 代碼堅固可靠
    由於FP使用不可變數據,我們可以很容易地使用FP開發堅固可靠的代碼。

函數式編程的缺點?

除了極大的優勢外,函數式編程語言還有極少或可以忽略的缺點。它們僅有以下缺點:

  • 需要大量內存
    函數式編程沒有狀態。它總是創建新的對象來執行操作,而不是修改現有對象。因此,函數式編程應用程序占用大量內存。- 不關注Liskov替換原則

函數式編程的主要概念有哪些?

以下是函數式編程的主要且重要的概念。

  • 第一級函數。
  • 惰性評估。
  • 高階函數。
  • 不可變性(非可變數據)。
  • 模塊化。
  • 無副作用。
  • 惰性評估。
  • 遞歸函數調用。

什麼是命令式編程?

命令式編程(IP)是一種流行的編程範式之一,它按照某種順序執行一系列步驟/指令/語句。IP語言的示例:- Java、C、C++ 等

命令式編程的主要特徵是什麼?

任何命令式編程(IP)語言都可能具有以下特徵:

  • 語句的序列。
  • 語句的執行順序非常重要。
  • 它們包含狀態。
  • 它們使用不可變和可變數據。
  • 它們可以改變狀態。
  • 它們可能具有副作用。
  • 有狀態的編程模型。
  • 它們直接改變程序的狀態。
  • 它們用數據字段表示狀態。

什麼是面向對象編程?

物件導向程式設計是另一種程式設計範式。它將所有事物表示為物件。每個物件包含一些資料欄位和方法。所有 OOP 程式都包含狀態。它們使用可變資料和資料結構。與 FP 一樣,我們可以使用不可變資料編寫完整的程式,但它並不強制執行此規則。物件導向程式設計(OOP)是命令式程式設計的超集。它遵循命令式程式設計的所有特性並具有一些額外功能。這些額外功能包括:

  • 一切皆為物件。
  • 每個物件包含一些資料欄位和方法。
  • OOP 概念:抽象化、封裝、繼承和多型性

與函數式程式設計語言不同,OOP 語言主要集中在“如何執行”。這意味著作為開發者,我們關注的是“你是如何做的”。此外,OOP 結合了“你正在做什麼”“你是如何做的”。這就是為什麼我們無法編寫簡潔且更易讀的程式碼。只有開發者能夠理解程式碼,其他人可能會更加困惑於理解應用程式碼,他們無法理解它。

物件導向程式設計(OOP)的缺點?

儘管 OOP 解決了許多實時問題,但仍然有以下缺點(與 FP 比較時):

  • 它不支援完整的重複使用性。
  • 它並非完全模塊化。
  • 它破壞了封裝概念。
  • 繼承具有很多缺點。

繼承的主要缺點:

  • 破壞了封裝原則
  • 當繼承層級增加時,維護和創建對象變得非常困難。

何時使用函數式編程?

我們應該在以下情況下採用函數式編程(FP):

  • 當我們要對具有固定數據的多個不同操作進行大量操作時。
  • 換句話說,當我們有更多操作的少數事物時。

何時使用面向對象編程?

我們應該在以下情況下採用面向對象編程(OOP):

  • 當我們要對具有共同行為的許多不同變體執行少數操作時。
  • 換句話說,當我們有更多事物卻少操作時。

注意:-這裡的事物是現實世界的物件,而操作是現實世界的動作。例如,在Java中,我們將這些現實世界的事物表示為“類”,將現實世界的動作表示為方法(操作)。

函數式編程(FP)和面向對象編程(OOP)之間的區別是什麼?

Functional Programming OOP
Does not exist State Exists State
Uses Immutable data Uses Mutable data
It follows Declarative Programming Model It follows Imperative Programming Model
Stateless Programming Model Stateful Programming Model
Main Fcous on: “What you are doing” Main focus on “How you are doing”
Good for Parallel (Concurrency) Programming Poor for Parallel (Concurrency) Programming
Good for BigData processing and analysis NOT Good for BigData processing and analysis
Supports pure Encaspulation It breaks Encaspulation concept
Functions with No-Side Effects Methods with Side Effects
Functions are first-class citizens Objects are first-class citizens
Primary Manipulation Unit is “Function” Primary Manipulation Unit is Objects(Instances of Classes)
Flow Controls: Function calls, Function Calls with Recursion Flow Controls: Loops, Conditional Statements
It uses “Recursion” concept to iterate Collection Data. It uses “Loop” concept to iterate Collection Data. For example:-For-each loop in Java
Order of execution is less importance. Order of execution is must and very important.
Supports both “Abstraction over Data” and “Abstraction over Behavior”. Supports only “Abstraction over Data”.
We use FP when we have few Things with more operations. We use OOP when we have few Operations with more Things. For example: Things are classes and Operations are Methods in Java.

這就是關於三種流行的編程範式的全部內容。注意:-我基本上是從面向對象編程(OOP)開始的,但是一年前開始研究函數式編程(FP)。因此,如果函數式編程專家在這篇文章中發現任何錯誤,請提供您寶貴的意見。如果您喜歡我的文章或有任何疑問或建議,請給我留言。

Source:
https://www.digitalocean.com/community/tutorials/functional-imperative-object-oriented-programming-comparison