Objektorientierung als Nachrichten verklärt

Viele der heute gängigen Programmiersprachen folgen dem objektorientierten Paradigma. In Anleitungen wurde das früher häufiger als »Nachrichten senden« erklärt, und mich hat das mehr verwirrt als es geholfen hätte.

Also nehmen wir ein einfaches Beispiel in Python:

class MyClass:
    def my_method(self):
        ...

def main():
    my_instance = MyClass()
    my_instance.my_method()

Wir haben eine Klasse MyClass mit der Methode my_method. In der Funktion main erzeugen wir eine Instanz dieser Klasse und rufen die Methode auf. In diesen Tutorials wird es aber anders beschrieben: Die Funktion main sendet an das Objekt my_instance die Nachricht my_method. Bei »Senden« denke ich an Netzwerkverbindungen.

Mein Verständnis von Objektorientierung geht eher über die Implementierung dieses Sprachkonstruktes. In C++ könnte man zum Beispiel diesen C-artigen hier haben:

struct Point {
    double x;
    double y;
}

double norm(Point const &point) {
    return std::sqrt(x*x + y*y);
}

Das nutze ich dann so:

Point p;
norm(p);

Ich kann es aber auch objektorientiert schreiben:

class Point {
  public:
    double norm(Point const &point) {
        return std::sqrt(x*x + y*y);
    }

  private:
    double x;
    double y;
}

Das sieht in der Nutzung ähnlich aus:

Point p;
p.norm();

Von der Implementierung her ist das am Ende aber das selbe. Es gibt ein Struct mit den beiden Werten. In der zweiten Variante bekommt die Methode norm dann implizit noch Point *this übergeben.

In Python könnte man das so simulieren, wie es am Ende auch implementiert ist, indem wir das self selbst übergeben:

def my_method(self):
    ...

my_instance = {}
my_method(my_instance)

In R ist das S3-Klassensystem nur ein bisschen Magie um genau das, man definiert Datenobjekte und kann dann über spezielle Syntax da Methoden aufrufen.

Ich finde die Erklärung und Vorstellung über die Implementierung deutlich eingängiger als über das Konstrukt von »Nachrichten«, die da verschickt werden. Vielleicht ist das eine gute Erklärung wenn man die Implementierung nicht vor Augen hat, für mich war es das aber nicht.