# Kopplung (Softwareentwicklung)

Unter Kopplung versteht man in der Informatik die Verknüpfung von verschiedenen Systemen, Anwendungen oder Softwaremodulen sowie ein Maß, das die Stärke dieser Verknüpfung bzw. der daraus resultierenden Abhängigkeit beschreibt.

## Kopplung von Systemen und Anwendungen

Einzelne Anwendungen oder Systeme können auf verschiedene Art und Weise zusammenarbeiten. Die Kopplung beschreibt hierbei, wie dies geschieht. Im Allgemeinen betrachtet man hierbei den Datenfluss von einer Anwendung bzw. einem System zu einem anderen. Man unterscheidet hierbei:
* Kopplung durch menschlichen Eingriff: Dies ist keine Kopplung im engeren Sinne, muss allerdings mit aufgeführt werden. Hierbei werden die Informationen durch einen Menschen zwischen den beiden Systemen transportiert (Turnschuhnetzwerk).
* Kopplung durch formatierte Dateien: Hierbei werden die Daten zwischen den Anwendungen mit einfachen Dateien (auch Flatfiles genannt) transportiert. Alle beteiligten Anwendungen müssen das entsprechende Format verstehen. Als Dateiformate werden häufig tabulatorgetrennte bzw. kommagetrennte oder XML-basierte Dateiformate verwendet.
* Kopplung durch Konverter: Das Problem, dass sich die verschiedenen Anwendungen auf ein Format zum Austausch einigen müssen, wird durch Konverter gelöst. Ein Konverter wandelt ein Datenformat in ein anderes um. Hierbei versucht er die Semantik der Daten beizubehalten. In vielen Fällen ist dies jedoch nicht vollständig möglich. Im Bereich der freien Software existieren viele Beispiele für Konverter. So wandelt beispielsweise dvi2ps eine DVI-Datei in eine PostScript-Datei um.
* Kopplung durch Kopplungsprozeduren: Bei der Kopplung über Prozeduren ruft das Client-System bei dem Server eine Funktion auf, mit deren Hilfe die Daten übertragen werden. Gleichzeitig ist hiermit das direkte Anstarten einer Logik auf Serverseite möglich. In den meisten Fällen muss für die Kopplung über diese Methode allerdings der Quelltext von einem oder von beiden Anwendungen angepasst werden. In den verschiedenen Programmiersprachen und Konzepten existieren unterschiedliche Techniken, um dies möglich zu machen (Stichworte: RPC oder RFC, CORBA, RMI, SOAP bzw. Web Service, .NET Remoting, COM, DCOM).

## Kopplung von Modulen

Auch innerhalb einer Anwendung betrachtet man verschiedene Arten der Kopplung und zwar die Kopplung zwischen einzelnen Softwaremodulen. Demgegenüber beschreibt der Begriff Bindung (Kohäsion) die Abhängigkeiten innerhalb von Modulen. Man strebt für ein System eine möglichst lose Kopplung sowie eine starke Bindung an.

### Arten der Kopplung

Es lassen sich verschiedene Arten der Kopplung unterscheiden, die sich nach ihrer Stärke ordnen lassen. Dabei gilt die Regel: Je niedriger die Kopplung, desto eigenständiger ist das Modul.

#### Kopplungsarten nach Myers

1974 beschrieb Glenford J. Myers die folgenden Kopplungsarten, in absteigender Stärke der Kopplung:
* Content coupling (Inhaltskopplung): Das Modul verlässt sich auf die konkrete inhaltliche Umsetzung eines anderen Moduls bzw. modifiziert die internen Daten des anderen. Diese sehr starke Art der Kopplung sollte unbedingt vermieden werden.
* Common coupling (Bereichskopplung): Zwei Module kommunizieren über gemeinsame globale Daten.
* External coupling (Externdatenkopplung): Zwei Module kommunizieren über einen extern vorgegebenen Mechanismus; beispielsweise eine bestimmte Datei mit definiertem Aufbau.
* Control coupling (Kontrollkopplung): Ein Modul nimmt Einfluss auf den Kontrollfluss eines anderen; beispielsweise durch einen Parameter, der die Art der konkreten Aktion spezifiziert. Hierbei ist zu unterscheiden, ob der Kontrollparameter ein Aufrufparameter oder ein Rückgabewert ist. Ersteres ist zu vermeiden, letzteres ist manchmal nicht zu ändern.
* Stamp coupling (Datenstrukturkopplung): Zwei Module kommunizieren über eine komplexe Datenstruktur, von der aber nur ein Teil verwendet wird.
* Data coupling (Datenkopplung): Zwei Module kommunizieren über elementare Daten, beispielsweise einfache Parameter.
Ursprünglich waren diese Kopplungsarten ungeordnet. Erst Meilir Page-Jones führte die oben genannte Ordnung ein. Dabei definierte er auch eine weitere Kopplungsart: tramp coupling. Diese herrscht vor, wenn ein Modul Parameter entgegennimmt, diese jedoch selbst nicht verwendet, sondern nur an andere Module weiterreicht.

#### Kopplungsarten nach IEEE

Auch das Institute of Electrical and Electronics Engineers (IEEE) definiert verschiedene Kopplungsarten, die bis auf Details denen von Myers entsprechen. Im Standard IEEE 610, dem Standard Glossary of Software Engineering Terminology, werden folgende Kopplungsarten unterschieden:
* pathological coupling (pathologische Kopplung): Entspricht der Inhaltskopplung in Myers’ Definition.
* content coupling (Inhaltskopplung): Ein Modul inkludiert den Inhalt eines anderen oder Teile davon.
* common-environment coupling (Bereichskopplung): wie bei Myers
* hybrid coupling (Hybridkopplung): Hierbei ist ein Parameter gleichzeitig Datum und Kontrollflussinformation. Beispielsweise könnte ein Parameter, der auf 0 gesetzt ist, bedeuten, dass die gegebene Information unbekannt ist. Hierbei muss zuerst herausgefunden werden, welcher Fall gegeben ist, und erst hinterher kann der Parameter verwendet werden. Hybridkopplungen sollten vermieden werden.
* control coupling: wie bei Myers
* data coupling: wie bei Myers

#### Kopplungsarten nach CPSA-F

Der iSAQB Certified Professional for Softwarearchitecture Foundation Level (CPSA-F) Lehrplan vermittelt mindestens folgende unterschiedliche Kopplungsarten und -ursachen:
* über Aufruf/Benutzung/Delegation
* über Nachrichten/Ereignisse
* über Komposition
* über Erzeugung
* über Vererbung
* strukturell
* zeitlich
* über Daten
* über Datentypen
* über Hardware