Maison > interface Web > js tutoriel > GRASP en programmation fonctionnelle Javascript

GRASP en programmation fonctionnelle Javascript

PHPz
Libérer: 2024-08-14 10:42:51
original
451 Les gens l'ont consulté

GRASP in Javascript functional programming

Dans le monde du développement logiciel, les modèles de conception servent de solutions éprouvées aux problèmes courants.
L’un des ensembles de modèles de conception les moins discutés mais tout aussi essentiels est le GRASP (General Responsibility Assignment Software Patterns). Les principes de GRASP sont souvent en corrélation avec les principes SOLID et d'autres modèles de conception POO.
GRASP, ou General Responsibility Assignment Software Patterns, est un ensemble de lignes directrices visant à attribuer des responsabilités aux classes et aux objets dans la conception orientée objet. Comment pouvons-nous utiliser ces modèles dans notre développement Javascript (Node.js) ? Bien entendu, Javascript prend en charge les classes, qui sont nativement construites sur des prototypes, dans lesquelles nous pouvons appliquer GRASP de la même manière que nous le ferions en Java.
Cependant, à mon avis, les modèles GRASP peuvent également être appliqués à la programmation fonctionnelle.

Qu’est-ce que GRASP ?

Les neuf modèles GRASP sont :

  1. Expert en informations
  2. Créateur
  3. Contrôleur
  4. Couplage faible
  5. Haute cohésion
  6. Polymorphisme
  7. Fabrication pure
  8. Indirection
  9. Variations protégées

Expert en informations

Attribuez des responsabilités aux fonctions qui disposent des données ou des connaissances requises pour effectuer une tâche. En programmation fonctionnelle, ce principe peut être appliqué en attribuant des responsabilités à des fonctions ou des modules qui disposent des données ou du contexte requis pour effectuer une tâche.

// 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'
Copier après la connexion

Créateur

Utilisez les fonctions d'usine pour créer des structures de données ou des objets complexes. En programmation fonctionnelle, même si nous ne traitons pas les classes de la même manière qu'en programmation orientée objet, nous pouvons appliquer le principe Creator en attribuant la responsabilité de créer des structures de données ou d'initialiser des objets à des fonctions ou des modules qui disposent des informations et des informations nécessaires. contexte.

const createUser = (name, email) => ({ name, email });
Copier après la connexion

Contrôleur

Utilisez des fonctions d'ordre supérieur pour gérer les événements système et déléguer des tâches. En programmation fonctionnelle, les contrôleurs prennent souvent la forme de fonctions qui orchestrent le flux de données et d'actions entre les différentes parties du système, garantissant ainsi que les responsabilités sont clairement séparées.

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

Couplage faible

Assurez-vous que les fonctions sont indépendantes et ne dépendent que d'entrées explicites. Dans la programmation fonctionnelle, un faible couplage est obtenu en concevant des fonctions et des modules qui fonctionnent indépendamment les uns des autres, avec une dépendance minimale sur les détails internes d'autres fonctions ou modules

const sendEmail = (emailService, email) => emailService.send(email);
Copier après la connexion

Haute cohésion

La cohésion élevée fait référence au degré auquel les éléments d'un module ou d'une fonction appartiennent ensemble. En programmation fonctionnelle, atteindre une cohésion élevée signifie concevoir des fonctions et des modules de manière à ce qu'ils exécutent une tâche unique bien définie ou un ensemble de tâches étroitement liées.

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');

Copier après la connexion

Polymorphisme

Utilisez des fonctions d'ordre supérieur et des fonctions de première classe pour obtenir le polymorphisme. En programmation fonctionnelle, le polymorphisme est généralement obtenu grâce à des fonctions d'ordre supérieur, des fonctions génériques et des systèmes de types comme Typescript

const processPayment = (paymentMethod) => paymentMethod.process();
Copier après la connexion

Fabrication pure

Créez des fonctions utilitaires qui ne correspondent pas directement aux concepts de domaine mais fournissent les fonctionnalités nécessaires, lorsqu'aucune fonction ou classe de domaine appropriée n'existe.

const log = (message) => console.log(message);
Copier après la connexion

Indirection

L'indirection en programmation fonctionnelle fait référence à l'utilisation de fonctions intermédiaires pour gérer les interactions entre différentes parties d'un système. Un bon exemple dans Node.js peut être le modèle Middleware.

const withNumberFilterMiddleware = (data) => data.filter(item => !isNaN(Number(item)));
Copier après la connexion

Variantes protégées

Les variations protégées dans la programmation fonctionnelle signifient créer une conception résiliente aux changements en encapsulant les parties qui varient et en garantissant que le reste du système est protégé de ces variations. En programmation fonctionnelle, ce principe peut être appliqué grâce à l'utilisation de l'abstraction, de l'immuabilité et de l'encapsulation pour créer un code robuste et maintenable, moins susceptible aux changements.

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);
Copier après la connexion

Résumé

Comme vous pouvez le constater, les principes GRASP sont en corrélation avec de nombreux modèles de conception connus ainsi qu'avec les principes SOLID. Une cohésion élevée équivaut presque au principe de responsabilité unique, etc.
Ces principes ne sont pas seulement des principes de POO, mais des principes généraux de programmation de code propre et bien architecturé, qu'il s'agisse de programmation fonctionnelle ou de POO.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal