Kopplung
Kopplung beschreibt den Grad der Abhängigkeiten zwischen den Komponenten eines Softwaresystems. Eine Komponente A ist an die Komponente B gekoppelt, wenn Änderungen in B Änderungen in A nach sich ziehen. Je höher der Kopplungsgrad eines Systems, desto schwieriger sind Änderungen.
Implizite Kopplung
Die Kopplung zweier Komponenten ist implizit, wenn diese eng gekoppelt sind, ohne das dies offensichtlich ist. Mein erstes Beispiel sind zwei Microservices, die immer gemeinsam deployed werden müssen. Die separaten Services suggerieren ein lose gekoppeltes System, das tatsächlich eng gekoppelt ist. Änderungen im ersten Service funktionieren nicht ohne Änderungen im anderen Service.
Mein zweites Beispiel ist eine klassische Schichtenarchitektur. Die Schichten publizieren definierte Schnittstellen und suggerieren eine lose Kopplung. Tatsächlich führt fast jede Änderung in der UI-Schicht zu Änderungen in den darunter liegenden Schichten. So muss ein neues Feld in der Benutzungsoberfläche auch der Domain- und der Persistenzschicht zugefügt werden. Im Sinne einer Usecase-zentrierten Entwicklung sind die Schichten eng gekoppelt. In dem beschriebenen Beispiel wurden die einzelnen Schichten darüberhinaus in jeweils eigenen Git-Repositories verwaltet, was die implizite Kopplung zusätzlich verschleiert.
Implizite Kopplung verbirgt nicht nur die tatsächliche Kopplung, sondern sorgt für zusätzlichen Entwicklungsaufwand. So erhöht die Verteilung der Schichten auf mehrere Git-Repositories den Aufwand bei der Verwendung von Feature-Branches, da jedes Repository gebranched und nach Abschluss gemerged werden muss. Die Verwendung von Standard-Tools, wie Git-Flow Maven Plugin oder das Maven Release Plugin wird schwierig bis unmöglich.
Explizite Kopplung
Kopplung lässt sich nur bis zu einem bestimmten Grad vermeiden. Nicht vermeidbare Kopplung sollte explizit, d.h. unmittelbar sichtbar gemacht werden. Im Service-Beispiel sollte die Kopplung explizit gemacht werden, indem die beiden Services in einen Service zusammengeführt werden. Im Schichtenbeispiel suggerieren die mehreren Repositories eine nicht vorhandene lose Kopplung. Diese tatsächlich enge Kopplung sollte im ersten Schritt explizit gemacht werden, in dem die Sourcen in ein Repository zusammengeführt werden. Im zweiten Schritt kann über die Reduzierung der Kopplung nachgedacht werden, z.B. durch die Umstellung auf vertikale, d.h. Usecase-zentrierte Modularisierung.
Das Sichtbarmachen der Kopplung hebt die Kopplung nicht auf, vereinfacht den Entwicklungsaufwand aber erheblich. So ließen sich nach der Zusammenführung der Git-Repositories Standardtools wie das Git-Flow Maven Plugin oder das Maven Release Plugin sehr viel einfacher nutzen