Wikipedia · einfach zusammengefasst · Stand
Data Context Interaction
Sie entsprechen dem Model des Model View Controller-Architekturmusters. Ein Beispiel für ein Datenobjekt wäre ein „Bankkonto“. Es hätte simple Methoden, um …
Inhalt6 Abschnitte
Kernidee
Data Context Interaction (DCI, deutsch Daten-Kontext-Interaktion) ist ein Architekturmuster für komplexe objektorientierte Software. Es dient dazu, Fachlichkeit, also die fachlichen Abläufe und Regeln einer Anwendung, klar zu modellieren. DCI trennt dafür drei Dinge: Data, also Datenobjekte oder Fachobjekte; Context, also Anwendungsfälle, Szenarien oder Algorithmen; und Interaction, also Rollen, die Datenobjekte in einem bestimmten Anwendungsfall übernehmen.
Die Grundidee ist, beim Entwurf nicht zuerst Klassen zu modellieren, sondern Objekte zur Laufzeit zu beschreiben. Man soll also eher daran denken, welche konkreten Objekte in einem Ablauf vorkommen und welche Rollen sie dort spielen, statt Klassen mit vielen Funktionen auszustatten. Dadurch sollen keine mit Funktionalitäten überladenen Klassen entstehen. Stattdessen gibt es einfache Fachobjekte ohne eigene fachliche Funktionalität, während die eigentlichen Anwendungsfälle in Context-Klassen und die Rollen in Interaction-Klassen ausgelagert werden.
DCI wurde erstmals von Trygve Reenskaug beschrieben, dem Erfinder des Model-View-Controller-Architekturmusters. Später wurde er dabei federführend von James O. Coplien unterstützt.
Datenobjekte
Data bezeichnet bei DCI die Fachobjekte und ihre Beziehungen untereinander. Diese Datenobjekte enthalten keine fachlichen Funktionen mehr, sondern sind mehr oder weniger einfache Datenhalter. Sie sollen dem gedanklichen Modell entsprechen, das Anwender von den Daten der Anwendung haben. Im Model-View-Controller-Architekturmuster entsprechen sie dem Model.
Ein Beispiel ist ein Bankkonto. Es hätte einfache Methoden, um den Kontostand abzufragen und zu verändern. Es hätte aber keine Funktionalitäten, die Transaktionen, den Zugriff auf andere Objekte oder Benutzerinteraktionen benötigen. Solche Aufgaben werden bei DCI durch Kontexte ermöglicht.
Data-Klassen entsprechen im Domain-driven Design den Entities, Value Objects und Aggregates. Entities sind fachliche Objekte mit eigener Identität, Value Objects sind Wertobjekte, und Aggregates sind zusammengehörige Gruppen von Fachobjekten.
Kontexte
Context beschreibt den Zusammenhang, in dem Data-Objekte in bestimmten Rollen verwendet werden. Damit sind die Anwendungsfälle, Szenarien und Algorithmen der fachlichen Aufgabenstellung einer Anwendung gemeint.
Kontexte sind Objekte, die einen oder mehrere Anwendungsfälle repräsentieren. Sie werden für jede Ausführung eines Use-Cases, also eines konkreten Anwendungsfalls, instantiiert. Ihre Hauptaufgabe ist es, die Data-Objekte zu identifizieren, die in diesem Anwendungsfall eine bestimmte Rolle spielen, und sie mit dieser Rolle zu verbinden. Dieses Binden der Data-Objekte an Rollen wird mit Polymorphismus in der objektorientierten Programmierung verglichen.
Die Umsetzung eines bestimmten Anwendungsfalls ist damit der Ablauf einer Business-Funktionalität auf Grundlage von Daten-Klassen, die in diesem Anwendungsfall bestimmte Rollen spielen. Die gesamte Businessfunktionalität einer Anwendung ist die Summe eines Netzwerks an Methoden, das dezentral in verschiedenen Rollen liegt.
Ein Beispiel ist ein Banktransfer zwischen zwei Konten. Der Kontext „Banktransfer“ verwendet das Datenobjekt „Bankkonto“ in den Rollen „Quellkonto“ und „Zielkonto“. Durch die Trennung von Datenobjekten und Rollen können auch Banktransfers zwischen anderen Kontentypen, etwa Kreditkonten oder Sparkonten, umgesetzt werden, ohne auf die eigentlichen Datenobjekte dahinter Rücksicht zu nehmen.
Interaktionen und Rollen
Interaction bezeichnet bei DCI die Rollen, die Datenobjekten zugeordnet werden können. Eine Rolle entspricht der Vorstellung eines Anwenders davon, welche Verantwortlichkeiten Objekte im System haben. Eine Rolle ist also eine Sammlung von Verantwortlichkeiten.
In klassischer Objektorientierung werden Verantwortlichkeiten meist Objekten oder Klassen zugeschrieben. Bei DCI liegen diese Verantwortlichkeiten dagegen bei den Interaktionen und damit bei Rollen. Ein Objekt kann in verschiedenen Anwendungsfällen unterschiedliche Rollen übernehmen. Ein Bankkonto kann zum Beispiel einmal „Quellkonto“, ein anderes Mal „Zielkonto“ und wieder ein anderes Mal „Transferkonto“ sein.
Ein Beispiel für eine Rolle ist ein Zielkonto, auf das im Anwendungsfall „Banktransfer“ Beträge gebucht werden können.
Vergleich mit anderen Ansätzen
Im Vergleich zur Objektorientierung passt DCI nicht vollständig zu deren Grundsätzen. In der Objektorientierung gibt es kein Konzept, das vollständig den Rollen der DCI-Interaktionen entspricht. Deshalb wirken viele DCI-Implementierungen in objektorientierten Programmiersprachen gewöhnungsbedürftig. Vertreter von DCI kritisieren außerdem, dass Objektorientierung oft praktisch als Orientierung an Klassen verstanden wird, während DCI stärker auf die Objekte zur Laufzeit eines Programms ausgerichtet ist.
Im Verhältnis zu Domain-driven Design kann DCI dessen Bestandteile ergänzen und selbst durch sie ergänzt werden. Datenobjekte von DCI können durch Entitäten, Wertobjekte und Aggregate des Domain-driven Designs verfeinert werden. Context-Objekte lassen sich durch Serviceobjekte und Fachliche Ereignisse abbilden. Die Rollen der DCI-Interaktionen erweitern wiederum die Bestandteile des Domain-driven Designs.
Aspektorientierte Programmierung hat viele Anwendungsbereiche, von denen einige auch mit DCI umgesetzt werden können. Die Ziele von DCI sind vergleichbar mit denen der aspektorientierten Programmierung, und wie diese basiert DCI auf einer starken Form der Reflection oder Meta-Programmierung. Anders als Aspekte können die Rollen der DCI-Interaktionen einfach aggregiert und zusammengefasst werden. Kontexte bilden einen Rahmen für die Zusammenarbeit von Rollen, während Aspekte nur mit den Objekten zusammenarbeiten, auf die sie angewendet werden.
Composite oriented Programming, auf Deutsch etwa verbundorientierte Programmierung, überschneidet sich mit DDD, AOP und DCI. Es beruht auf den Prinzipien, dass Verhalten kontextabhängig modelliert werden muss, Entkopplung eine Tugend ist und ständig gepflegt werden muss, und dass Geschäftsregeln wichtiger sind als Infrastruktur wie Persistenz oder Sicherheit.
Umsetzung in Programmiersprachen
Es gibt inzwischen erste Umsetzungen von Data Context Interaction für verschiedene Programmiersprachen. Da DCI jedoch ein anderes und neues Programmierparadigma darstellt, ist die Umsetzung in anderen Programmiersprachen oft holprig und umständlich. Für die Umsetzung von Rollen ist üblicherweise das Injizieren von Methoden notwendig.
Einige wenige Sprachen unterstützen Rollen nativ. Andere Sprachen verwenden dynamische oder statische Injection oder Pre-Kompilierung, um DCI zu simulieren. Eine native Umsetzung von Data Context Interaction gibt es derzeit noch nicht.
Eine Umsetzung von DCI ist Apache Zest, ehemals Qi4j. Das ist ein Java Framework für Domain-zentrierte Applikationsentwicklung und basiert auf Konzepten wie aspektorientierter Programmierung, Data Context Interaction und Domain-driven Design. Scala besitzt mit sogenannten Traits ein Sprachkonstrukt, mit dem sich Rollen nativ umsetzen lassen. Außerdem gibt es erste Ansätze für PHP mit dem Wax Framework sowie für Smalltalk, C++, C#, Ruby, JavaScript und Python.