Was ist objektorientierte Programmierung?
Alan Kay prägte den Begriff „objektorientierte Programmierung “ 1967 [0], um die von ihm mitentwickelte Art der Programmierung mit Objekten zu beschreiben. Frei nach Alan Kay hat der Begriff folgende Bedeutung.
Ein Objekt ist ein gedachter Baustein, der Zustände und Prozeduren enthält und auf den von außen nur durch Zusendung von Nachrichten zugegriffen werden kann. Das Objekt entscheidet, wie es (im Rahmen seiner Spezifikation) auf eine bestimmte Nachricht reagiert. (Laufzeitmodell)
Bei der objektorientierten Programmierung beschreiben Programme, unter welchen Bedingungen zur Laufzeit welche Nachrichten an Objektausdrücke gesendet werden: Hierzu gibt es eine Versendungsbestimmung, die den Empfängerobjektausdruck und die zu versendende Nachricht festlegt. Diese Versendungsbestimmung kann auch insgesamt als ein Ausdruck gelten, dessen Wert dann vom Empfängerobjekt (als eine Art von Antwort) festgelegt wird. (Quelltextmodell)
Es muß möglich sein, daß erst spätestmöglich (also zur Laufzeit während der Auswertung der Versendungsbestimmung) festgelegt wird, welches Objekt eine bestimmte Nachricht erhält (späte Bindung): Hierzu kann das Empfängerobjekt in der Versendungsbestimmung selber wieder durch einen Ausdruck angegeben werden, der erst spätestmöglich zur Laufzeit ausgewertet wird (Laufzeit-Polymorphie).
(Freie Interpretation der Quellen [0] und [1])
Objektorientierte Programmiersprachen
Eine objektorientierte Programmiersprache ist eine Programmiersprache, die Sprachmittel bereitstellt, um objektorientierte Programmierung direkt und auf einfache Weise zu ermöglichen. Dabei muß der Programmierer die objektorientierten Formulierungsmöglichkeiten nicht erst umständlich selber bereitstellen (wie bei objektorientierter Programmierung in C oder Maschinensprache) oder unnötig kompliziert formulieren (wie bei inneren Klassen als Ersatz für Block-Objekte in Java 1.1 bis Java 1.6 ). Literale, Blöcke und Ausdrücke stehen direkt für Objekte. Nachrichten können durch eine einfache Formulierung versendet werden.
Eine objektorientierte Programmiersprache kann aber auch Sprachmittel enthalten, mit denen nicht-objektorientiert formuliert werden kann. Sie erlaubt es aber, alles, das sinnvollerweise durch Versendung von Nachrichten formuliert werden kann, auch so zu formulieren. In diesem Sinne ist Common Lisp eine objektorientierte Programmiersprache.
Eine rein objektorientierte Programmiersprache ist eine objektorientierte Programmiersprache, in der alles, was irgendwie durch Versendung von Nachrichten sinnvollerweise formuliert werden kann, auch so formuliert werden muß, weil die Sprache keine anderen Möglichkeiten bereitstellt. In diesem Sinne ist Smalltalk eine rein objektorientierte Programmiersprache.
Ein Programm in einer rein objektorientierten Programmiersprache enthält neben Deklarationen (Namensvereinbarungen) nur Versendungen von Nachrichten an Objekte, die entweder durch Literale oder durch Versendungsergebnisse angegeben werden.
Eine partiell-objektorientierte Programmiersprache ist eine Programmiersprache, welche Sprachmittel bereitstellt, um objektorientierte Programmierung in bestimmten Fällen zu ermöglichen, aber auch Teile enthält, in denen nicht objektorientiert formuliert werden kann. Die meisten unter dem Etikett „objektorientiert“ vermarkteten Programmiersprachen sind partiell-objektorientierte Programmiersprachen in diesem Sinne.
Weitere Aspekte
Gerätesteuerung
Ein Objekt kann auch so mit einem Gerät gekoppelt sein kann, daß durch Nachrichten an dieses Objekt Informationen von einem Gerät gelesen oder auf es geschrieben werden können.
Invarianten
Ein Objekt hat im allgemeinen Invarianten, also Aussagen über den Zustand seiner Teile, die stets wahr sein sollen. Das Objekt wird seine Invarianten schützen, indem es dafür sorgt, daß diese stets wahr sind (oder wenigstens am Ende jeder Operation). Daher wird es anderen Objekten nicht erlauben, durch eine Nachricht direkt an seinen Teilen zu wirken, sondern die empfangenen Nachrichten vorher prüfen und es ablehnen Anforderungen nachzukommen, wenn dies die Invarianten stören würde.
Sogenannte „objektorientierte“ Programmiersprachen
Objektorientierte Programmierung im ursprünglichen Sinne ist nach Kay ist (2003) nur in der Programmiersprache Smalltalk und in der Programmiersprache Common Lisp möglich. Andere, oft als „objektorientiert“ bezeichnete Programmiersprachen, wie die Programmiersprache Java oder die Programmiersprache C++, sind keine objektorientierten Programmiersprachen im Sinne Alan Kay s, der schrieb:
„Objektorientierte Programmierung ist in Smalltalk und in Lisp möglich. Es gibt vielleicht andere Systeme, mit denen sie möglich ist, aber ich bin mir ihrer nicht bewußt.“
Alan Kay, 2003, frei übersetzt nach [0]
Klassen oder Vererbung werden von Alan Kay in seiner Definition[0] der objektorientierten Programmierung nicht erwähnt (aber auch nicht ausgeschlossen). Der Begriff „Polymorphie“ entspricht weitgehend der oben erwähnten späten Bindung.
Popularität des Begriffs
Der Begriff „objektorientierte Programmierung“ war in den 90er Jahren auch ein Marketing-Begriff, unter dem Seminare, Lehrbücher oder Werkzeuge angepriesen werden, um darzustellen, daß diese auf dem Stand der Zeit seien, was immer die Qualitäten dieser Angebote nun im einzelnen sein mögen.
Inzwischen ist der Begriff und das Bekenntnis zur objektorientierten Programmierung so verbreitet, daß die Bezeichnung einer Vorgehensweise als „objektorientiert“ heute die Hauptströmung darstellt und daher weniger unterscheidungskräftig ist.
Der Begriff „objektorientierte Programmierung“ ist nicht geschützt, es gibt keine von allen akzeptierte Definition und so gibt es auch einen Wildwuchs verschiedener, mehr oder weniger präziser, Definitionen.
Wer mögliche Mißverständnisse in Zusammenhang mit dem Begriff „objektorientierte Programmierung“ vermeiden möchte, verwendet vielleicht besser einzelne Fachbegriffe, wie „späte Bindung“ oder „Kapselung“.
Bedeutung nach ISO
Auch von der Internationalen Organisation für Normierung (ISO ) gibt es eine Definition des Begriffs, die schon deutlich von der zuvor genannten abweicht:
object-oriented
Pertaining to a technique or a programming language that supports objects, classes, and inheritance.
ISO/IEC 2382-15 (1998), [3]
(objektorientiert
Eine Technik oder Programmiersprache betreffend, die Objekte, Klassen und Vererbung unterstützt.)
Demnach ist objektorientierte Programmierung also Programmierung mit Objekten, Klassen und Vererbung. Eine objektorientierte Programmiersprache ist eine Programmiersprache, die Objekte, Klassen und Vererbung unterstützt. Ein Objekt ist nach der ISO eine Menge von Operationen und Daten. Kapselung, Nachrichten oder späte Bindung werden von der ISO also nicht verlangt. Allerdings gibt es eine Anmerkung in ISO/IEC 2382-15 (1998), die erwähnt, daß „einige Autoritäten“ Informationsschutz, Kapselung, Datenabstraktion, Nachrichtenvermittlung, Polymorphie, dynamische Bindung oder Vererbung verlangen.
Bewertung der ISO-Definitionen
Die Wichtigkeit der Vererbung wird in vielen Lehrtexten überbetont, während heute Vererbung in Fachkreisen oft kritisiert wird. Es gibt bekanntermaßen objektorientierte Programmiersprachen ohne Klassen (Prototyp-Sprachen wie JavaScript). Die ISO-Definition, die gerade Klassen und Vererbung voraussetzt, wirkt deswegen fast laienhaft und gibt eher den heutigen Sprachgebrauch in der Werbung als die klassische Bedeutung des Begriffs wieder.
Für viele Experten ist hingegen späte Bindung (Laufzeit-Polymorphie) der Kern der objektorientierten Programmierung. Damit ist eine fachlich akzeptable Definition eher von Kay geliefert worden. Dieser hat den Begriff als Erster gebildet und daher auch das Vorrecht, ihn auszulegen.
Zitate
- Mini-machines
- Carlo Pescio
- “Object oriented design is not about building a deep chain of domain-inspired ‘abstractions’ with little or no behavior. It’s about decomposing the problem so that the intended function emerges from the interaction between intelligent, specialized mini-machines ”
Quellen
- [0]
- Dr. Alan Kay on the Meaning of “Object-Oriented Programming”
- https://www.purl.org/stefan_ram/pub/doc_kay_oop_en
- [1]
- Alan Kay, The history of smalltalk. ACM Sigplan Not. (Mar 1993)
- http://www.metaobject.com/papers/SmallHistory.pdf
- [2]
- Object Oriented Programming
- http://c2.com/cgi/wiki?ObjectOrientedProgramming
- [3]
- ISO 2382-15 : 1998 Information technology - Vocabulary - Part 15: Programming languages; Revision of first edition ISO 2382-15 : 1985
- [4]
- American National Standard Dictionary of Information Technology (ANSDIT )—The letter “O”
- http://www.ncits.org/tc_home/k5htm/o1.htm#object-oriented
- Die Definitionen des ANSDIT sind den der ISO meistens recht nahe oder gleichen diesen sogar wörtlich.
- [5]
- Objektorientierung verkürzt Time-to-Market
- http://www.computerwoche.de/heftarchiv/1998/19981120/a45600.html
- Computerwoche 47 vom 1998-11-20, Seite 91–92
- (Als Beispiel der Darstellung der „objektorientierten Programmierung“ in der Presse der 90er Jahre.)
- [6]
- Survey of Object Oriented Programming Languages
- Chris Hostetter
- http://www.rescomp.berkeley.edu/~hossman/cs263/paper.html