„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > GRASP in der funktionalen Javascript-Programmierung

GRASP in der funktionalen Javascript-Programmierung

Veröffentlicht am 17.08.2024
Durchsuche:247

GRASP in Javascript functional programming

In der Welt der Softwareentwicklung dienen Entwurfsmuster als bewährte Lösungen für häufige Probleme.
Einer der weniger häufig diskutierten, aber ebenso wichtigen Sätze von Entwurfsmustern ist GRASP (General Responsibility Assignment Software Patterns). Die Prinzipien von GRASP korrelieren häufig mit den SOLID-Prinzipien und anderen OOP-Entwurfsmustern.
GRASP (General Responsibility Assignment Software Patterns) ist eine Sammlung von Richtlinien zur Zuweisung von Verantwortlichkeiten an Klassen und Objekte im objektorientierten Design. Wie können wir diese Muster in unserer Javascript-Entwicklung (Node.js) verwenden? Natürlich unterstützt Javascript Klassen, die nativ auf Prototypen basieren und in denen wir GRASP auf ähnliche Weise anwenden können, wie wir es in Java tun würden.
Meiner Meinung nach können GRASP-Muster jedoch auch auf die funktionale Programmierung angewendet werden.

Was ist GRASP?

Die neun GRASP-Muster sind:

  1. Informationsexperte
  2. Schöpfer
  3. Regler
  4. Geringe Kopplung
  5. Hohe Kohäsion
  6. Polymorphismus
  7. Reine Fabrikation
  8. Indirektion
  9. Geschützte Variationen

Informationsexperte

Weisen Sie Verantwortlichkeiten Funktionen zu, die über die erforderlichen Daten oder Kenntnisse zur Ausführung einer Aufgabe verfügen. In der funktionalen Programmierung kann dieses Prinzip angewendet werden, indem Verantwortlichkeiten Funktionen oder Modulen zugewiesen werden, die über die Daten oder den Kontext verfügen, die zur Ausführung einer Aufgabe erforderlich sind.

// 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]'

Schöpfer

Verwenden Sie Factory-Funktionen, um komplexe Datenstrukturen oder Objekte zu erstellen. Während wir in der funktionalen Programmierung nicht auf die gleiche Weise mit Klassen umgehen wie in der objektorientierten Programmierung, können wir das Creator-Prinzip anwenden, indem wir die Verantwortung für die Erstellung von Datenstrukturen oder die Initialisierung von Objekten Funktionen oder Modulen zuweisen, die über die erforderlichen Informationen verfügen Kontext.

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

Regler

Verwenden Sie Funktionen höherer Ordnung, um Systemereignisse zu verarbeiten und Aufgaben zu delegieren. In der funktionalen Programmierung nehmen Controller häufig die Form von Funktionen an, die den Daten- und Aktionsfluss zwischen verschiedenen Teilen des Systems orchestrieren und so sicherstellen, dass die Verantwortlichkeiten klar getrennt sind.

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

Niedrige Kopplung

Stellen Sie sicher, dass Funktionen unabhängig sind und nur von expliziten Eingaben abhängen. Bei der funktionalen Programmierung wird eine geringe Kopplung dadurch erreicht, dass Funktionen und Module entworfen werden, die unabhängig voneinander funktionieren, wobei die Abhängigkeit von den internen Details anderer Funktionen oder Module minimal ist.

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

Hoher Zusammenhalt

Hohe Kohäsion bezieht sich auf den Grad der Zusammengehörigkeit der Elemente innerhalb eines Moduls oder einer Funktion. In der funktionalen Programmierung bedeutet das Erreichen einer hohen Kohäsion, Funktionen und Module so zu entwerfen, dass sie eine einzelne, genau definierte Aufgabe oder einen eng verwandten Satz von Aufgaben ausführen.

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

Polymorphismus

Verwenden Sie Funktionen höherer Ordnung und erstklassige Funktionen, um Polymorphismus zu erreichen. In der funktionalen Programmierung wird Polymorphismus typischerweise durch Funktionen höherer Ordnung, generische Funktionen und Typsysteme wie Typescript
erreicht.

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

Reine Herstellung

Erstellen Sie Dienstprogrammfunktionen, die nicht direkt den Domänenkonzepten entsprechen, aber die erforderliche Funktionalität bereitstellen, wenn keine geeignete Domänenfunktion oder -klasse vorhanden ist.

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

Indirektion

Indirektion bezieht sich in der funktionalen Programmierung auf die Verwendung von Zwischenfunktionen, um Interaktionen zwischen verschiedenen Teilen eines Systems zu verwalten. Ein gutes Beispiel in Node.js kann das Middleware-Muster sein.

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

Geschützte Variationen

Geschützte Variationen in der funktionalen Programmierung bedeuten, ein Design zu erstellen, das gegenüber Änderungen widerstandsfähig ist, indem die Teile, die variieren, gekapselt werden und sichergestellt wird, dass der Rest des Systems vor diesen Variationen geschützt ist. In der funktionalen Programmierung kann dieses Prinzip durch den Einsatz von Abstraktion, Unveränderlichkeit und Kapselung angewendet werden, um robusten und wartbaren Code zu erstellen, der weniger anfällig für Änderungen ist.

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

Zusammenfassung

Wie Sie sehen, korrelieren die GRASP-Prinzipien mit vielen bekannten Entwurfsmustern sowie den SOLID-Prinzipien. Hoher Zusammenhalt ist fast gleichbedeutend mit dem Prinzip der Einzelverantwortung und so weiter.
Bei diesen Prinzipien handelt es sich nicht nur um OOP-Prinzipien, sondern um allgemeine Prinzipien für die Programmierung von gut strukturiertem, sauberem Code, unabhängig davon, ob es sich um funktionale oder OOP-Programmierung handelt.

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/ohanhaliuk/grasp-in-javascript-Functional-Programming-2jh6?1 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3