Fortlaufend · neueste Einträge oben

Entwurfsmuster

Kumulative Projektdokumentation; ältere Einträge bleiben vollständig erhalten.

chronologischoffline

DDD Application Layer und Ports

Drei getrennte Application-Module mit Commands, Queries, Handlern, Projektionen und contextlokalen Ports wurden ergänzt. Payment-Provider-I/O liegt außerhalb lokaler Transaktionen; Aggregatezustand und Outbox-Übergabe bleiben lokal atomar.

  • 10 Commands und 3 Queries
  • 13 Handler und 3 Application Service Facades
  • 13 Output Ports
  • 3 Java-21-Smoke-Tests
  • Architektur-Fitness-Functions

Aggregate Root, Entity, Idempotent Receiver und Domain Event

StockItem und Payment schützen getrennte Grenzen; interne Entities besitzen Lebenszyklen; stabile Identitäten verhindern Doppelwirkung.

Aggregate Root, Factory und Domain Event

Order ist Aggregate Root; OrderFactory bündelt Erzeugung; sechs Domain Events entkoppeln Folgeaktionen; Collections bleiben gekapselt.

Ubiquitous Language

PatternZweckEinsatzortBegründung
Ubiquitous LanguageGemeinsame, präzise Sprache für Fachseite und UmsetzungDDD-Begriffskatalog, Sprachregeln und GesprächsszenarienVerhindert, dass technische oder mehrdeutige Wörter unbemerkt Architektur und Verhalten verzerren
Explicit Language LifecycleBegriffe kontrolliert vorschlagen, akzeptieren, lokal begrenzen oder veralten lassenSprachpflege und EntscheidungsverlaufFachsprache bleibt nachvollziehbar erweiterbar, ohne alte Bedeutungen still zu überschreiben

keine vorgezogene Musterwahl

Die DDD-Variante dokumentiert in diesem Kapitel bewusst noch keine taktischen Entwurfsmuster. Muster werden erst zusammen mit begründeten Einsatzorten in späteren Kapiteln ergänzt.

ergänzte Patterns · 12. Juli 2026

PatternZweckEinsatzortBegründung
Assertion Helpertechnische Assertions zentralisierenSmokeAssertionsweniger Duplikation ohne versteckte Fachlogik
Test Utility FacadeHTTP-Testmechanik kapselnHttpJsonClientFachszenarien bleiben lesbar
Regression Test Suitealle Slices gemeinsam ausführenTddCompletionRegressionsicherer Abschluss- und Refactoring-Nachweis
Architecture Fitness FunctionAbhängigkeitsrichtung automatisierenTddArchitectureFitnessTestArchitekturdrift früh erkennen
Test Suite Fitness Functiondeterministische Testregeln prüfenTestSuiteFitnessTestFlakiness und Mock-Kopplung vermeiden
Mutation Probezentrale Regeln absichtlich verändernAbschlusscheckTestwirksamkeit statt nur Testanzahl messen

ergänzte Patterns · 12. Juli 2026

PatternZweckEinsatzortBegründung
Repository AdapterPorts auf PostgreSQL abbildentdd-technical-adapters/.../jdbcDomänenmodell bleibt JDBC-frei
Unit of WorkConnection und Commit/Rollback bündelnJdbcContext, JdbcTransactionRunneratomare Slice-Operationen
Transactional OutboxDatenänderung und Event atomar speichernJdbcOutboxStore, OutboxEventPublisherkein Dual-Write-Verlust
Polling PublisherOutbox kontrolliert an Kafka liefernKafkaOutboxDispatcherat-least-once und Wiederanlauf
Adapter Contract TestPortverhalten gegen reale Technik prüfenPostgresAdapterITSQL-Dialekt und Constraints werden echt geprüft
Anti-Corruption Layertechnische/kontextuelle Daten in schmale Views übersetzenJdbcOrderingSources, JdbcLifecycleOrderStoreSlice-Kopplung begrenzen

Qualitäts- und Abschlussmuster

PatternZweckEinsatzortBegründung
Fitness FunctionArchitekturregeln automatisch schützenArchitekturtestmodulAbhängigkeitsrichtung bleibt ausführbar statt nur dokumentiert
Test PyramidTests nach Verantwortung staffelnDomain, Application, Adapterschnelle Fachtests und gezielte Integrationsnachweise
Test Doubletechnische Ports kontrolliert ersetzenApplication-TestsFehler- und Retry-Pfade reproduzierbar prüfen
Quality GateMindestqualität als BuildregelMaven-Profilelokale und CI-Prüfung folgen denselben Regeln
Mutation TestingAussagekraft von Tests messenDomain und Applicationreine Zeilenabdeckung reicht nicht aus
Software Bill of MaterialsBuildbestandteile transparent machenCycloneDX-AggregationLieferkettenanalyse vorbereiten
Architecture Decision RecordEntscheidungen mit Gründen konservierenfortlaufende Entscheidungsdokumentationspätere Änderungen bleiben nachvollziehbar

