Ich sehe viele IoC-Frameworks für .Net und Java. Weiß jemand, warum es für Smalltalk keine gleichwertigen Frameworks gibt? Dies ist mehr eine philosophische Frage als alles andere. Ich frage mich, ob es etwas in der Smalltalk-Art gibt, Dinge zu tun, die die Notwendigkeit eines IoC-Frameworks ausschließt.
MVC wurde auf Smalltalk erfunden und ist wohl das Original Inversion der Kontrolle Framework. Obwohl es etwas leichter ist als seine Java-Gegenstücke, hat es die grundlegenden Konzepte eines Modells, das die Daten enthält, eine Ansicht, die die Daten als Antwort auf Ereignisse darstellt, die von einem Controller propagiert werden.
Weniger flink, Java benötigt tatsächlich eine Menge Framework-Unterstützung, um eine Web-Anwendung ohne übermäßige Mengen von Boilerplate-Code zu machen. Smalltalk unterstützt Programmier-Idiome wie Fortsetzungen , die es einem Autor ermöglichen, so zu tun, als würden sie nicht wirklich ereignisgesteuerten Code schreiben. Seaside funktioniert so und gibt den Vorteilen von IoC ein etwas flexibleres Entwicklungsparadigma.
EDIT: MVC ist ein Framework für UI's in Smalltalk (es ist wohl nicht wirklich ein Framework als solches, aber die Klassenbibliothek hat es eingebaut). Es hat die Umkehrung der Steuereigenschaft dahingehend, dass die Ansicht und das Modell auf Ereignisse reagieren, die vom Controller ausgelöst werden - die rufen Sie uns nicht an, wir nennen Sie Eigenschaft. Inversion of Control ist ein Entwurfsmuster innerhalb von Frameworks, das dazu verwendet wird, den Bedarf an umfangreichen Standardanwendungen in Java-Anwendungen zu reduzieren. In einigen Definitionen eines Anwendungsframeworks ist Inversion of Control die Haupteigenschaft, die als ein Framework von einer Bibliothek unterschieden wird.
Ich denke, dass IOC oder das Dependency Injection-Muster ein Problem löst, das in der Smalltalk-Umgebung nicht wirklich existiert. Smalltalk ist eine nicht typisierte dynamische Sprache und verwendet die Nachrichtenübermittlung zur Kommunikation. Dies macht Objekte, die von der Natur auf der Sprachebene lose gekoppelt sind. Jedes Objekt kann unabhängig vom Typ eine Nachricht an ein anderes Objekt senden, solange es die Nachricht verarbeiten kann. Wie Sie sich vorstellen können, ist das Ändern von Abhängigkeiten zu einem bestimmten Zeitpunkt relativ einfach und natürlich. Sie müssen nur entscheiden, wo, wann und wie Sie die Abhängigkeit ändern möchten.
Einige mögliche Gründe dafür. Einer ist, dass wir uns nicht die Mühe gemacht haben, den "IoC" -Kennzeichner zu verwenden, der im Wesentlichen redundant ist - da das Angeben von etwas als Rahmenwerk die Umkehrung des Kontrollflusses impliziert.
Ein anderer ist, dass die Smalltalk-Sprache direkte Unterstützung für "IoC" -Flüsse bietet - in Form von Schließungen. Ein Ergebnis der Programmierung mit Closures ist, dass der Kontrollfluss, wie er in Frameworks gefunden wird, nicht so stark anders aussieht, als dass er das Gefühl erzeugt, von einem "normalen" Flusssinn "umgekehrt" zu sein; Bei Schließungen dreht sich der Kontrollfluss immer und immer wieder zwischen diesen beiden Perspektiven hin und her. Sogar innerhalb einzelner Anweisungen.
Ein dritter Grund ist möglicherweise, dass die beschriebene "Inversion der Kontrolle" auch ohne Closures nicht eindeutig mit Frameworks verknüpft ist - dieselben Flüsse finden sich in den meisten Codeformen, die I / O betreffen.
>Viertens verwenden Smalltalkers diese Arten von Flüssen wahrscheinlich noch mehr als andere, da wir uns stärker auf die Begriffe von Objekten und die zwischen ihnen gesendeten Nachrichten stützen als auf die Begriffe von Strukturen und den Aufruf von Elementfunktionen. In der Abwesenheit von Verschlüssen sind diese beiden Ansichten äquivalent und austauschbar, aber das Hinzufügen von Verschlüssen ändert das Ergebnis - der Sinn des Kontrollflusses ist einer der Effekte.
Schließlich könnte man sogar daran denken, den REPL-Stil des Kontrollflusses als einen "einfacheren", aber "invertierten" Sinn des "normalen" Flusses zu beschreiben, normal in dem Sinne, dass er fast überall sonst verwendet wird.
>Zusammenfassend gibt es die gleichen Arten von Frameworks für Smalltalk. Wir beschreiben sie ein bisschen anders ist alles. Der Unterschied ist zumindest teilweise auf die Anwesenheit und Nutzung zurückzuführen von Verschlüssen in Smalltalk, die viele andere Umgebungen noch nicht bieten - - insbesondere C ++, C # und Java.
In Java wird beim Schreiben eine Abhängigkeit erzeugt etwas wie
MyClass32 temp = this.theThing ();
Nun wird Ihr Code auf der Klasse MyClass32 DEPENDIERT herum sein. Dein Code wird nicht funktionieren ohne es. Jede Änderung in dieser Klasse kann Machen Sie Ihren Code unkompilierbar und benötigen Sie einen viele zusätzliche Änderungen in Ihrem Code, der kann weitere Codeänderungen in der Klasse erfordern Das hängt von dir ab. Viel zusätzliche Arbeit.
In Smalltalk würden Sie schreiben temp: = selbst thething;
Ihr Code funktioniert, egal was zurückgegeben wird von #getTheThing. Dein Code ist nicht abhängig auf der Klasse MyClass32 herum. Dein einziger Abhängigkeit ist, dass "Temp" alles verstehen muss Nachrichten, die Sie an es senden.
Also in gewissem Sinne der Zweck der Dependency Injection Frameworks soll eine statisch typisierte Sprache erstellen Wie Java funktioniert mehr wie eine dynamisch typisierte.
Das heißt, es gibt ein Design-Muster, das ich oft habe in Smalltalk folgt: Erstellen Sie eine Klassenmethode wie Meine Klasse, die eine Klasse zurückgibt. Es muss nicht haben der NAME "MyCLass". Es könnte einer von mehreren sein Klassen, die eine andere Klasse in der Nacht zurückgeben. Dieses Muster ist im Smalltalk MVC vorhanden, wo View-Klassen die Methode #defaultControllerClass haben, was normalerweise von Unterklassen neu definiert wird.
Tags und Links smalltalk inversion-of-control