DDD: Die Grenzen eines Aggregats

Auf der Arbeit kultivieren wir gerade Eat’n’Read. Jeden Freitag sitzen wir zusammen, essen und lesen Implementing Domain Driven Design von Vaughn Vernon. Vernon arbeitet die Gedanken auf, die Eric Evans in Domain Driven Design entwickelt hat. Ein paar Dinge sind neu – Domain-Events – andere werden anders strukturiert, Schwerpunkte sind verschoben aber im Großen und Ganzen versucht sich Vernon am Original (?) zu orientieren. Um so interessanter ist es sich die Frage zu stellen, wo nun die Unterschiede zwischen Evans und Vernon sind.

Bei der Darstellung eines Aggregats, genauer: seiner Grenzen, differieren die Bücher. Aggregate sind kleine Objektkomplexe, die ein Wurzelobjekt besitzen, dass den Zugriff auf die anderen Objekte des Komplexes kapselt und eine API für die Arbeit mit ihnen zur Verfügung stellt. Typische Beispiele sind Warenkörbe, die den Zugriff und die Verwaltung von Warenkorbeinträgen kapseln oder Produkte, die als Gipfel über einer Pyramide von Farb- und Größenvarianten thronen. (Vorsicht: das sind nur Beispiele, Vernon zeigt deutlichst, wie sich diese Aggregate unter gewissen Umständen in mehrere Aggregate zerlegen lassen, so dass es keine kanonische Struktur einer Warenkorbmodellierung geben kann.)

Wie nun erkennt man die Grenzen eines Aggregats? Für Evans sind es zwei Momente, die auf die Grenzen verweisen. Es ist zum einen die Infrastruktur, die mir Hinweise derart bieten könnte wie: ‘Sie verlassen den Sektor des Aggregats A und betreten den des Aggregats B.’ Und es ist die Disziplin der Programmierer, die sich davor hüten die Grenzen zu überschreiten. Konkret bedeutet das, dass ich im Hibernate-Mapping das Aggregat mit Eager-Loading lade und die Grenze zum nächsten mit Lazy-Loading markiere. Im Code wären die beiden Referenzen gleich, in der Infrastruktur wäre ihr Unterschied substantiell.

Vernon verfolgt eine striktere Strategie. Seine Aggregate sind im Code klar zu erkennen. Innerhalb eines Aggregats erlaubt er die Navigation via Referenz. Auf angrenzende Aggregat verweist nur eine ID. Wenn ich zu einem anderen Aggregat navigieren will, muss ich ein Repository bemühen. Am Repository kann ich die ID gegen ein echtes Objekt eintauschen. Die Grenze meines Aggregat ist klar markiert. In der Hibernate-Sprache hieße das, dass ich Relationen nur in einem Aggregat mappen darf. An den Grenzen muss ich eine neue Query bemühen, um an das angrenzende Objekt zu gelangen. In der Sprache von RubyOnRails ausgedrückt: Die ActiveRecord-Mappings ‘has_many’, ‘has_one’ und ‘belongs_to’ sind nur in einem Aggregat gestattet.

Liest man weiter, merkt man, dass die beiden Bücher einen Kontext mitbringen, der ihre Differenz erzeugt. In der Vorstellungswelt von Evans sind Datenbanken relational oder objektorientiert. In der Welt von Vernon sind sie relational oder es sind NoSql-Datenbanken, etwas genauer – in der Sprache von Martin Fowler – aggregatorientierte Datenbanken. In Evans Welt einer relationalen Datenbank ist der Übergang von einem Aggregat zu einem anderen ein gradueller, ein Join wird komplizierter. Seine Art von Datenbank hat kein originäres Konzept eines Aggregats. Das Aggregat wird durch einen Join in einer Query erzeugt. In der Welt von Vernon, in der aggregatorientierten Datenbank, gibt es Aggregate (tautologisch). Solange ich diese Aggregate lade, spielt die Datenbank ihre Vorteile aus. Überschreite ich die Grenzen eines Aggregats, wird es teuer und die Vorteile der Datenbank verkehren sich in ihr Gegenteil. Es ist nicht nur sinnvoll, sondern existentiell im Code große Warnschilder: ‘Achtung Aggregatgrenze’ aufzustellen.

Der Unterschied in der Modellierung – explizite oder implizite Grenze – (Ich bin fest davon überzeugt, dass es auch jenseits der Infrastuktur gute Gründe gibt für den einen oder anderen Ansatz zu votieren.) zeigt sich so zunächst als Reflex auf eine andere Infrastuktur, auf Entwicklungen, die im Bereich der Datenbanken in den letzten Jahren stattgefunden haben und man kann unterstellen, dass auch Evans heute eine Antwort auf diese Herausforderung finden müsste, wie auch Vernon vor 10 Jahren noch nicht in dieser Schärfe die Grenzen seiner Aggregate markiert hätte.