Die letzte Lektion dieses Moduls sieht nicht mehr in einzelne Klassen, sondern auf die ganze Kladde: Welches Projekt kennt welches? Das D in SOLID, das Dependency-Inversion-Prinzip, wird oft verkürzt zu „programmiere gegen Schnittstellen“. Gemeint ist etwas Genaueres: Die Abhängigkeiten zeigen auf Abstraktionen, und die Abstraktion gehört dem, der sie braucht. Der Kern der Kladde beschreibt, was er von außen braucht, als Port. Die Ränder, Datenbank, TED, Mail, Web, erfüllen diese Ports als Adapter. Der Kern kennt keinen von ihnen.

Das kennen Sie seit Lektion 1.4.6 und 2.4.11. In dieser Lektion prüfen Sie, ob es in Ihrer Kladde nach vierzehn Modulen noch stimmt, drehen eine falsche Richtung um und lassen einen Test darüber wachen, damit es so bleibt.

Richtung statt Schnittstellen

Ein Beispiel macht den Unterschied klar. Der nächtliche Import liest Ausschreibungen von TED (Lektion 2.8.2). Zwei Bauweisen:

Falsch herum: Im Kern steht die Regel, welche Ausschreibungen das Büro interessieren. Sie arbeitet mit dem Record TedNotice, so wie er aus dem JSON von TED kommt, und TedNotice liegt in Kladde.Ted. Also verweist Kladde.Core auf Kladde.Ted. Eine Schnittstelle gibt es trotzdem, etwa ITedClient in Kladde.Ted. Der Kern hängt jetzt an TED: Ändert TED sein Format, ändert sich der Kern, und ein Test der Regel braucht das Projekt mit dem HTTP-Client.

Richtig herum: Der Kern beschreibt, was er braucht, in seiner eigenen Sprache: einen Record Tender mit Nummer, Titel, Frist und CPV-Codes, und den Port ITenderSource aus Lektion 2.8.1, der Tenders liefert. Kladde.Ted verweist auf den Kern, setzt den Port um und übersetzt das JSON von TED in Tenders. Ändert TED sein Format, ändert sich nur der Adapter.

Beide Male gibt es eine Schnittstelle. Der Unterschied ist, wem sie gehört und wohin der Pfeil zeigt. Das ist die „Inversion“: Ohne den Port zeigte der Pfeil vom Kern zur Technik, mit ihm zeigt er von der Technik zum Kern. In K4 heißt diese Bauweise mit Ports und Adaptern hexagonale Architektur (Lektion 4.3.5); die Idee ist dieselbe.