Code und Architektur
Entwurfsmuster im Maven-Projekt V6
Die Muster sind in den vorhandenen Java-Klassen kurz kommentiert. Diese Dokumentation ergänzt Zweck, Einsatzort, Begründung und Grenzen.
| Pattern | Zweck | Einsatzort | Begründung | Grenzen |
|---|---|---|---|---|
| Aggregate Root | Schützt fachliche Invarianten und bündelt Zustandsänderungen. | order-domain/Order.java | Bestellungen können nur mit Positionen platziert werden; nach dem Platzieren sind keine neuen Positionen zulässig. | Das Beispiel modelliert nur wenige Regeln und keine Persistenz- oder Nebenläufigkeitskonflikte. |
| Value Object | Repräsentiert einen unveränderbaren fachlichen Wert. | shared-kernel/TrainingEvent.java | Event-ID, Typ und Zeitpunkt werden als unveränderbares Record transportiert. | Der Name TrainingEvent ist generisch; produktiv wären domänenspezifische Eventtypen sinnvoll. |
| Hexagonal Architecture | Trennt Use Case und Domain von technischen Adaptern. | order-application/PlaceOrderUseCase.java | Der Use Case kennt nur Repository- und Publisher-Ports. | Die Maven-POMs bilden die beabsichtigte Abhängigkeitsrichtung derzeit nicht ab. |
| Command Handler | Kapselt die Verarbeitung eines Schreibbefehls. | PlaceOrderUseCase.handle | Der Place-Order-Befehl hat einen klaren Einstieg und Rückgabewert. | Validierung, Autorisierung, Transaktion und Fehlerabbildung sind nicht ausgearbeitet. |
| Outbox | Entkoppelt fachliche Speicherung und spätere Ereignisveröffentlichung. | order-adapter-events/OutboxPublisher.java | Der Adapter markiert die Stelle für zuverlässige Veröffentlichung. | Aktuell nur In-Memory-Set; keine Datenbank-Outbox, keine Transaktion und kein Broker. |
| Idempotent Consumer | Verhindert doppelte Verarbeitung derselben Event-ID. | OutboxPublisher | Bereits veröffentlichte UUIDs werden erkannt. | Der Speicher ist pro Prozess flüchtig und nicht clusterfähig. |
| Facade | Vereinfacht den Zugriff auf eine komplexe oder alte Schnittstelle. | legacy-soap-adapter/LegacySoapFacade.java | Der Aufrufer sieht nur eine einfache Kreditprüfungsoperation. | Kein realer SOAP-Client, keine Fehler-/Timeout-/Mapping-Strategie. |
| Anti-Corruption Layer | Isoliert Begriffe und Datenmodelle eines Altsystems. | LegacySoapFacade | Legacy-Kundennummern werden in ein neutrales Ergebnisobjekt übersetzt. | Die Mapping-Logik ist stark vereinfacht. |
| Specification | Formuliert Regeln explizit und wiederverwendbar. | architecture-tests/ArchitectureRuleCatalog.java | Architekturregeln werden als lesbarer Katalog zentralisiert. | Keine ausführbare ArchUnit-Spezifikation; Regeln werden derzeit nicht automatisch erzwungen. |
| Context Object | Transportiert technische Kontextdaten gebündelt. | observability/TraceContext.java | Trace-ID bleibt explizit und wird nicht in die Fachlogik versteckt. | Kein Propagation-, MDC-, OpenTelemetry- oder Thread-Kontext-Mechanismus. |
Statushinweis: Ein Pattern gilt nur dann als implementiert, wenn eine konkrete Java-Klasse vorhanden ist. Reine POM-/Strukturmodule werden in der Maven-Projektübersicht als Zielbild gekennzeichnet.