」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 掌握 Javascript 函數式程式設計

掌握 Javascript 函數式程式設計

發佈於2024-08-17
瀏覽:801

GRASP in Javascript functional programming

在軟體開發領域,設計模式是針對常見問題經過時間考驗的解決方案。
GRASP(通用責任分配軟體模式)是較少討論但同樣重要的設計模式集之一。 GRASP 的原則通常與 SOLID 原則和其他 OOP 設計模式相關。
GRASP(通用責任分配軟體模式)是一系列指南,旨在將責任分配給物件導向設計中的類別和物件。我們如何在 Javascript (Node.js) 開發中使用這些模式?當然,Javascript 支援類,這些類別本身是基於原型構建的,我們可以像在 Java 中那樣以類似的方式應用 GRASP。
然而,在我看來,GRASP 模式也可以應用於函數式程式設計。

什麼是GRASP?

九種 GRASP 模式是:

  1. 資訊專家
  2. 創作者
  3. 控制器
  4. 低耦合
  5. 高內聚力
  6. 多態性
  7. 純製造
  8. 間接
  9. 受保護的變體

資訊專家

將職責分配給擁有執行任務所需資料或知識的職能部門。在函數式程式設計中,可以透過將職責指派給具有執行任務所需的資料或上下文的函數或模組來應用此原則。

// User management module
const createUser = (name, email) => ({ name, email });

const getUserEmail = (user) => user.email;

const updateUserEmail = (user, newEmail) => ({
  ...user,
  email: newEmail,
});

const user = createUser('John Doe', '[email protected]');
console.log(getUserEmail(user));  // '[email protected]'

const updatedUser = updateUserEmail(user, '[email protected]');
console.log(getUserEmail(updatedUser));  // '[email protected]'

創作者

使用工廠函數建立複雜的資料結構或物件。在函數式程式設計中,雖然我們處理類別的方式與物件導向程式設計不同,但我們可以應用創建者原則,將創建資料結構或初始化物件的責任分配給具有必要資訊的函數或模組,並且情境。

const createUser = (name, email) => ({ name, email });

控制器

使用高階函數處理系統事件和委託任務。在函數式程式設計中,控制器通常採用函數的形式來編排系統不同部分之間的資料流和操作,確保職責明確分離。

// Example of express.js controller
const handleRequest = (req, res, userService) => {
  const user = userService.createUser(req.body.name, req.body.email);
  res.send(user);
};

低耦合

確保函數是獨立的並且僅依賴明確輸入。在函數式程式設計中,低耦合是透過設計彼此獨立運行的函數和模組來實現的,並且對其他函數或模組的內部細節的依賴最小化

const sendEmail = (emailService, email) => emailService.send(email);

高內聚力

高內聚是指模組或功能內的元素所屬的程度。在函數式程式設計中,實現高內聚意味著設計函數和模組,以便它們執行單一、明確定義的任務或密切相關的一組任務。

const createUser = (name, email) => ({ name, email });
const addUser = (users, user) => [...users, user];

const createAndAddUser = (users, name, email)=>{
  const user = createUser(name, email);
  return addUser(users, user)
}
// usage
const users = [
  { name: 'Alice', email: '[email protected]' },
  { name: 'Bob', email: '[email protected]' },
];

const newUsers = createAndAddUser(users, 'Charlie', '[email protected]');

多態性

使用高階函數和一等函數實現多態。在函數式程式設計中,多態性通常是透過高階函數、泛型函數和 Typescript
等型別系統來實現

const processPayment = (paymentMethod) => paymentMethod.process();

純製造

當不存在適當的域函數或類別時,建立不直接對應於域概念但提供必要功能的實用函數。

const log = (message) => console.log(message);

間接

函數式程式設計中的間接是指使用中間函數來管理系統不同部分之間的交互作用。 Node.js 中的一個很好的例子是中間件模式。

const withNumberFilterMiddleware = (data) => data.filter(item => !isNaN(Number(item)));

受保護的變體

函數式程式設計中受保護的變化意味著透過封裝變化的部分並確保系統的其餘部分免受這些變化的影響,創建一種能夠適應變化的設計。 在函數式程式設計中,可以透過使用抽象、不變性和封裝來應用此原則,以創建不易更改的健壯且可維護的程式碼。

