DDD & Co., Teil 3: Commands und Events

the next big thing  –  0 Kommentare
Anzeige

Das Ergebnis der vergangenen Folge war eine Definition der fachlichen Ereignisse für eine To-do-Liste. Verursacht werden sie in der Regel durch Aktionen des Anwenders, die seine Absichten und Wünsche ausdrücken. Wie lässt sich das modellieren?

Die in der vergangenen Folge definierten Ereignisse bilden den Kern der allgegenwärtigen Sprache, die der Kommunikation in einem interdisziplinären Team dient. Eine der Besonderheiten dieser Sprache ist der begrenzte Kontext, innerhalb dessen Grenzen sie gültig ist. Sie ist also nicht universell.

Anzeige

Die fachlichen Ereignisse beschreiben, welche Fakten im Lauf der Zeit in einer Domäne geschaffen wurden. Da die Vergangenheit nicht rückgängig gemacht werden kann, benennt man die fachlichen Ereignisse mit Hilfe von Verben in der Vergangenheitsform.

Die einzige Möglichkeit, am Ergebnis der bereits geschehenen Ereignisse etwas zu ändern, besteht darin, neue Ereignisse zu verursachen. Die Wirkung lässt sich also durchaus mit Hilfe von entgegengerichteten Ereignissen aufheben – die Ereignisse an sich lassen sich aber nicht rückgängig machen.

Das zeigt sich beispielsweise daran, dass die Arbeit an einer bereits abgehakten Aufgabe zu einem späteren Zeitpunkt wieder fortgesetzt werden kann. Dadurch wird die Aufgabe doch noch nicht als erledigt angesehen, aber die Tatsache, dass sie bereits einmal abgehakt war, bleibt bestehen.

Das alles wirft die Frage auf, wodurch fachliche Ereignisse überhaupt ausgelöst werden. Wer sagt, dass eine Aufgabe abgehakt wurde, muss als Nächstes mit der naheliegenden Frage rechnen, von wem sie abgehakt wurde – und warum.

Die Antwort darauf ist zugleich die Antwort auf die Frage nach der Ursache von Ereignissen: Das Abhaken der Aufgabe wurde von einem Anwender ausgeführt, um die Aufgabe als erledigt zu markieren. Die Ursache für Ereignisse sind also Aktionen der Anwender, auf die das System dann mit einem oder mehreren Ereignissen reagiert.

Diese Aktionen der Anwender werden in sogenannten Kommandos (englisch: Commands) gekapselt. Sie entsprechen einem Wunsch, außerdem wohnt ihnen stets eine Intention inne, die erklärt, welches Ziel mit dem Ausführen des Kommandos verfolgt wird.

Im Gegensatz zu fachlichen Ereignissen werden Kommandos durch Verben im Imperativ beschrieben. Sie stellen daher Aufträge der Anwender an das System dar, aus denen dann die fachlichen Ereignisse entstehen. Im Gegensatz zu Ereignissen, die im Nachhinein nicht mehr reversibel oder änderbar sind, können Kommandos vom System zunächst abgelehnt werden.

Das gilt beispielsweise dann, wenn das Ausführen eines Kommandos von einer Validierung abhängt, die jedoch fehlschlägt. So könnte das System beispielsweise das Kommando edit ablehnen, wenn die zugehörige Aufgabe bereits abgehakt wurde. In dem Fall würde entweder kein fachliches Ereignis oder lediglich ein Fehlerereignis erzeugt werden.

Sieht man von Fehlerereignissen ab, besteht der einfachste Fall in einer 1:1-Beziehung zwischen einem Kommando und einem fachlichen Ereignis: Das Kommando löst, sofern es vom System zugelassen wird, genau ein fachliches Ereignis aus.

Diese Regel ist jedoch nicht in Stein gemeißelt. Es ist denkbar, dass ein Kommando mehrere Ereignisse auslöst, oder dass ein- und dasselbe Ereignis das Resultat von verschiedenen Kommandos ist. Außerdem gibt es Ereignisse, die nicht durch ein Kommando ausgelöst werden, sondern beispielsweise zeitgesteuert sind.

Kommandos und fachliche Ereignisse sind beide Bestandteil der gleichen allgegenwärtigen Sprache, bewegen sich also im gleichen begrenzten Kontext. Im Beispiel der To-do-Liste geht es dabei letztlich um Planung, weshalb man den Kontext planning nennen und die Kommandos wie folgt bezeichnen könnte:

  • note
  • edit
  • tick off
  • resume
  • discard
  • archive

Damit stehen neben den fachlichen Ereignissen auch die auslösenden Kommandos und der Name des Kontexts fest.

Was nun noch fehlt, ist die eigentliche Logik, die sich um die Validierung der Kommandos und das Sicherstellen der Konsistenz kümmert. Diese Aufgabe übernehmen Aggregate (englisch: Aggregates), um die es in der kommenden Folge gehen wird.

tl;dr: Fachliche Ereignisse werden in der Regel von Kommandos ausgelöst, die die Wünsche der Anwender ausdrücken. Sie gehören zu einer gemeinsamen allgegenwärtigen Sprache und bewegen sich daher im gleichen begrenzten Kontext.

Anzeige