Viele der fleißigeren Softwareentwickler, die ich kenne, tendieren zur Inversion von Steuerung und Abhängigkeitsinjektion , um Verweise auf Objekte zu verarbeiten. Aus der Perspektive der Flash-Spiele kenne ich nicht alle Details der AAA-Studios. Werden diese also in der Spielewelt des Einzelhandels verwendet?
30
Antworten:
Sie nennen es "sorgfältige Softwareentwicklung", ich nenne es "schmerzhafte Überentwicklung". Das heißt nicht, dass die Umkehrung der Kontrolle schlecht ist - in der Tat, die grundlegende Definition ist gut -, aber die Verbreitung ganzer Rahmenbedingungen und Arbeitsmethoden, um all dies zu erreichen, ist ein wenig verrückt, insbesondere in Kombination mit der Art und Weise, wie die Menschen Mist bauen Perfekt gute und saubere Schnittstellen, um austauschbare Komponenten einbauen zu können, die Sie in 99% der Fälle niemals austauschen werden. Dies ist die Art von Dingen, die nur aus der Java-Unternehmensumgebung stammen können, und ich bin froh, dass sie anderswo nicht so gut Fuß fassen.
Oft wird argumentiert, dass Sie auch dann, wenn Sie keine Komponenten austauschen, diese isoliert mit Scheinobjekten und dergleichen testen möchten. Ich fürchte jedoch, ich werde niemals das Argument kaufen, dass es sich lohnt, ein Interface aufzublähen und zu komplizieren, um es besser testen zu können. Testen beweist nur eines - dass Ihre Tests funktionieren. Saubere und minimale Benutzeroberflächen beweisen, dass Ihr Code funktioniert.
Also die kurze Antwort: Ja, aber nicht so, wie Sie denken. Wenn Sie austauschbares Verhalten benötigen, übergeben Sie manchmal ein Objekt an einen Konstruktor, der einen Teil des Verhaltens des neuen Objekts festlegt. Das ist alles.
quelle
Strategiemuster , Zusammensetzung und Abhängigkeitsinjektion sind alle sehr eng miteinander verbunden.
Da das Strategiemuster eine Form der Abhängigkeitsinjektion ist, basieren Motoren wie beispielsweise Unity vollständig auf diesem Prinzip. Ihre Verwendung von Komponenten (Strategy Pattern) ist tief in ihre gesamte Engine eingebettet.
Neben der Wiederverwendung von Komponenten besteht einer der Hauptvorteile darin, die gefürchteten tiefen Klassenhierarchien zu vermeiden.
Hier ist ein Artikel von Mick West, der darüber spricht, wie er diese Art von System in die Tony Hawk- Reihe von Spielen von Neversoft eingeführt hat.
Entwickeln Sie Ihre Hierarchie
quelle
Es scheint viel Verwirrung über das Inversion-of-Control-Muster (IoC) zu geben. Einige Leute haben es mit dem Strategiemuster oder einem Komponentenmodell gleichgesetzt, aber dieser Vergleich erfasst nicht wirklich, worum es bei IoC geht. Bei IoC geht es wirklich darum, wie eine Abhängigkeit hergestellt wird. Lassen Sie mich Ihnen ein Beispiel geben:
Oben ist klar, dass
Sprite.Load
es eine Abhängigkeit von a gibtFileReader
. Wenn Sie die Methode testen möchten, benötigen Sie Folgendes:Die ersten beiden sind offensichtlich, aber wenn Sie sicherstellen möchten, dass Ihre Fehlerbehandlung wie erwartet funktioniert, brauchen Sie auch wirklich # 3. In beiden Fällen haben Sie Ihre Tests möglicherweise erheblich verlangsamt, da sie jetzt auf Festplatte gespeichert werden müssen, und Sie haben wahrscheinlich Ihre Testumgebung komplizierter gemacht.
Ziel von IoC ist es, den Gebrauch von Verhalten von seiner Konstruktion zu entkoppeln. Beachten Sie, wie sich dies vom Strategiemuster unterscheidet. Mit dem Strategiemuster soll ein wiederverwendbarer Teil des Verhaltens eingekapselt werden, damit Sie es in Zukunft problemlos erweitern können. Es gibt nichts darüber zu sagen, wie Strategien aufgebaut sind.
Wenn wir die
Sprite.Load
obige Methode umschreiben würden, hätten wir wahrscheinlich folgendes Ergebnis:Jetzt haben wir die Konstruktion des Lesegeräts von seiner Verwendung entkoppelt. Daher ist es möglich, während des Testens einen Testleser einzutauschen. Dies bedeutet, dass Ihre Testumgebung kein Dateisystem und keine Testdateien mehr benötigt und problemlos Fehlerereignisse simulieren kann.
Beachten Sie, dass ich beim Umschreiben zwei Dinge getan habe. Ich habe eine Schnittstelle erstellt, die ein
IReader
gewisses Verhalten abbildet - dh das Strategiemuster implementiert. Außerdem habe ich die Verantwortung für die Erstellung des richtigen Lesers in eine andere Klasse verlagert.Vielleicht brauchen wir keinen neuen Musternamen, um das oben Gesagte zu beschreiben. Es erscheint mir als eine Mischung aus Strategie- und Factory-Mustern (für IoC-Container). Abgesehen davon bin ich mir nicht sicher, aus welchen Gründen die Leute gegen dieses Muster Einwände erheben, da klar ist, dass es ein echtes Problem löst, und mir ist sicherlich nicht klar, was dies mit Java zu tun hat.
quelle
Ich würde sagen, dass es ein Werkzeug unter vielen ist und gelegentlich verwendet wird. Wie Tenpn bereits sagte, kann jede Methode, die vtables einführt (und im Allgemeinen jede zusätzliche Indirektion), einen Leistungsverlust nach sich ziehen. Dies ist jedoch etwas, worüber wir uns nur bei Code auf niedriger Ebene Gedanken machen sollten. Für allgemeinen Strukturcode ist dies kein wirkliches Problem, und IoC kann positive Vorteile haben. Alles, um Abhängigkeiten zwischen Klassen zu verringern und Ihren Code flexibler zu gestalten.
quelle
Ich muss Kylotan in dieser Frage zustimmen. "Dependency Injection" ist eine hässliche Java-Lösung für einen hässlichen Java-konzeptuellen Fehler, und der einzige Grund, warum sich jemand damit in anderen Sprachen befasst, ist, dass Java für viele Menschen eine Muttersprache wird, obwohl dies eigentlich nicht der Fall sein sollte.
Andererseits ist die Umkehrung der Kontrolle eine nützliche Idee, die es schon seit langer Zeit gibt und die sehr hilfreich ist, wenn sie richtig gemacht wird. (Nicht die Java / Dependency Injection-Methode.) In der Tat tun Sie dies wahrscheinlich die ganze Zeit, wenn Sie in einer vernünftigen Programmiersprache arbeiten. Als ich zum ersten Mal über dieses ganze "IOC" -Ding las, über das alle schwärmten, war ich völlig unterfordert. Inversion of Control ist nichts anderes als die Übergabe eines Funktionszeigers (oder Methodenzeigers) an eine Routine oder ein Objekt, um deren Verhalten anzupassen.
Diese Idee gibt es schon seit den 1950er Jahren. Es ist in der C - Standardbibliothek (qsort den Sinn kommt) , und es ist ganz über dem Platz in Delphi und .NET (Event - Handler / Teilnehmer). Es ermöglicht alten Code, neuen Code aufzurufen, ohne den alten Code neu kompilieren zu müssen, und wird in Game-Engines ständig verwendet.
quelle
Nach meiner Erfahrung nicht. Was schade ist, da Spiele-Code sehr anpassungsfähig sein muss und diese Ansätze definitiv helfen würden.
Es muss jedoch gesagt werden, dass beide Methoden in C ++ virtuelle Tabellen einführen können, bei denen es zuvor keine gab, was einen entsprechenden Leistungseinbruch mit sich bringt.
quelle
Ich bin kein professioneller Spieleentwickler und habe nur einmal versucht, IoC in C ++ zu implementieren. Das ist also nur Spekulation.
Ich vermute jedoch, dass Spieleentwickler gegenüber IoC misstrauisch sind, da dies Folgendes bedeutet:
1 / viele Schnittstellen und viele kleine Klassen entwerfen
2 / Fast jeder Funktionsaufruf ist in letzter Zeit gebunden
Nun mag es ein Zufall sein, aber beide neigen dazu, etwas komplizierter und / oder problematischer für die Leistung in C ++ (was im Spiel weit verbreitet ist, nicht wahr?) Zu sein als in Java, wo IoC weit verbreitet wurde (wahrscheinlich) weil es relativ einfach war, Menschen zu helfen, vernünftigere Objekthierarchien zu entwerfen, und weil einige glaubten, es könne das Schreiben einer Anwendung in Java in das Schreiben einer Anwendung in XML umwandeln, aber das ist eine andere Debatte: P)
Ich bin an den Kommentaren interessiert, wenn das überhaupt keinen Sinn ergibt;)
quelle