Objektorientierte Programmierung

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 Objekten gesendet werden: Hierzu gibt es eine Versendungsbestimmung, die das Empfängerobjekt und die zu versendende Nachricht festlegt. Diese Versendungsbestimmung kann auch ein Ausdruck sein, dessen Wert dann vom Empfängerobjekt (als eine Art von Antwort) festgelegt wird. (Quelltextmodell)

Es muß möglich sein, daß erst spätestmöglich zur Laufzeit 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

Statically-typed Languages
Paul Graham
Object-oriented programming is exciting if you have a statically-typed language without lexical closures or macros. To some degree, it offers a way around these limitations.
http://www.paulgraham.com/noop.html

 

Quellen

[0]
Dr. Alan Kay  on the Meaning of “Object-Oriented Programming”
http://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

Schreibe einen Kommentar