Zusammenarbeit von Objekten


#1
Hallo zusammen,

in meinem Lehrbuch zum objektorientierten Programmieren mit Java steht folgendes:

"Die Zusammenarbeit von Objekten läuft mit Hilfe von Nachrichten ab. Ein Objekt kann eine Nachricht an ein anderes Objekt oder gelegentlich auch sich selbst verschicken. Eine solche Nachricht enthält die Information, welche Methode ausgeführt werden soll, und wenn nötig noch weitere Informationen, die das empfangende Objekt benötigt, um die Nachricht zu verarbeiten. Das versendende Objekt wartet in der sequenziellen Programmierung so lange, bis das empfangende Objekt eine Antwort sendet, und setzt erst dann seine Arbeit fort."

Dazu hätte ich ein Paar Fragen und zwar:

1) Wie verschickt ein Objekt eine Nachricht an sich selbst oder an ein anderes Objekt?

2) Wie könnte so eine Nachricht und die weiteren Informationen aussehen?

3) In welcher Form sendet das empfangende Objekt eine Antwort zurück?

Wäre super, wenn mir das jemand anhand von einfachen Code-Beispielen erklären könnte.

Vielen Dank im Voraus!
 

ComFreek

Mod | @comfreek
Moderator
#2
Steht der Textabsatz ggf. in einem gewissen Kontext unter einer Überschrift im Buch oder sollte er allgemein für OOP gelten?
Denn OOP ist im Allgemeinen keinesfalls so! Außer der Autor meint "Nachricht" in einem sehr abstrahierten Sinn, worunter auch normale Methodenaufrufe zählen. Ich bin mir nicht sicher, ob diese Sichtweise, gerade als Anfänger, viel Sinn ergibt.

Das Problem ist nämlich, dass bei einem Methodenaufruf in den meisten Programmiersprachen gar keine Nachrichten verschickt werden und auch kein Objekt aktiv auf die Antwort wartet. Letztendlich werden viele Programmiersprachen auf die eine oder andere Art Assembler/Bytecode abgebildet. Dort sind Methodenaufrufe nichts anderes als

  1. Ablegen der Methodenargumente auf den Stack/in Register
  2. Sprung zur Methode
  3. Die Methode wird abgearbeitet (insbesondere: Kein aktives warten der ursprünglichen Methode! Das kann auch gar nicht der Fall sein, weil die Kontrolle durch den Sprung komplett abgegeben wurde.)
  4. Die aufgerufene Methode schreibt ihr Ergebnis an eine bekannte Stelle, etwa in ein Register.
  5. Die aufgerufene Methode führt eine "return"-Anweisung aus und damit wird implizit zum Aufrufer zurückgesprungen.
  6. Die ursprüngliche Methode wird nun wieder abgearbeitet, wobei das Ergebnis der aufgerufenen Methode ausgelesen werden kann.
Du siehst, dass zumindest auf der untersten Schicht des Assemblers keinerlei Nachrichten ausgetauscht werden. Aber auch in den höheren Schichten ist m. E. die Nachrichtenanalogie fehl am Platz, da eben nicht aktiv gewartet wird.

Falls der Textabsatz tatsächlich Nachrichten im engeren (normalen) Sinne gemeint hat:

Die Beschreibung sieht mir eher nach etwas aus, was unter "Message Passing", vielleicht auch "Remote Procedure Call" (wobei "Remote" im selben Prozess hier meint) läuft.

1) Wie verschickt ein Objekt eine Nachricht an sich selbst oder an ein anderes Objekt?
Für die Abwicklung der Nachrichten braucht man natürlich Hilfsfunktionen oder gar ein ganzes Framework.

2) Wie könnte so eine Nachricht und die weiteren Informationen aussehen?
Ganz konkret z. B. JSON:
JSON:
{
  "method_to_call": "my_blub",
  "arguments_to_method": [
    "firstStringArgument",
    123
   ]
}
3) In welcher Form sendet das empfangende Objekt eine Antwort zurück?
Dazu bräuchtest du wieder eine Hilfsfunktion. Die Antwort könnte etwa so aussehen:
JSON:
{
  "success": true,
  "return_value": 42
}