REST und Integration

PatternZweckEinsatzortBegründung
Data Transfer Objectexternen Vertrag vom Fachmodell trennenrest.dto.ApiDtosAPI- und Domain-Änderungen bleiben unabhängig
MapperDTOs explizit in Commands übersetzenRestCommandMapperkeine verteilte Konvertierungslogik in Controllern
Thin Controllernur HTTP-Orchestrierungsechs REST-ControllerFachregeln bleiben in Application und Domain
Exception TranslatorFachfehler als Problem Details abbildenApiExceptionHandlerkonsistente Status- und Fehlercodes
Correlation IdentifierVorgänge über Systemgrenzen verfolgenHeader, Events, Kafka-HeaderDiagnose und Audit werden möglich
Outbox Store PortDispatcher von JPA entkoppelnPorts.OutboxStoreAdapter hängen nicht voneinander ab
Lease / Competing Consumersparallele Auslieferung koordinierenJpaOutboxStorehorizontaler Betrieb ohne dauerhafte Sperre
StrategyTopic-Namen kapselnTopicNameStrategyNamenskonvention zentral und testbar
Gateway AdapterKafka und Zahlungsanbieter anbindenIntegration-ModulFremdsystemdetails bleiben außen
Anti-Corruption LayerProviderantworten übersetzenHttpPaymentGatewayexternes Modell dringt nicht in die Application ein
Composition Rootalle Implementierungen verdrahtenBootstrap-ModulFrameworkkopplung an einer Stelle konzentriert

Persistence Patterns

Data Mapper, Repository Adapter, Unit of Work, Transactional Outbox, Optimistic Lock, Pessimistic Lock und Reconstitution Factory wurden im Code markiert und in der Layered-Dokumentation mit Zweck, Einsatzort und Begründung beschrieben.

12. Juli 2026 –: Layered Fachmodell und Anwendung

PatternZweckEinsatzortBegründung
Aggregate RootBestellkonsistenz schützendomain.order.OrderStatus und Positionen ändern sich kontrolliert
Value Objectfachliche Werte typisierenMoney, Quantity, Address, IDs, Email, SKUverhindert Primitive Obsession
Snapshothistorische Werte stabilisierenOrder.Line und Invoice.LineKatalogänderungen wirken nicht rückwirkend
Service LayerUse Cases orchestrierensechs Application ServicesAdapter erhalten einen klaren Einstieg
RepositorySpeichertechnik abstrahierenApplication PortsDomain und Anwendung bleiben persistenzfrei
StrategyPayment Provider austauschbar machenPaymentGatewaytechnische Providerwahl bleibt außerhalb der Fachlogik
Domain Eventfachliche Ergebnisse ausdrückenBusinessEventZustellung wird von Entscheidung getrennt
Idempotent ReceiverWiederholungen sicher verarbeitenBestellung, Reservierung und Zahlungverhindert doppelte fachliche Wirkung
In-Memory Fakezustandsorientiert testenInMemoryPortsvermeidet fragile Mock-Kaskaden

12. Juli 2026 –: Layered-Grundstruktur

PatternZweckEinsatzortBegründung
Value Objectvalidierte Bestellidentitätlayered-domain / OrderIdverhindert Primitive Obsession
RepositoryPersistenzvertrag abstrahierenlayered-application / OrderRepositoryhält Technik aus der Anwendungsschicht
Application Service / FacadeUse-Case-Einstieglayered-application / PlaceOrderUseCaseeinheitlicher Zugriff für Eingangskanäle
Fitness FunctionArchitektur automatisch prüfenlayered-architecture-testsverhindert schleichende Grenzverletzungen

12. Juli 2026

Noch keine Java-Implementierung vorhanden. Ab wird jedes tatsächlich verwendete Muster direkt im Code kurz markiert und hier mit Zweck, Einsatzort und Begründung dokumentiert. Es werden keine Muster nur zu Demonstrationszwecken erfunden.

Darstellung

Design
Text
Dichte
⌂ Cockpit