Kernpunkte
Viele Programmierer (ich bin eingeschlossen, also ist das, was ich öffentlich mea Culpa ) denken, dass die Inversion der Kontrolle (IOC) nur ein Synonym für die Abhängigkeitsinjektion (DI) ist. Es gibt einen ziemlich intuitiven Grund für diese Idee: Wenn der Zweck von DI darin besteht eine IOC -Form. Während die Gleichung di = IOC im Allgemeinen gültig ist, ist das Konzept der Kontrolle der Inversion selbst tatsächlich viel breiter. Tatsächlich kann DI als ein spezifischer Anwendungsfall bezeichnet werden, der das IOC ausnutzt, aber es ist weit entfernt von der einzigen. Dies bringt uns zurück zum Ausgangspunkt; Traditionell sind Anwendungskomponenten so konzipiert, dass sie Ausführungsumgebungen betreiben und steuern, und dieser Ansatz funktioniert in gewissem Maße gut. Beispielsweise kann ein Protokollierungsmodul implementiert werden, um Daten in eine Datei aufzunehmen, und wie und wenn Daten aufgezeichnet werden, wird das Modul vollständig gesteuert. Eine Protokolldatei (in diesem Fall Teil der Umgebung) ist nur ein externes, passives Element, das sich nicht auf die Funktionsweise des Moduls auswirkt. Nehmen wir jedoch an, wir müssen die Funktionalität des Moduls erweitern und es aktivieren, um Daten zusätzlich in der Datenbank oder sogar per E -Mail zu protokollieren. Das Upgrade des Moduls zur Aufdeckung zusätzlicher Funktionalität erhöht seine Komplexität und wird zunehmend aufgebläht, da die Logik, die für die Behandlung dieser zusätzlichen Aufgaben erforderlich ist, hinter derselben API verpackt ist. Dieser Ansatz funktioniert, aber er kann überhaupt nicht erweitert werden. Diese Situation kann auf ziemlich einfache Weise gelöst werden. Anstatt das Modul voll für die Protokollierung von Daten an mehreren Endpunkten zu verantwortlich, können wir die Verantwortung direkt in die externe Umgebung verlagern. Die Implementierung des Moduls wird sehr einfach gehalten und darauf beschränkt, als einfacher Veranstaltungsplaner zu fungieren. Andererseits ist die Umgebung für die Implementierung der gesamten Logik verantwortlich, die zur Aufzeichnung von Daten zu einem Endpunkt, der völlig unabhängig vom fraglichen Modul ist, implementiert wird. Es ist nicht überraschend, dass der Prozess der Umkehrung dieser Verantwortlichkeiten zwischen Komponenten und Umgebungen offiziell als Kontrollinversion (oder in einfacheren Hinsicht Hollywood -Prinzipien) bezeichnet wird, und wenn skalierbare, hoch entkoppelte Programmmodule entwickelt werden, kann seine Implementierung eine echte Verbesserung sein.Natürlich ist IOC ein sprachunabhängiges Paradigma, sodass es in der PHP-Welt leicht verwendet werden kann.
Implementieren Sie die Steuerumkehrung - Bevorzugen Sie das Objekt des Feldes
ioc ist in der Tat überall, daher ist es leicht, seine Produktionsimplementierung zu finden. Der erste Anwendungsfall, der in den Sinn kommt, ist die Abhängigkeitsinjektion, aber es gibt viele andere ebenso repräsentative Anwendungsfälle, insbesondere im Bereich des ereignisgesteuerten Designs. Wenn Sie wissen möchten, in welchem Paralleluniversen IOC mit Event -Handhabungsmechanismen funktioniert, sollten Sie einen klassischen Fall in der GoF -Bibliothek: Observer -Muster in Betracht ziehen. Beobachter werden fast überall, selbst auf der Kundenseite durch JavaScript verwendet, und sie sind herausragende Beispiele für das IOC -Konzept. Für die Implementierung der Logik, die zum Umgang mit Ereignissen erforderlich ist, die vom Subjekt ausgelöst werden. Wie man mit Ereignissen oder sogar neuen Ereignissen umgeht, liegt völlig in der Verantwortung des Beobachters, nicht in der Verantwortung des Faches. Ein Beispiel könnte eine großartige Möglichkeit sein, meine vorherige langwierige Aussage klarer zu machen. Nehmen wir also an, wir haben ein primitives Domänenmodell implementiert, das eine Eins-zu-Viele-Beziehung zwischen Blog-Posts und Kommentaren definiert. In diesem Fall sind wir absichtlich ehrgeizig und ermöglichen es dem Modell, E -Mails zu senden, um den Systemadministrator zu benachrichtigen, wenn dem Beitrag neue Kommentare hinzugefügt werden. Ehrlich gesagt wäre es tatsächlich ein Chaos, eine solche Funktionalität zu implementieren, ohne auf IOC zurückzugreifen, da wir das Domain -Objekt bitten werden, etwas über seinen Geltungsbereich hinaus zu tun. Stattdessen können wir einen IOC-basierten Ansatz verfolgen und die folgende Domänenklasse definieren:
(Das Codebeispiel wird hier weggelassen, da dieser Teil des Inhalts nichts mit der von der Frage geforderten Pseudooriginalität zu tun hat und zu lang ist.)
Vertrauenskontrolle für die externe Umgebung - Kommentarbenachrichtigungsdienst erkennen
Erstellen eines Observer -Dienstes, der E -Mail -Benachrichtigungen beim Hinzufügen neuer Kommentare zu einem Blog -Beitrag auslöst, ist ein einfacher Prozess, der eine Klasse vereinfacht, die die relevante update()
-Methode implementiert. (Das Codebeispiel wird auch hier aus dem gleichen Grund wie oben weggelassen.)
Zusammenfassung
Kontrollinversion wird oft als dunkeles Konzept angesehen, insbesondere in PHP, bei dem viele Entwickler dazu neigen, sie mit gewöhnlicher Abhängigkeitsinjektion zu verbinden, aber es ist eine einfache und leistungsstarke Art zu programmieren. Ein entkoppeltes orthogonales System, dessen Komponenten leicht aus Tests isoliert werden können. Wenn Sie eine Abhängigkeitsinjektion in Ihrer Anwendung verwenden (Sie verwenden sie tatsächlich, oder?), Schten Sie dann aus, dass Ihr Programmierer -Instinkt gut zufrieden ist, da Sie bereits die Vorteile nutzen, die die Kontrolle der Kontrolle übernimmt. Wie ich bereits versucht habe, zu demonstrieren, gibt es viele Situationen, die zu diesem Ansatz passen, als die Klassenabhängigkeiten richtig zu verwalten. Ereignisorientiertes Design ist natürlich ein gutes Beispiel.
(Der FAQ -Teil wird hier weggelassen, der gleiche Grund wie oben.)
Das obige ist der detaillierte Inhalt vonPHP Master | Kontrollinversion - das Hollywood -Prinzip. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!