Im Frontend ist diese Abgrenzung bei weitem nicht so scharf, da hier ja auch die Repräsentation von Daten integraler Bestandteil ist, und diese Repräsentation ist natürlich ein technischer Aspekt. Benutzt man außerdem eine Technologie, bei der Code und Repräsentation sehr eng gekoppelt sind, wie das zum Beispiel bei React mit JSX der Fall ist, ist eine hundertprozentige Trennung kaum möglich. Trotzdem kann man auch in einem solchen Umfeld viel erreichen, wenn man die Geschäftslogik nicht direkt in den Komponenten implementiert, sondern sie in eigene Funktionen (in separaten Dateien) auslagert, die dann in den Komponenten aufgerufen werden. Das macht übrigens auch das Testen deutlich einfacher.
Ein weiterer technischer Aspekt, den man in Frontends so gut wie immer findet, ist die Kommunikation mit dem Backend. Auch hier ist es wichtig, die Technik von der Fachlichkeit zu trennen, also die eigentliche Anfrage (also welche Technologie zum Einsatz kommt, welche Implementierung dafür verwendet wird etc.) inklusive der erforderlichen Konfiguration zu kapseln und vom Domänencode zu trennen.
Der Code ist fachlich gruppiert, nicht technisch
Gemäß DDD wird der Code so organisiert, dass fachlich zusammengehörender Code nah beieinander abgelegt wird. Das hat mehrere Vorteile: Zum einen lässt sich so rasch erfassen, wo man nach dem Code suchen muss, der ein bestimmtes Feature umsetzt, sodass man sich auch in fremden Codebasen relativ leicht zurechtfinden kann. Des Weiteren beschränkt eine derartige Organisation die Änderungen, die bei der Anpassung eines einzelnen Features entstehen, auf wenige Verzeichnisse und verhindert das sogenannte „Shotgun Surgery“-Antipattern (also wörtlich „Operation mit der Schrotflinte“), bei dem Änderungen für ein einzelnes Feature gleichmäßig über die gesamte Codebasis verteilt sind – ganz so, als hätte man mit einem Schrotgewehr auf den Code geschossen. Das hilft insbesondere, Merge-Konflikte zu vermeiden, wenn im Team gleichzeitig an verschiedenen Features gearbeitet wird. Auch im Frontend lässt sich eine solche fachliche Organisation des Codes leicht durchführen.
Entities, Value Objects etc.
In Domain-Driven Design gibt es verschiedene Muster, nach denen der Code für einzelne Objekte umgesetzt werden sollte. Die Häufigsten sind dabei Entities und Value Objects. Bei den Entities handelt es sich um Objekte, die einen Lebenszyklus haben, in dessen Verlauf sich die Daten der Entity ändern können. Trotzdem ist dieses Objekt zu jeder Zeit eindeutig über einen Identifikator erkennbar. Bei einer Person können sich z. B. Name, Adresse oder Geschlecht ändern, aber mit Hilfe eines Identifikators, wie z. B. einer Kunden- oder der Steuernummer, lässt sich immer zweifelsfrei das richtige Objekt zuordnen.
Im Gegensatz dazu haben Value Objects keinen separaten Identifikator, sie sind nur über die enthaltenen Daten identifizierbar. Sind die Daten anders, muss es sich um ein anderes Value Object handeln. Daraus abgeleitet findet die Umsetzung als unveränderliches, „immutable“ Objekt immer größere Verbreitung. Man kann diese Umsetzung im Frontend entweder durch Libraries erzwingen oder sich selbst so weit disziplinieren, dass die entsprechenden Objekte nicht mutiert werden. Auch Bibliotheken, wie z. B. Redux, setzen voraus, dass der Store immutable ist, dass bei Änderungen also jedes Mal ein neuer Store erzeugt wird. Es ist also durchaus sinnvoll, sich an dieses Entwicklungsmuster zu gewöhnen. Es hilft bei der Fehlervermeidung und erleichtert das Testen und sollte daher eingesetzt werden, wo immer es möglich ist.
Aggregate
Ein Aggregat in DDD bildet einen Workflow ab und kümmert sich um alles, was damit zusammenhängt. Es bildet eine Transaktionsgrenze (d. h., alle geänderten Daten werden gemeinsam persistiert) sowie eine Konsistenzgrenze (d. h., alle Daten innerhalb des Aggregats müssen zu jeder Zeit gemäß der Regeln der Geschäftslogik konsistent sein).
Üblicherweise enthält ein Bounded Context mehrere Aggregate, was zu einer Modularisierung des Codes führt.