首頁 >web前端 >js教程 >掌握 Javascript 函數式程式設計

掌握 Javascript 函數式程式設計

PHPz
PHPz原創
2024-08-14 10:42:51453瀏覽

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', 'john@example.com');
console.log(getUserEmail(user));  // 'john@example.com'

const updatedUser = updateUserEmail(user, 'john.doe@example.com');
console.log(getUserEmail(updatedUser));  // 'john.doe@example.com'

創作者

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

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: 'alice@example.com' },
  { name: 'Bob', email: 'bob@example.com' },
];

const newUsers = createAndAddUser(users, 'Charlie', 'charlie@example.com');

多態性

使用高階函數和一等函數來實現多態。在函數式程式設計中,多態性通常是透過高階函數、泛型函數和 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 程式設計。

以上是掌握 Javascript 函數式程式設計的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn