# Data Context Interaction

Data Context Interaction (DCI, deutsch Daten-Kontext-Interaktion) ist ein Architekturmuster für die Modellierung der Fachlichkeit komplexer objektorientierter Software. DCI trennt Fachobjekte (Data) von Anwendungsfällen (Context) und Rollen (Interaction). DCI wurde erstmals von Trygve Reenskaug, dem Erfinder des Model-View-Controller-Architekturmusters, beschrieben. Später wurde er darin federführend von James O. Coplien unterstützt.

## Beschreibung

Data Context Interaction basiert auf der Idee, nicht – wie sonst in der objektorientierten Analyse und Design üblich – Klassen zu modellieren, sondern Objekte zu beschreiben. Bei DCI sollte beim Modellieren eher an die Instanzen zur Laufzeit als an die Klassen, aus denen die Objekte instanziert wurden, gedacht werden.
Diese Herangehensweise verspricht keine mit Funktionalitäten überladene Klassen zu bekommen, sondern simple Fachobjekte (Data) ohne eigene fachliche Funktionalität, welche unterschiedliche Rollen (d. h. Funktionalitäten) erfüllen, die aber selbst in die Interaction-Klassen ausgelagert werden. Die eigentliche Fachlichkeit (d. h. Anwendungsfälle) selbst wird in den sogenannten Context-Klassen abgebildet.
Data Context Interaction ist gekennzeichnet durch die strikte Trennung von Data (Datenobjekte – entspricht in etwa den Fachobjekten), Context (Kontext – entspricht Anwendungsfällen, Szenarien oder Algorithmen) und Interaction (Interaktionen – entspricht den Rollen, die die Datenobjekte in unterschiedlichen Kontexten wahrnehmen):

### Data (Datenobjekte)

Bezeichnet die Fachobjekte und ihre Relationen untereinander. Diese Datenobjekte enthalten keinerlei fachliche Funktionen mehr und sind mehr oder weniger simple Datenhalter. Sie sollten dem gedanklichen Modell des Anwenders zu den Daten der Applikation entsprechen. 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 den Kontostand abfragen und verändern zu können, aber keine Funktionalitäten, welche Transaktionen oder den Zugriff auf andere Objekte oder Benutzerinteraktionen benötigen. Derartige Aufgabenstellungen werden in DCI durch die Kontexte ermöglicht.
Data-Klassen entsprechen den Entities, Value Objects und Aggregates im Domain-driven Design.

### Context (Kontext)

Beschreiben den Kontext, in welchem die Data-Objekte in spezifischen Rollen verwendet werden. Dies sind die Anwendungsfälle, Szenarien und Algorithmen der fachlichen Aufgabenstellung der Applikation.
Kontexte sind Objekte, welche einen oder mehrere Anwendungsfälle repräsentieren und werden für jede Ausführung eines Use-Cases instantiiert. Ihre Hauptaufgabe ist es, die Data-Objekte zu identifizieren, welche eine bestimmte Rolle in dem Anwendungsfall spielen, und diese auch mit dieser Rolle zu assoziieren. Dieses Binden der Data-Objekte an ihre Rollen ist vergleichbar mit dem Polymorphismus in der Objektorientierten Programmierung.
Die Umsetzung eines bestimmten Anwendungsfalles ist somit der Ablauf einer Business-Funktionalität basierend auf Daten-Klassen welche in diesem Anwendungsfall eine bestimmte Rolle spielen.
Die gesamte Businessfunktionalität einer Applikation ist somit die Summe eines Netzwerks an Methoden, dezentralisiert in verschiedenen Rollen.
Ein Beispiel für einen Kontext wäre ein Banktransfer zwischen zwei Konten. Dieser Banktransfer bedient sich des Datenobjektes „Bankkonto“ in den Rollen „Quellkonto“ und „Zielkonto“. Die Trennung von Datenobjekten und Rollen ermöglicht es beispielsweise auch, Banktransfers zwischen anderen Kontentypen (wie Kreditkonten oder Sparkonten) zu implementieren, ohne auf die eigentlichen Datenobjekte dahinter Rücksicht zu nehmen.

### Interaction (Interaktionen)

Unter Interaktionen versteht man bei Data Context Interaction die Rollen, welche Datenobjekten zugeordnet werden können. Eine Rolle entspricht bei DCI der Vorstellung eines Anwenders von den Verantwortlichkeiten von Objekten im System. Eine Rolle ist eine Sammlung an Verantwortlichkeiten.
Während in der Objektorientierung die Verantwortlichkeiten in Objekten oder Klassen gesehen werden, werden diese bei DCI den Interaktionen und somit den Rollen zugeschrieben. Objekte übernehmen in einem Anwendungsfall bestimmte Rollen, welche von Anwendungsfall zu Anwendungsfall unterschiedlich sein können. Ein Bankkonto übernimmt einmal die Rolle „Quellkonto“, ein anderes Mal die Rolle „Zielkonto“ und wiederum ein anderes Mal die Rolle „Transferkonto“.
Ein Beispiel für eine Rolle wäre ein Zielkonto, auf welches beim Anwendungsfall „Banktransfer“ Beträge gebucht werden können.

## Vergleiche zu anderen Technologien
### Objektorientierung (OO)

    Data Context Interaction ist ein Architekturmuster, welches sich nicht vollständig mit den Grundsätzen der Objektorientierung vereinbaren lässt. So gibt es in der Objektorientierung kein Konzept, welches vollständig auf die Rollen der Interaktionen von DCI passen würde. Das ist auch ein Grund dafür, dass die meisten Implementierungen von DCI mit objektorientierten Programmiersprachen gewöhnungsbedürftig sind.
    Darüber hinaus kritisieren die Vertreter von DCI, dass die Objektorientierung landläufig eine Orientierung an Klassen darstellt, während DCI sich viel stärker an den Objekten der Laufzeit eines Programmes orientiert.

### Domain-driven Design (DDD)

    Data Context Interaction ist ein Architekturmuster, welches die Bestandteile von Domänenmodellen des Domain-driven Designs (Entitäten, Wertobjekte, Aggregate, Serviceobjekte und Fachliche Ereignisse) ergänzen kann, beziehungsweise durch diese ergänzt werden kann. So können die Datenobjekte von DCI durch die Entitäten, Wertobjekte und Aggregate von DDD verfeinert werden, Kontext Objekte wiederum lassen sich durch Serviceobjekte und Fachliche Ereignisse abbilden. Die Rollen der Interaktionen von DCI jedoch erweitern wiederum die Bestandteile des Domain-driven Designs.

### Aspektorientierte Programmierung (AOP)

    Aspektorientierte Programmierung hat eine Vielfalt an Anwendungsbereichen, einige davon können auch mittels DCI umgesetzt werden, denn die Ziele von DCI sind vergleichbar mit den Zielen aspektorientierter Programmierung – und wie AOP basiert DCI auch auf einer starken Form der Reflection oder Meta-Programmierung. Im Gegensatz zu Aspekten können aber die Rollen der Interaktionen von DCI einfach aggregiert und zusammengefasst werden. Kontexte bieten einen Rahmen für die Zusammenarbeit von Rollen, während Aspekte nur mit den Objekten zusammenarbeiten auf die sie angewendet werden.

### Composite oriented programming (COP)

    Composite oriented Programming (eine mögliche Übersetzung ins Deutsche wäre Verbundorientierte Programmierung) entspricht einem Konzept, welches eine Überschneidung der hier genannten Konzepte DDD, AOP und DCI darstellt. Es beruht auf folgenden Prinzipien: Verhalten muss kontextabhängig modelliert werden, Entkopplung ist eine Tugend und muss daher ständig gepflegt werden, Geschäftsregeln sind wichtiger als Infrastruktur wie Persistenz oder Sicherheit.

## Implementierungen

Inzwischen gibt es eine Reihe von ersten Umsetzungen von Data Context Interaction für verschiedene Programmiersprachen. Da jedoch DCI ein anderes, neues Programmierparadigma darstellt, ist seine Umsetzung auf andere Programmiersprachen oft holprig und umständlich. Beispielsweise ist für die Umsetzung von Rollen üblicherweise das Injizieren von Methoden notwendig. Einige wenige Sprachen unterstützen Rollen nativ, bei anderen Sprachen wird dynamische oder statische Injection oder Pre-Kompilierung verwendet 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), ein Java Framework für Domain-zentrierte Applikationsentwicklung, basierend auf Konzepten wie Aspektorientierte Programmierung, Data Context Interaction und Domain-driven Design. Scala besitzt mit den so genannten Traits ein Sprachkonstrukt mit dem sich Rollen nativ umsetzen lassen, darüber hinaus gibt es erste Ansätze für Umsetzungen mit PHP (Wax Framework), Smalltalk, C++, C#, Ruby, JavaScript und Python.