物件導向程式設計(OOP)和函數語言程式設計(FP)是軟體開發中的兩種主要正規化。這兩種方法都為組織、設計和實現軟體系統提供了不同的方法論。雖然物件導向程式設計幾十年來一直是主導正規化,但函數語言程式設計近年來獲得了巨大的吸引力,這要歸功於其處理狀態和資料的獨特方法。我們將學習研究每種正規化的特徵,檢查它們的優缺點。並用 Java 來演示兩者的差異。
物件導向程式設計(OOP)
物件導向程式設計圍繞著物件的概念,物件是類的例項。這些物件封裝了與特定實體或概念相關的資料(屬性)和行為(方法)。物件透過方法呼叫彼此互動,反映真實世界的關係。
物件導向程式設計原理
OOP 的主要原則包括:
- 類:建立物件的藍圖。它們定義所有例項共有的屬性和方法。
- 物件:具有特定屬性值的類的物件。它們代表真實世界的實體或概念。
- 封裝:將資料和對該資料進行操作的方法捆綁在單個單元(類)中,限制直接訪問並促進資料完整性。
- 繼承:一個類從另一個類繼承屬性和行為的能力,促進程式碼重用,可擴充套件性和層次結構。
- 多型性(Polymorphism):透過統一介面處理各種型別物件的能力,從而實現靈活性和可擴充套件性。
Java OOP 實踐
讓我們考慮一個簡單的 Java OOP 示例,我們使用 OOP 原則建立了一個 User
類:
/**
* 使用者類
*/
public class User {
private double score;
/**
* @param init 初始分數
*/
public User(double init) {
this.score = init;
}
/**
* 加分
* @param num
*/
public void add(double num) {
this.score += num;
}
/**
* 減分
* @param num
*/
public void minus(double num) {
this.score -= num;
}
/**
* 獲取當前分數
* @return
*/
public double getScore() {
return score;
}
}
這段程式碼定義了一個 User
類,它有一個私有的 score
屬性和相關操作方法。
探索函數語言程式設計(FP)概念
另一方面,函數語言程式設計將計算視為對數學函式的求值,並避免改變狀態和可變資料。函數語言程式設計將函式作為主要的構建塊。這些函式接受純輸入併產生可預測的輸出,而無需修改外部狀態。
函數語言程式設計原理
函數語言程式設計的主要原則包括:
- 不變性:資料一旦建立,就不能修改。函式不是改變狀態,而是產生新的資料。
- 一流的功能:函式被視為一等公民,這意味著它們可以分配給變數,作為引數傳遞,並從其他函式返回。
- 引用透明性:函式的結果僅取決於其引數,而不取決於任何可變狀態或外部因素。
Java 中 FP 的核心概念
雖然 Java 主要是物件導向的,但 Java 8 引入了包含函式概念的功能:
- Lambda Expressions:定義匿名函式的簡潔方式。
- Functional Interfaces:具有單個抽象方法的介面,促進類似函式的行為。
- Streams API:提供了一種功能強大的方法來以函式的方式處理集合。
Java 函式式實踐
讓我們用 Java 實現一個簡單的例子,展示函數語言程式設計的概念。讓我們使用函式方法來編寫計算 1 到 10 的偶數平方和的邏輯:
public static void main(String[] args) {
int sum = IntStream.range(1, 10).filter(i -> i % 2 == 0).map(f -> f * f).sum();
System.out.println(sum);
}
這段程式碼利用 IntStream
類來生成一個數字流。然後對流進行偶數過濾,使用 lambda 表示式進行平方,最後減少到平方和。
兩者比較
- 可變性:
- 物件導向程式設計(OOP)通常涉及可變狀態,其中物件可以隨時間改變其內部狀態。
- 函數語言程式設計(FP)強調不可變性,鼓勵一旦建立資料就避免對其進行更改。
- 組合與繼承:
- OOP 依賴於類層次結構和繼承來實現程式碼重用和擴充套件。
- FP 更傾向於組合而非繼承,鼓勵從簡單函式構建複雜行為。
- 副作用:
- OOP 程式碼可能透過在其範圍之外修改狀態而產生副作用。
- FP 旨在透過將副作用限制在定義良好的邊界內來最小化副作用,使程式更可預測且更易於推理。
- 併發性:
- FP 透過不可變資料和純函式來促進併發性,這些函式本質上是執行緒安全的。
- OOP 併發性需要仔細管理共享可變狀態,以避免競態條件和不一致性。
- 表達力和可讀性:
- 由於其強調函式組合和高階函式,FP 通常會導致更簡潔和宣告性的程式碼。
- OOP 可以提供清晰的抽象和對真實世界概念的直觀建模,從而增強某些型別問題的可讀性。
以下是在各個維度上對比物件導向程式設計(OOP)和函數語言程式設計(FP)的表格表示:
方面 | 物件導向程式設計(OOP) | 函數語言程式設計(FP) |
---|---|---|
易變 | 涉及可變狀態和物件。 | 涉及可變狀態和物件。 |
組合與繼承 |
依賴於類層次結構和繼承。 |
在程式碼重用方面,更傾向於組合而不是繼承。 |
副作用 | 透過狀態改變產生副作用。 | 目的是透過純度來減少副作用。 |
併發 | 需要仔細管理共享狀態。 | 透過不可變資料提升併發性。 |
表示式 | 提供清晰的抽象和直觀的建模。 | 導致簡潔的、宣告性的函式程式碼。 |
物件導向和函數語言程式設計正規化都為軟體開發提供了有價值的方法,每種方法都有自己的優點和缺點。物件導向程式設計擅長於對具有豐富行為和關係的複雜系統進行建模,而函數語言程式設計則透過不可變的資料和函式純度來促進更簡單,更可預測的程式碼。
在現代軟體開發中,OOP 和 FP 之間的選擇通常取決於專案的特定需求,開發團隊的偏好以及問題域的性質。此外,結合兩種範例的聯合收割機元素的混合方法正變得越來越普遍,允許開發人員利用兩個世界的優點。
- 2021 年原創合集
- 2022 年原創合集
- 2023 年原創合集
- 服務端功能測試
- 效能測試專題
- Java、Groovy、Go、Python
- 單元&白盒&工具合集
- 測試方案&BUG&爬蟲&UI 自動化
- 測試理論雞湯
- 社群風采&影片合集