Was nützen ein paar Autoteile, die auf einer Rennstrecke sitzen, jemandem?
Wenn Ihre Autoklasse nur Autoteile hält, ist dies genauso nützlich wie ein nasser Beutel mit Teilen.
Verwendungszweck
Was ich als Fahrer will, kann ich kontrollieren. Das reagiert, wenn ich nach Geschwindigkeit frage. Das funktioniert wie auf Schienen. Das kann auf einen Cent aufhören.
Was ich will, ist eine Autoklasse, die nutzbar ist. Dass ich sagen kann, Dinge zu tun, ohne darüber nachdenken zu müssen, wie der Vergaser funktioniert. Ich denke nur an das Gaspedal. Wie diese miteinander verbunden sind, ist nichts, worüber ich mir Sorgen mache. Das ist Abstraktion.
Abhängigkeitsspritze
Die Abhängigkeitsinjektion hat damit nichts zu tun. Wenn ich das Auto fahre, denke ich nicht daran, wie es gebaut wurde. Solange es funktioniert, ist es mir egal, wie sie es zusammensetzen.
Nein, DI ermöglicht es meiner Boxencrew, meine Reifen schnell gegen bessere auszutauschen, wenn es auf der Strecke zu regnen beginnt. Es ist schön, das zu können, ohne in ein ganz anderes Auto steigen zu müssen.
Bei DI geht es wirklich darum, einem Prinzip zu folgen: Trennung von Konstruktion.
Ein Auto, das neue Reifen mit einer Geschwindigkeit von 90 Meilen pro Stunde einbauen kann, klingt vielleicht cool, aber ich glaube nicht, dass es Rennen mit einem Reifen gewinnen wird, der einen Apparat installiert.
Bei DI geht es darum, Ihre Teile so zu installieren, dass Ihre Boxencrew sie erreichen kann. Wenn Sie new
an derselben Stelle verwenden, an der Sie das Verhalten programmieren, ist es, als würden Sie den Vergaser an Ort und Stelle schweißen. Sicher, ein Acetylenbrenner könnte es entfernen, aber bitte ziehen Sie in Betracht, zuerst Schrauben und Muttern zu verwenden.
Das ist DI. Sicher ist es nicht so einfach new
, etwas zu erfinden, sobald Sie erkennen, dass Sie es wollen. Stattdessen müssen Sie separaten Code schreiben, der weiß, wie Sie Ihr Auto bauen. Aber es macht es sicher einfacher, Dinge später zu ändern. Und das bedeutet, dass Sie kein Auto-Montagewerk mit sich herumschleppen müssen.
Konstruktion
Irgendwo muss etwas wissen, ob die Reifen Goodyear sind. Wo soll dann die Auto-Bauordnung stehen? Wenn nicht das Auto, dann die Boxencrew? Nein, die Strecke? Alle haben Verhaltenscode. Code, der während des Rennens ausgeführt werden muss. Der Bau des Autos sollte vor dem Rennen an einem Ort erfolgen, der nicht im Verhaltenscode enthalten ist. Mark Seemans nannte diesen Ort die Kompositionswurzel . Die meisten Leute nennen es main.
Es ist ein einfaches Muster. Erstellen Sie im Wesentlichen das Objektdiagramm und rufen Sie dann eine Verhaltensmethode für ein Objekt im Objektdiagramm auf. Das ist es. Dies ist der EINZIGE Ort, an dem Konstruktion und Verhalten zusammen sein müssen.
Das bedeutet nicht, dass die Konstruktion ein Stapel von Verfahrenscodes sein muss, die alle nacheinander in der Hauptsache angeordnet sind. Sie können jedes Werkzeug in der Sprache verwenden, um Konstruktionen durchzuführen. Vermische es einfach nicht mit Verhalten.
Dies in der Sprache zu tun und kein DI-Framework oder IoC-Container zu verwenden, wird als reines DI bezeichnet . Es funktioniert sehr gut. Hat schon lange. Früher nannten wir es einfach Referenzübergabe .
DI-Werkzeuge
Was Ihnen ein DI-Tool kauft, sind die Konstruktionsdetails, die in eine andere Sprache (xml, json, was auch immer) verschoben wurden, um die Trennung zwischen Konstruktion und Verhalten zu erzwingen. Wenn Sie Ihren Programmierkollegen nicht vertrauen, new
dass sie sie nicht verwenden, wenn sie es nicht sollten, kann dies ansprechend sein.
Der Nachteil ist, dass es verlockend ist, die Details des DI-Tools in der gesamten Codebasis zu verteilen. Manchmal wird die Codebasis mit proprietären Anmerkungen infiziert. Die Beispiele, die sie liefern, unterstützen dies sicherlich. Das Tool tendiert dazu, in den Sprachraum zu wechseln, bis Sie den Job nicht nur als Java-Programmierjob, sondern als Java / Spring-Programmierjob bewerben können.
Design-Prinzipien
Ich habe lange Zeit Autoklassen programmiert, weil mir klar war, dass ich eine Autoklasse brauche, wenn ich eine Autologik programmiere. Aber mit DI ist es mir nicht so offensichtlich. Sie fragen sich immer noch, ob es für DI eine Redewendung ist, keine Autoklasse zu erstellen, wenn ich keine definierte Rolle dafür habe?
Ich denke, Sie lernen etwas über Abstraktion und ändern, wie Sie entscheiden, dass eine Klasse benötigt wird. Das ist gut. Aber hier geht es nicht um DI. DI hilft Ihnen nicht bei der Entscheidung, ob Sie eine Autoklasse benötigen. DI hilft Ihnen, das Auto davon abzuhalten, zu wissen und sich darum zu kümmern, ob es sich bei den Reifen um Goodyear-Reifen handelt. DI hilft Ihnen dabei, nicht zu wissen, ob die Autos in Japan hergestellt werden.
Eine der grundlegendsten Fragen im Software-Design lautet: "Was weiß über was?" Das ist die Hauptsache, die Ihnen ein UML-Diagramm zeigt. Wenn Sie etwas neu erfinden, erreichen Sie die Schnittstelle zu dem konkreten Element, an das Sie jetzt gebunden sind. Das Auto muss jetzt wissen, dass die Reifen Goodyear sind. Was irgendwie scheiße ist, wenn Michelin Sie sponsern möchte.
Um dies zu vermeiden, wird nach dem Prinzip der Abhängigkeitsinversion aufgerufen . Formal sollte ein High-Level-Modul (wie die Fahrzeugklasse) nicht direkt von Low-Level-Modulen (wie die GoodyearTire-Klasse) abhängen. Es sollte von einer Abstraktion abhängen (wie eine Reifenschnittstelle).
Eine Möglichkeit, dies zu vermeiden, wird als Umkehrung der Kontrolle bezeichnet . Hier liegt der Schwerpunkt auf der Änderung des Kontrollflusses. Bewegen die Reifen das Auto oder bewegt das Auto die Reifen? Wenn wir richtig darüber nachdenken, können wir das Auto und die Reifen nicht statisch miteinander verbinden. DI ist eine besondere Möglichkeit, der Inversion der Kontrolle zu folgen.
Nichts davon sagt Ihnen, ob Sie eine Autoklasse benötigen. Wenn Sie "Autologik" programmieren, ist es schön, wenn es einen Ort gibt, an dem Sie sie aufbewahren können, anstatt sie überall zu verteilen. Lassen Sie sich einfach nicht davon täuschen, dass die Logik des Fahrzeugbaus mit der Logik des Fahrzeugverhaltens identisch ist, sodass alles am selben Ort leben muss. Aber wenn Sie keine definierte Rolle für ein Auto haben, brauchen Sie auch keine. Fahren Sie Motorräder um die Strecke, wenn Sie möchten.
Ich meine, ist es in Ordnung, ein Lenkrad zum Fahren, BoltsAndNuts auf Rädern für die Boxencrew und alle möglichen anderen lustigen Schnittstellen zu haben, ohne eine Instanz zu haben, die ein Auto als Ganzes darstellt?
DI oder kein DI, es ist in Ordnung, eine Instanz zu haben, die ein Auto als Ganzes darstellt, aber diese Instanz möchte ich nicht direkt wissen, wenn ich nicht muss. Geben Sie mir eine Autoabstraktion, damit es mir egal ist, ob es mit Gas, Diesel oder Strom betrieben wird, wenn ich es benutze. Das ist nur etwas, das mich interessieren sollte, wenn ich es baue oder pflege. Es ist schön, wenn der Code, der das Auto verwendet, nicht wissen oder sich darum kümmern muss, wie es funktioniert. "Ich weiß es nicht. Ich will es nicht wissen."