Wenn Sie in Smalltalk nicht explizit etwas zurückgeben, wird die übermittelte Nachricht an den Empfänger (oder "self" im Nachrichtenkontext) ausgewertet.
Zum Beispiel bei dieser Methode:
%Vor%Auswerten (doint "print-it") dies:
%Vor%Wenn & lt; print-it & gt; bis zum letzten Aufruf ausgeführt wird, dann wäre das Ergebnis die Instanz selbst.
Ein sehr einfacher Grund wurde noch nicht angegeben: In der virtuellen Maschine ist die Rückgabe von Selbst einfacher und effizienter als die Rückgabe eines anderen Objekts.
Smalltalk-Bytecodes implementieren eine Stapelmaschine. Das bedeutet, dass Argumente übergeben werden, indem sie auf einen Stapel geschoben werden, anstatt sie in Register zu setzen. Zusätzlich zu den Argumenten, die in der Methodensignatur aufgelistet sind, wird immer ein verstecktes Argument übergeben, das der Empfänger der Nachricht ist. Also selbst für unäre Methoden (solche ohne Argumente) wird der Empfänger auf den Stapel geschoben, dann wird die Methode ausgeführt, und der Empfängerwert auf dem Stapel ist, wie die Methode "selbst" kennt. Durch die Rückgabe von "self", wenn keine explizite return-Anweisung gegeben wird, kann die VM den "self" -Oop auf dem Stack verlassen, was mindestens eine Speicheroperation spart. Aus Effizienz- und Einfachheitsgründen ist das Zurückkehren von "Selbst" das eleganteste, was man tun kann.
Smalltalk-80s Blue Book ( Die Sprache und ihre Implementierung ) sagt nichts über warum standardmäßig den Empfänger zurück.
Allerdings gibt es auf Seite 27 (Abschnitt "Rückgabewerte" ) ein Zitat, das Ihnen vielleicht helfen könnte:
"Auch wenn keine Informationen an den Absender zurückgemeldet werden müssen, gibt ein Empfänger immer einen Wert für den Nachrichtenausdruck zurück. Der Rückgabewert gibt an, dass die Antwort auf die Nachricht abgeschlossen ist. (... ) "
Denken Sie daran, dass Methoden in Smalltalk mit Hilfe von Nachrichtensenden aktiviert werden. Daher gibt es einen vollständigen Umlauf für eine Nachricht (die möglicherweise in einer MessageNotUnderstood-Ausnahme endet). Das Konzept des Sendens von Nachrichten ist von größter Bedeutung.
Es gibt einige gute Übungsmuster, die je nach der Absicht der Botschaft zurückkehren, aber das ist Thema einer anderen Geschichte.
Ich bin kein Schöpfer von Smalltalk, aber es scheint das Beste zu sein.
Zum Beispiel, wenn Sie Folgendes ausführen:
%Vor% Dann ist die Frage: Was willst du var
werden? Eine Option ist nil
. Aber es ist ein wenig verwirrend, weil Sie mit definierten Objekten arbeiten und nil
ist eigentlich ein undefinierter. Sie können es also behandeln, indem Sie myInstance
auf var
zuweisen und myMethod auf dem Weg aufrufen. Auch dies kann wahrscheinlich als Kurzschrift für
Wenn Sie von innen schauen, dann ist wahrscheinlich von allen Daten, die für das Objekt selbst verfügbar sind, auch self
am geeignetsten. Noch einmal, die nil
kann zurückgegeben werden, aber ich habe meine Meinung dazu schon einmal gesagt.
In Smalltalk gibt es keine void -Methode, die nichts zurückgibt, und es gibt keine Typprüfung. Eine Methode muss also nur etwas zurückgeben. Es ist wie das Objekt sagt:
Ich kann mich standardmäßig für jeden Methodenaufruf zurückgeben, weil ich immer kenne mich aus und du kannst dieses Verhalten neu definieren, wenn du willst ich etwas anderes zurückgeben.
Ich persönlich denke, dass die Rückgabe von nil
auch gut sein kann, und Objective-C Anwendungen verwenden nil
sachen sehr oft, aber Smalltalk ist auf diese Weise gemacht und ich denke, es ist eine ziemlich gute Lösung .
Methoden geben standardmäßig aus mehreren Gründen self zurück.
Lassen Sie mich # 4 ein bisschen mehr erklären. Ein gängiges Muster für die Objektinitialisierung ist die Definition einer neuen -Methode für die Klasse, die wie folgt aussieht:
%Vor%Dieses Muster hängt davon ab, ob das zurückkehrende Selbst initialisiert wird. Es ist jedoch nicht normal, am Ende einer Methode initialize ein ^ self hinzuzufügen. Es ist unnötig, weil die Methode sowieso selbst zurückgibt.
Am Ende ist das Zurückgeben von Selbst standardmäßig nur eine natürliche Wahl, da Sie etwas zurückgeben müssen.
Wenn Sie aus Java kommen, kennen Sie NullPointExceptions, wenn Sie mit undefinierten Rückgabewerten arbeiten. Außerdem muss Ihr Code hier und da eine bedingte Überprüfung auf null vornehmen.
Daher war ich froh, einen Rückgabewert für jeden Methodenaufruf oder jede Nachricht, die in Smalltalk gesendet wurden, zu finden. Wenn Sie sich dafür entscheiden, dass jede Methode einen Wert zurückgibt, werden Sie gefragt, was Ihr Standardwert sein könnte. Das Objekt selbst (self) ist ein sehr natürlicher Weg, um als Standardwert zu verwenden. Oder umgekehrt fragen: Was könnte ein besserer Gegenwert sein?
Tags und Links smalltalk pharo squeak visualworks oop