Warum geben Methoden in Smalltalk standardmäßig "self" zurück?

8

Hintergrund

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.

Fragen

  • Warum wurde das so gestaltet?
  • Was ist die Idee dahinter?
  • Was war der philosophische Hintergrund?
  • Was sind die praktischen Vorteile davon? Ist es die Verkettung von Methoden zu erleichtern?
Sebastian N. 27.12.2012, 00:15
quelle

5 Antworten

10

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.

    
Bert Freudenberg 30.12.2012, 15:40
quelle
6

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.

    
emaringolo 27.12.2012 02:11
quelle
5

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

behandelt werden %Vor%

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 .

    
Uko 27.12.2012 00:55
quelle
3

Methoden geben standardmäßig aus mehreren Gründen self zurück.

  1. Smalltalk-Methoden müssen etwas zurückgeben
  2. self ist das einfachste zurückzugebende Objekt
  3. self ist das schnellste zurückzugebende Objekt
  4. Returning self lässt mehrere Entwurfsmuster natürlich funktionieren

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.

    
David Buck 05.01.2013 01:45
quelle
0

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?

    
pintman 27.12.2012 15:12
quelle