Der Begriff "Objektorientierung" wurde von Dr. Alan Kay geprägt, daher ist er die maßgebliche Quelle für das, was er bedeutet, und er definiert ihn folgendermaßen :
OOP bedeutet für mich nur Messaging, lokale Aufbewahrung und Schutz sowie das Verstecken von Staatsprozessen und die extreme Spätbindung aller Dinge.
Lassen Sie uns das aufschlüsseln:
- Messaging ("Versand virtueller Methoden", wenn Sie mit Smalltalk nicht vertraut sind)
- Zustandsprozess sollte sein
- lokal beibehalten
- geschützt
- versteckt
- extreme Spätbindung aller Dinge
In Bezug auf die Implementierung ist Messaging ein spät gebundener Prozeduraufruf. Wenn Prozeduraufrufe spät gebunden sind, können Sie zur Entwurfszeit nicht wissen, was Sie aufrufen werden, sodass Sie keine Annahmen über die konkrete Darstellung des Status treffen können. Es geht also wirklich um Messaging. Spätes Binden ist eine Implementierung von Messaging, und die Kapselung ist eine Folge davon.
Später stellte er klar, dass " die große Idee" Messaging "ist " und bedauert, sie "objektorientiert" statt "nachrichtenorientiert" genannt zu haben, weil der Begriff "objektorientiert" den Fokus auf das Unwichtige (Objekte) legt ) und lenkt von dem ab, was wirklich wichtig ist (Messaging):
Nur eine sanfte Erinnerung daran, dass ich mir bei der letzten OOPSLA einige Mühe gegeben habe, um alle daran zu erinnern, dass Smalltalk nicht nur NICHT seine Syntax oder die Klassenbibliothek ist, es geht nicht einmal um Klassen. Es tut mir leid, dass ich vor langer Zeit den Begriff "Objekte" für dieses Thema geprägt habe, weil es viele Leute dazu bringt, sich auf die geringere Idee zu konzentrieren.
Die große Idee ist "Messaging" - darum geht es beim Kernal von Smalltalk / Squeak (und es ist etwas, das in unserer Xerox PARC-Phase nie ganz abgeschlossen wurde). Die Japaner haben ein kleines Wort - ma - für "das, was dazwischen liegt" - vielleicht ist das nächste englische Äquivalent "interstitial". Der Schlüssel zur Entwicklung großartiger und erweiterbarer Systeme liegt viel mehr darin, die Kommunikation der Module zu bestimmen, als in ihren internen Eigenschaften und Verhaltensweisen. Denken Sie an das Internet - um zu leben, muss es (a) viele verschiedene Arten von Ideen und Realisierungen zulassen, die über einen einzelnen Standard hinausgehen, und (b) unterschiedliche Grade sicherer Interoperabilität zwischen diesen Ideen ermöglichen.
(Natürlich konzentrieren sich die meisten Menschen heute nicht einmal auf Objekte, sondern auf Klassen, was noch falscher ist.)
Messaging ist für OO sowohl als Metapher als auch als Mechanismus von grundlegender Bedeutung .
Wenn Sie jemandem eine Nachricht senden, wissen Sie nicht, was er damit macht. Das einzige, was Sie beobachten können, ist ihre Reaktion. Sie wissen nicht, ob sie die Nachricht selbst verarbeitet haben (dh ob das Objekt über eine Methode verfügt), ob sie die Nachricht an eine andere Person weitergeleitet haben (Delegierung / Proxy), ob sie sie überhaupt verstanden haben. Darum geht es bei der Kapselung, darum geht es bei OO. Sie können einen Proxy nicht einmal von der Realität unterscheiden, solange er so reagiert, wie Sie es erwarten.
Ein "modernerer" Begriff für "Messaging" ist "dynamischer Methodenversand" oder "virtueller Methodenaufruf", aber das verliert die Metapher und konzentriert sich auf den Mechanismus.
Es gibt also zwei Möglichkeiten, die Definition von Alan Kay zu betrachten: Wenn Sie sie für sich allein betrachten, können Sie feststellen, dass Messaging im Grunde genommen ein spät gebundener Prozeduraufruf ist und eine späte Bindung eine Kapselung impliziert, sodass wir daraus schließen können, dass # 1 und # 2 sind tatsächlich redundant, und bei OO dreht sich alles um spätes Binden.
Später stellte er jedoch klar, dass das Wichtigste das Versenden von Nachrichten ist, sodass wir es aus einem anderen Blickwinkel betrachten können: Das Versenden von Nachrichten ist spät. Nun, wenn Messaging das ist nur etwas möglich, dann würde # 3 triviale Weise wahr sein: wenn es nur eine Sache, und das Ding ist spät gebunden, dann alle die Dinge spät gebunden. Und wieder folgt die Kapselung aus dem Messaging.
Ähnliche Punkte werden auch in On Understanding Data Abstraction, überarbeitet von William R. Cook, und in seinem Vorschlag für vereinfachte, moderne Definitionen von "Objekt" und "Objektorientiert" gemacht .
Der dynamische Versand von Operationen ist das wesentliche Merkmal von Objekten. Dies bedeutet, dass die aufzurufende Operation eine dynamische Eigenschaft des Objekts selbst ist. Operationen können nicht statisch identifiziert werden, und es gibt im Allgemeinen keine Möglichkeit, genau zu bestimmen, welche Operation als Antwort auf eine bestimmte Anforderung ausgeführt wird, außer durch Ausführen. Dies ist genau das gleiche wie bei erstklassigen Funktionen, die immer dynamisch versendet werden.
In Smalltalk-72 gab es nicht einmal Objekte! Es gab nur Nachrichtenströme, die analysiert, umgeschrieben und umgeleitet wurden. Zuerst kamen Methoden (Standardmethoden zum Parsen und Umleiten der Nachrichtenströme), später Objekte (Gruppierungen von Methoden, die einen privaten Status gemeinsam haben). Die Vererbung erfolgte viel später, und Klassen wurden nur eingeführt, um die Vererbung zu unterstützen. Hätte Kays Forschungsgruppe bereits über Prototypen gewusst, hätten sie wahrscheinlich nie Klassen eingeführt.
Benjamin Pierce in Typen und Programmiersprachen argumentiert, dass das definierende Merkmal der Objektorientierung die offene Rekursion ist .
Also: Laut Alan Kay dreht sich bei OO alles um Messaging. Laut William Cook dreht sich bei OO alles um den dynamischen Versand von Methoden (was wirklich dasselbe ist). Laut Benjamin Pierce dreht sich bei OO alles um Open Recursion, was im Grunde bedeutet, dass Selbstreferenzen dynamisch aufgelöst werden (oder zumindest darüber nachdenken) oder mit anderen Worten, Messaging.
Wie Sie sehen können, hat die Person, die den Begriff "OO" geprägt hat, eine eher metaphysische Sicht auf Objekte, Cook eine eher pragmatische Sicht und Pierce eine sehr strenge mathematische Sicht. Aber das Wichtigste ist: Der Philosoph, der Pragmatiker und der Theoretiker sind sich einig! Messaging ist die einzige Säule von OO. Zeitraum.
Beachten Sie, dass hier keine Vererbung erwähnt wird! Vererbung ist für OO nicht wesentlich. Im Allgemeinen haben die meisten OO-Sprachen eine Möglichkeit zur Wiederverwendung der Implementierung, dies muss jedoch nicht unbedingt eine Vererbung sein. Es könnte zum Beispiel auch eine Form der Delegation sein. Tatsächlich wird im Vertrag von Orlando die Delegation als Alternative zur Vererbung erörtert und wie unterschiedliche Formen der Delegation und Vererbung zu unterschiedlichen Entwurfspunkten innerhalb des Entwurfsraums objektorientierter Sprachen führen. (Beachten Sie, dass selbst in Sprachen, die die Vererbung unterstützen, wie Java, tatsächlich gelernt wird, dies zu vermeiden, was wiederum darauf hinweist, dass dies für OO nicht erforderlich ist.)