Ich stehe nun vor der Aufgabe, einen IoC-Container (Inversion of Control) in eine vorhandene Anwendung zu integrieren, und suche nach Empfehlungen, wie dies am einfachsten erreicht werden kann, um letztendlich die Kopplung zu reduzieren und dadurch die Testbarkeit zu verbessern. Obwohl ich im Allgemeinen nicht die meisten Klassen als klassifizieren Gott Objekte hat jeder zu viele Aufgaben und versteckte Abhängigkeiten durch Statik, Singletons, und es fehlt ihnen an Schnittstellen.
Hier einige Hintergrundinformationen zu den Herausforderungen, denen Sie sich stellen müssen:
- Abhängigkeitsinjektion wird selten verwendet
- Statische Methoden gibt es zuhauf - sowohl als Factory- als auch als Hilfsmethode
- Singletons sind ziemlich verbreitet
- Schnittstellen sind bei Verwendung nicht zu detailliert
- Objekte ziehen häufig nicht benötigte Abhängigkeiten über Basisklassen ein
Unsere Absicht ist es, dass wir beim nächsten Mal, wenn wir Änderungen in einem bestimmten Bereich vornehmen müssen, versuchen, Abhängigkeiten herauszufiltern, die tatsächlich existieren, aber hinter globalen Elementen wie Singletons und Statik verborgen sind.
Ich nehme an, das macht den IoC-Container sekundär zur Einführung der Abhängigkeitsinjektion, aber ich würde erwarten, dass es eine Reihe von Praktiken und Empfehlungen gibt, die befolgt oder in Betracht gezogen werden könnten, um diese Abhängigkeiten aufzubrechen.
quelle
Antworten:
Um so etwas durchzuziehen, müssen Sie in Schritten arbeiten, jede davon ist nicht trivial, aber sie können erreicht werden. Bevor Sie beginnen, müssen Sie verstehen, dass Sie diesen Prozess nicht beschleunigen können.
interface
für jedes von ihnen. Diese Schnittstelle sollte nur die Methoden definieren, mit denen andere Teile des Systems mit ihm kommunizieren. HINWEIS: Möglicherweise müssen Sie dabei mehr als einen Durchgang machen.init()
Methode abrufen / erstellen können .Wenn Sie fertig sind, sollten Sie nur statische Methoden in Ihrem System haben, die wirklich funktionieren - zum Beispiel die
Collections
Klasse oder dieMath
Klasse. Keine statische Methode sollte versuchen, direkt auf andere Komponenten zuzugreifen.Dies ist etwas, das viel Zeit in Anspruch nehmen wird. Planen Sie entsprechend. Stellen Sie sicher, dass Sie bei der Durchführung Ihres Refactorings in Ihrem Designansatz fester werden. Am Anfang wird es schmerzhaft sein. Sie ändern das Design Ihrer Anwendung drastisch iterativ.
quelle
Lernen Sie, effektiv mit Legacy Code zu arbeiten, und befolgen Sie seine Ratschläge. Beginnen Sie mit dem Erstellen von Inseln mit abgedecktem Code und gehen Sie schrittweise zu einer besser strukturierten Anwendung über. Der Versuch, die Änderung massenhaft vorzunehmen, ist ein Rezept für eine Katastrophe.
quelle
Der Hauptgrund für die Einführung von IoC ist die Entkopplung von Modulen. Das Problem insbesondere bei Java ist die außerordentlich starke Bindung, die der
new
Operator gibt. In Verbindung damit bedeutet dies, dass der aufrufende Code genau weiß, welches Modul er verwenden wird.Fabriken wurden eingeführt, um dieses Wissen an einen zentralen Ort zu bringen, aber am Ende verdrahten Sie die Module entweder immer noch mit
new
/ singleton, wodurch die Bindung erhalten bleibt, oder Sie lesen eine Konfigurationsdatei ein und verwenden Reflection / Class.forName, das beim Refactoring spröde ist .Wenn Sie das Ziel nicht modularisiert haben, gibt Ihnen IoC nichts.
Die Einführung von Unit-Tests wird dies höchstwahrscheinlich ändern, da Sie Module, die nicht getestet werden, verspotten müssen. Der einfachste Weg, dies sowie tatsächliche Produktionsmodule mit demselben Code zu handhaben, besteht darin, ein IoC-Framework zu verwenden, um das entsprechende zu injizieren Module.
quelle