const processCreditCardPayment = (amount) => {
  console.log(`Processing credit card payment of ${amount}`);
  // Credit card payment logic
};

const processPayPalPayment = (amount) => {
  console.log(`Processing PayPal payment of ${amount}`);
  // PayPal payment logic
};

const processPayment = (paymentMethod, amount) => {
  paymentMethod(amount);
};

// Use different payment methods without changing the processPayment function
processPayment(processCreditCardPayment, 100);
processPayment(processPayPalPayment, 200);

概括

正如您所看到的,GRASP 原則與許多已知的設計模式以及 SOLID 原則相關。高內聚幾乎等於單一職責原則等等。
這些原則不僅是 OOP 原則,而且是編寫架構良好的乾淨程式碼的一般原則,無論是函數式程式設計還是 OOP 程式設計。

版本聲明 本文轉載於:https://dev.to/ohanhaliuk/grasp-in-javascript-functional-programming-2jh6?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何解決 MySQL C# 中的文字編碼問題?
    如何解決 MySQL C# 中的文字編碼問題?
    修復MySQL C# 中的文字編碼問題使用實體框架在C# 中處理MySQL 資料庫時,使用者可能會遇到文字編碼問題,特別是帶有特殊字符,例如“ë”,渲染不正確。本文探討了解決此常見問題的最合適的解決方案。 要修正編碼問題,必須執行以下操作:驗證排序規則設定: 確保所涉及的資料庫或表的排序規則與UTF...
    程式設計 發佈於2024-11-06
  • 如何將美麗搜尋與 Node.js 集成
    如何將美麗搜尋與 Node.js 集成
    作為 Node.js 開發人員,建立能夠提供快速且準確的搜尋結果的應用程式非常重要。使用者期望立即得到相關的回應,但實現起來可能具有挑戰性,特別是在處理大型資料集時。 這就是美麗搜尋的用武之地——一個為輕鬆滿足這些需求而構建的搜尋引擎。 什麼是美麗搜尋? Meilisearch ...
    程式設計 發佈於2024-11-06
  • 平行 JavaScript 機
    平行 JavaScript 機
    作者:Vladas Saulis,PE Prodata,克萊佩達,立陶宛 2024 年 5 月 18 日 抽象的 本文提出了一種新的程式設計模型,可以以簡單且自動平衡的方式利用多核心 CPU 系統。該模型還提出了一種更簡單的程式設計範例,用於在大多數大規模平行計算領域(例如天氣預報、核子物理、搜尋引...
    程式設計 發佈於2024-11-06
  • 推薦項目:人事管理系統資料庫設置
    推薦項目:人事管理系統資料庫設置
    LabEx 的這個綜合計畫提供了深入研究資料庫管理世界的寶貴機會,重點是人事管理系統的創建和實施。無論您是新手資料庫管理員還是經驗豐富的開發人員,這種實務經驗都將為您提供必要的技能,以便在關聯式資料庫環境中有效管理和操作資料。 深入了解資料庫基礎知識 這個專案首先引導您完成使用 s...
    程式設計 發佈於2024-11-06
  • Python 中實例方法和類別方法有什麼不同?
    Python 中實例方法和類別方法有什麼不同?
    類別與實例方法Python 的PEP 8 風格指南建議使用“self”作為實例方法的第一個參數,使用“ cls」作為類別方法的第一個參數。理解這兩類方法之間的區別對於有效的物件導向程式設計至關重要。 實例方法實例方法與類別的特定實例相關聯。它們對實例的資料進行操作,並且通常接收“self”作為它們的...
    程式設計 發佈於2024-11-06
  • 將 AdoptiumJDK 原始碼載入到 Eclipse IDE 中
    將 AdoptiumJDK 原始碼載入到 Eclipse IDE 中
    AdoptiumJDK 的安裝程式中沒有內建原始程式碼文件,如果您需要透過 Eclipse IDE 檢查如何使用任何本機 JDK 方法,這是不可能的。 依照以下步驟在Eclipse IDE中載入原始碼: 造訪 AdoptiumJDK 官方網站並按所需的 JDK 版本進行過濾,在我的例子中是 11....
    程式設計 發佈於2024-11-06
  • 絕對定位與相對定位:為什麼它們的行為如此不同?
    絕對定位與相對定位:為什麼它們的行為如此不同?
    了解絕對位置與相對位置:寬度、高度等處理網頁上的元素定位時,了解這些概念絕對位置與相對位置的區別至關重要。讓我們深入探討經常引起疑問的四個關鍵點:1。相對寬度與絕對寬度為何相對定位的div會自動佔據100%寬度,而絕對定位的div只佔據內容寬度? 原因是設定位置:absolute 從文件結構的正常流...
    程式設計 發佈於2024-11-06
  • Python、Node js 和 PHP 中用於驗證碼識別的頂層模組
    Python、Node js 和 PHP 中用於驗證碼識別的頂層模組
    在我们的自动化时代,大多数解决方案都可以免费找到,我现在不是在谈论解决数学问题,而是稍微复杂的任务,例如数据解析,和我们的例子一样,还有 recapcha 识别。但如何找到一个好的模块呢?毕竟,随着技术的发展,每个人都得到了它,无论是认真的开发人员还是彻头彻尾的骗子。 我分析了验证码识别模块的市场,...
    程式設計 發佈於2024-11-06
  • 以下是一些標題選項,重點關注問題格式和核心內容:

**選項 1(直接且簡潔):**

* **如何在 PHP 中有效率地循環多維數組?

**選項2
    以下是一些標題選項,重點關注問題格式和核心內容: **選項 1(直接且簡潔):** * **如何在 PHP 中有效率地循環多維數組? **選項2
    在 PHP 中循環多維數組多維數組可能是解析的一個挑戰,特別是在處理不同深度級別和非順序索引時。考慮一個保存事件資訊的數組,其中可以包含多個藝術家及其相應的鏈接,如下所示:array(2) { [1]=> array(3) { ["eventID"]...
    程式設計 發佈於2024-11-06
  • 透過 Linting 提高程式碼品質
    透過 Linting 提高程式碼品質
    Whenever I start a new project, one of the first things I do is put in place a code linter. For the uninitiated, linters analyze your project and call...
    程式設計 發佈於2024-11-06
  • 如何有效執行JavaScript中的回呼函數?
    如何有效執行JavaScript中的回呼函數?
    理解JavaScript 中回呼函數的本質在JavaScript 中,回呼函數提供了一種方便的機制,可以在另一個函數完成後執行一個函數它的執行。雖然概念很簡單,但回調的最佳實作有時可能不清楚。讓我們探討一個簡化的範例:var myCallBackExample = { myFirstFunc...
    程式設計 發佈於2024-11-06
  • Vue 框架簡介
    Vue 框架簡介
    What is Vue? from the Vue website Vue is a "progressive" JavaScript framework for building user interfaces. It works by build...
    程式設計 發佈於2024-11-06
  • 逃離戲劇:為什麼 HydePHP 是您的 WordPress 替代品
    逃離戲劇:為什麼 HydePHP 是您的 WordPress 替代品
    WordPress 戲劇 隨著 WordPress 生態系統面臨前所未有的混亂,許多開發人員和網站所有者正在重新考慮他們的平台選擇。最近 WordPress 共同創辦人 Matt Mullenweg 和 WP Engine 之間的衝突凸顯了 WordPress 社群內的控制、貢獻和...
    程式設計 發佈於2024-11-06
  • Go 中的並發模式;工作池和扇出/扇入
    Go 中的並發模式;工作池和扇出/扇入
    Go 以其卓越的並發模型而聞名,但許多開發人員只專注於 goroutine 和通道。然而,工作池和扇出/扇入等並發模式提供了真正的效率。 本文將介紹這些進階概念,幫助您最大限度地提高 Go 應用程式的吞吐量。 為什麼並發很重要 並發允許程式有效率地執行任務,特別是在處理 I/O ...
    程式設計 發佈於2024-11-06
  • 如何在 C++ 中將單一字元轉換為 std::string?
    如何在 C++ 中將單一字元轉換為 std::string?
    從單字建立字串從單一字元建立字串人們可能會遇到需要將表示為char 資料類型的單字轉換為std:: string。從字串中取得字元很簡單,只需在所需位置索引字串即可。然而,相反的過程需要不同的方法。 要從單字建立std::string,可以使用多種方法:char c = 34; std::strin...
    程式設計 發佈於2024-11-06

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3