Domain-Driven Design in JavaScript: Komplexer Code? Ordnung schaffen wie ein Profi

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Ihr JavaScript-Code wird zu Spaghetti? Zeit, DDD einzuführen

\n\n

Haben Sie sich jemals dabei ertappt, dass Ihr JavaScript-Projekt wie ein Teller Spaghetti aussieht? Methoden ziehen sich gegenseitig, Änderungen in einem Modul zerstören drei andere, und die Geschäftslogik ist über Controller, Services und Utilities verstreut. Kommt Ihnen das bekannt vor? Wenn Ihr Projekt über das Stadium des „einfachen Prototyps“ hinausgewachsen ist, ist es an der Zeit, Domain-Driven Design (DDD) kennenzulernen – die domänengesteuerte Entwicklung.

\n\n

Viele denken, DDD sei nur etwas für Java- oder C#-Monster. Aber das ist ein Mythos. Domain-Driven Design in JavaScript-Projekten ist nicht nur möglich, sondern auch unglaublich nützlich. Es hilft Entwicklern und dem Business, dieselbe Sprache zu sprechen, und der Code wird vorhersagbar und widerstandsfähig gegenüber Änderungen. In diesem Artikel werden wir DDD in der Praxis mit echten Codebeispielen durchgehen, damit Sie es noch heute anwenden können.

\n\n

Was ist DDD und warum braucht ein JavaScript-Entwickler es?

\n\n

DDD ist keine Bibliothek und kein Framework. Es ist ein Ansatz zur Softwareentwicklung, der die fachliche Domäne (Domain) des Geschäfts in den Mittelpunkt stellt. Anstatt über Datenbanktabellen oder REST-APIs nachzudenken, denken Sie über Geschäftseinheiten nach: „Bestellung“, „Kunde“, „Rechnung“, „Rabattberechnungsregel“.

\n\n

Der Hauptschmerz, den DDD löst, ist Komplexität. Wenn die Geschäftslogik an einem Ort lebt und die technischen Details an einem anderen, wird das Projekt spröde. DDD bietet eine klare Architektur, die die Spreu vom Weizen trennt.

\n\n

Für JavaScript, wo wir oft dynamische Typisierung und Prototypen verwenden, bringt DDD Disziplin. Es zwingt dazu, Datentypen und deren Änderungsregeln explizit zu beschreiben, was für skalierbare Anwendungen auf Node.js oder komplexe Client-Anwendungen entscheidend ist.

\n\n

Die grundlegenden Bausteine von DDD (mit JS-Beispielen)

\n\n

Kommen wir zum interessantesten Teil – dem Code. Wir schreiben ein einfaches, aber aussagekräftiges System zur Auftragsverwaltung für einen Online-Shop. Wir verwenden modernes JavaScript (ES6+).

\n\n

1. Value Object (Wertobjekt)

\n\n

Dies ist ein unveränderliches Objekt, das durch seine Attribute und nicht durch seine Identität definiert wird. Zwei Value Objects sind gleich, wenn sie dieselben Werte haben. Ein ideales Beispiel sind Geld, Adresse, E-Mail.

\n\n
// value-objects/Money.js\nclass Money {\n  constructor(amount, currency) {\n    // Validierung – ein Schlüsselteil von DDD\n    if (typeof amount !== 'number' || amount < 0) {\n      throw new Error('Der Betrag muss eine positive Zahl sein');\n    }\n    if (!['USD', 'RUB', 'EUR'].includes(currency)) {\n      throw new Error('Nicht unterstützte Währung');\n    }\n\n    this._amount = amount;\n    this._currency = currency;\n    // Objekt für Unveränderlichkeit einfrieren\n    Object.freeze(this);\n  }\n\n  get amount() { return this._amount; }\n  get currency() { return this._currency; }\n\n  // Geschäftsmethode: Geld addieren\n  add(otherMoney) {\n    if (this.currency !== otherMoney.currency) {\n      throw new Error('Verschiedene Währungen können nicht addiert werden');\n    }\n    return new Money(this.amount + otherMoney.amount, this.currency);\n  }\n\n  equals(other) {\n    return this.amount === other.amount && this.currency === other.currency;\n  }\n}\n\n// Verwendung\nconst price = new Money(100, 'USD');\nconst tax = new Money(20, 'USD');\nconst total = price.add(tax); // Money { _amount: 120, _currency: 'USD' }\nconsole.log(total);
\n\n

Warum ist das cool? Jetzt ist ein Geldbetrag nicht nur eine Zahl, sondern eine vollwertige Entität mit Regeln. Sie können nicht versehentlich Dollar mit Rubel addieren oder den Betrag negativ machen.

\n\n

2. Entity (Entität)

\n\n

Im Gegensatz zum Value Object hat eine Entität eine Identität. Sie kann sich im Laufe der Zeit ändern, aber ihre ID bleibt unverändert. Zum Beispiel ein Benutzer oder eine Bestellung.

\n\n
// entities/Order.js\nconst { v4: uuidv4 } = require('uuid'); // oder crypto.randomUUID()\n\nclass Order {\n  constructor(id                

Blogs

Buchempfehlungen