Zum Inhalt springen

„Objektorientierte Programmierung“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
[gesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
K Attribute: unpassendes entfernt
 
(539 dazwischenliegende Versionen von mehr als 100 Benutzern, die nicht angezeigt werden)
Zeile 1: Zeile 1:
Die '''objektorientierte Programmierung''' (kurz '''OOP''') ist ein auf dem Konzept der [[Objektorientierung]] basierendes [[Programmierparadigma]]. Die Grundidee der objektorientierten Programmierung ist, Daten und Funktionen, die auf diese Daten angewandt werden können, möglichst eng in einem sogenannten ''Objekt'' zusammenzufassen und nach außen hin zu ''kapseln'', so dass Methoden fremder Objekte diese Daten nicht versehentlich manipulieren können.
Die '''objektorientierte Programmierung''' (kurz '''OOP''') ist ein auf dem Konzept der [[Objektorientierung]] basierendes [[Programmierparadigma]]. Die Grundidee besteht darin, die [[Softwarearchitektur|Architektur]] einer Software an den [[Ontologie|Grundstrukturen]] desjenigen Bereichs der Wirklichkeit auszurichten, der die gegebene Anwendung betrifft. Ein Modell dieser Strukturen wird in der [[Softwaredesign|Entwurfsphase]] aufgestellt. Es enthält Informationen über die auftretenden Objekte und deren Abstraktionen, ihre [[Abstrakter Datentyp|Typen]]. Die Umsetzung dieser Denkweise erfordert die Einführung verschiedener Konzepte, insbesondere [[Klasse (Objektorientierung)|Klassen]], [[Vererbung (Programmierung)|Vererbung]], [[Polymorphie (Programmierung)|Polymorphie]] und spätes Binden ([[dynamisches Binden]]).
Im Gegensatz dazu beschreibt das vor der OOP vorherrschende Paradigma eine strikte Trennung von Funktionen ([[Programmcode]]) und Daten, dafür aber eine schwächere Strukturierung der Daten selbst.


== Begriffe ==
== Definition ==
Die Definition, was ''objektorientierte Programmierung'' ist und im Kern ausmacht, variiert und ist auch Veränderungen unterworfen.


[[Alan Kay]], der Erfinder der Programmiersprache [[Smalltalk (Programmiersprache)|Smalltalk]] und des Begriffs „object oriented“, definierte ihn im Kontext von Smalltalk folgendermaßen:

{{Zitat
|Text=1. Everything is an object, 2. Objects communicate by sending and receiving messages (in terms of objects), 3. Objects have their own memory (in terms of objects), 4. Every object is an instance of a class (which must be an object), 5. The class holds the shared behavior for its instances (in the form of objects in a program list), 6. To eval a program list, control is passed to the first object and the remainder is treated as its message
|Sprache=en
|Autor=[[Alan Kay]]
|Quelle=The Early History of Smalltalk (1993)
|Umschrift=
|Übersetzung=1. Alles ist ein Objekt, 2. Objekte kommunizieren durch das Senden und Empfangen von Nachrichten (welche aus Objekten bestehen), 3. Objekte haben ihren eigenen Speicher (strukturiert als Objekte), 4. Jedes Objekt ist die Instanz einer Klasse (welche ein Objekt sein muss), 5. Die Klasse beinhaltet das Verhalten aller ihrer Instanzen (in der Form von Objekten in einer Programmliste), 6. Um eine Programmliste auszuführen, wird die Ausführungskontrolle dem ersten Objekt gegeben und das Verbleibende als dessen Nachricht behandelt
|ref=<ref name="earlyhistoryST">{{cite web |url=http://propella.sakura.ne.jp/earlyHistoryST/EarlyHistoryST.html |title=The Early History of Smalltalk |author=[[Alan Kay]] |language=en |work=The second ACM SIGPLAN conference on History of programming languages |accessdate=2012-06-04 |pages=78 |publisher=ACM |doi=10.1145/155360.155364 |date=1993-03-01 }} ({{Webarchiv |url=http://www.smalltalk.org/downloads/papers/SmalltalkHistoryHOPL.pdf |text=smalltalk.org |format=PDF |wayback=20120205105015 |archiv-bot=2019-05-04 18:44:01 InternetArchiveBot}})</ref>}}
Alan Kay drückte später seine Unzufriedenheit über den von ihm gewählten Begriff „Objektorientierung“ aus, weil dieser aus seiner Sicht den Kernaspekt des ''Messaging'' zu kurz kommen ließe.<ref>{{cite web |url=http://c2.com/cgi/wiki?AlanKayOnMessaging |date=1998-10-10 |title=Alan Kay On Messaging |accessdate=2012-06-04|quote= […] Smalltalk is not only NOT its syntax or the class library, it is not even about classes. I’m sorry that I long ago coined the term „objects“ for this topic because it gets many people to focus on the lesser idea. The big idea is „messaging“ […]}}</ref>

2003 gab Alan Kay folgende Definition von objektorientierter Programmierung:

{{Zitat
|Text=OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.
|Sprache=en
|Autor=[[Alan Kay]]
|Quelle=Antwort auf eine Anfrage, 2003
|Übersetzung=OOP bedeutet für mich nur Messaging, lokales Beibehalten und Schützen und Verbergen des Prozesszustands sowie [[Dynamische Bindung|spätestmögliche Bindung]] aller Dinge.
|ref=<ref>{{cite web|url=http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/doc_kay_oop_en |title=Dr. Alan Kay on the Meaning of Object-Oriented Programming |author=Stefan Ram |date=2003-07-23 |accessdate=2012-06-04 |language=englisch |publisher=fu-berlin.de}}</ref>}}

Der [[Internationale Organisation für Normung|ISO/IEC-2382-15]]-Standard von 1999 definiert den Begriff ''object-oriented'' dagegen wie folgt:

{{Zitat
|Text=Pertaining to a technique or a programming language that supports objects, classes, and inheritance.
|Sprache=en
|Autor=ISO/IEC 2382-15
|Übersetzung=Bezieht sich auf eine Technik oder Programmiersprache, welche Objekte, Klassen und Vererbung unterstützt.
|ref=<ref>{{cite web|url=http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=7257|title=ISO 2382-15: 1998 Information technology – Vocabulary – Part 15: Programming languages; Revision of first edition ISO 2382-15: 1985 |language=englisch |publisher=iso.org |accessdate=2012-06-04 |date=1999}}</ref>}}
Die ISO-Definition gilt inzwischen im Allgemeinen als zu vereinfachend, da auch klassenlose objektorientierte Sprachen existieren und auch der Vererbung inzwischen weniger Bedeutung beigemessen wird als noch in den 1990ern.

== Konzepte ==
Im Vergleich mit anderen Programmiermethoden verwendet die objektorientierte Programmierung neue, andere Begriffe.
Im Vergleich mit anderen Programmiermethoden verwendet die objektorientierte Programmierung neue, andere Begriffe.


Die einzelnen Bausteine, aus denen ein objektorientiertes Programm während seiner Abarbeitung besteht, werden als Objekte bezeichnet. Die Konzeption dieser Objekte erfolgt dabei in der Regel auf Basis der folgenden [[Programmierparadigma|Paradigmen]]:
Die einzelnen Bausteine, aus denen ein objektorientiertes Programm während seiner Abarbeitung besteht, werden als Objekte bezeichnet. Die Objekte werden dabei in der Regel auf Basis der folgenden Konzepte entwickelt:


; [[Abstraktion]]: Jedes Objekt im System kann als ein abstraktes Modell eines ''Akteurs'' betrachtet werden, der Aufträge erledigen, seinen [[Zustand]] berichten und ändern und mit den anderen Objekten im System kommunizieren kann, ohne offenlegen zu müssen, wie diese Fähigkeiten implementiert sind (vgl. [[Abstrakter Datentyp|abstrakter Datentyp (ADT)]]). Solche Abstraktionen sind entweder Klassen (in der klassenbasierten Objektorientierung) oder Prototypen (in der prototypbasierten Programmierung).
; [[Abstraktion (Informatik)|Abstraktion]]: Jedes Objekt im System kann als ein abstraktes Modell eines ''Akteurs'' betrachtet werden, der Aufträge erledigen, seinen Zustand berichten und ändern und mit den anderen Objekten im System kommunizieren kann, ohne offenlegen zu müssen, wie diese Fähigkeiten implementiert sind (vgl. [[abstrakter Datentyp]]). Solche Abstraktionen sind entweder Klassen (in der klassenbasierten Objektorientierung) oder Prototypen (in der prototypbasierten Programmierung).
:; [[Klasse (objektorientierte Programmierung)|Klasse]]: Die Datenstruktur eines Objekts wird durch die [[Attribut (Objekt)|Attribute]] (auch ''Eigenschaften'') seiner Klassendefinition festgelegt. Das Verhalten des Objekts wird von den [[Methode (objektorientierte Programmierung)|Methoden]] der Klasse bestimmt. Klassen können von anderen Klassen ''abgeleitet'' werden ([[Vererbung (Programmierung)|Vererbung]]). Dabei erbt die Klasse die Datenstruktur (''Attribute'') und die Methoden von der ''vererbenden'' Klasse ([[Basisklasse]]).
:; [[Klasse (Objektorientierung)|Klasse]]: Die Datenstruktur eines Objekts wird durch die [[Attribut (Programmierung)|Attribute]] (auch ''Eigenschaften'') seiner Klassendefinition festgelegt. Das Verhalten des [[Objekt (Programmierung)|Objekts]] wird von den [[#Methoden|Methoden]] der Klasse bestimmt. Klassen können von anderen Klassen ''abgeleitet'' werden ([[Vererbung (Programmierung)|Vererbung]]). Dabei erbt die Klasse die Datenstruktur (''Attribute'') und die Methoden von der ''vererbenden'' Klasse ([[Basisklasse]]).
;; [[Prototypenbasierte Programmierung|Prototype]]: Objekte werden durch das Klonen bereits existierender Objekte erzeugt und können anderen Objekten als Prototypen dienen und damit ihre eigenen Methoden zur Wiederverwendung zur Verfügung stellen, wobei die neuen Objekte nur die Unterschiede zu ihrem Prototypen-Objekt definieren müssen.
:; [[Prototypenbasierte Programmierung|Prototyp]]: Objekte werden durch das Klonen bereits existierender Objekte erzeugt und können anderen Objekten als Prototypen dienen und damit ihre eigenen Methoden zur Wiederverwendung zur Verfügung stellen, wobei die neuen Objekte nur die Unterschiede zu ihrem Prototyp definieren müssen. Änderungen am Prototyp werden dynamisch auch an den von ihm abgeleiteten Objekten wirksam.
; [[Datenkapselung (Programmierung)|Datenkapselung]]: Als Datenkapselung bezeichnet man in der Programmierung das Verbergen von Implementierungsdetails. Der direkte Zugriff auf die interne Datenstruktur wird unterbunden und erfolgt statt dessen über definierte Schnittstellen. Objekte können den internen Zustand anderer Objekte nicht in unerwarteter Weise lesen oder ändern. Ein Objekt hat eine Schnittstelle, die darüber bestimmt, auf welche Weise mit dem Objekt interagiert werden kann. Dies verhindert das Umgehen von [[Invariante (Informatik)|Invarianten]] des Programms.
; [[Polymorphie (Programmierung)|Polymorphie]]: Verschiedene Objekte können auf die gleiche Nachricht unterschiedlich reagieren. Wird die Zuordnung einer Nachricht zur Reaktion auf die Nachricht erst zur [[Laufzeit (Informatik)|Laufzeit]] aufgelöst, dann wird dies auch [[späte Bindung]] genannt.
; [[Feedback]]: Verschiedene Objekte kommunizieren über einen Nachricht-Antwort-Mechanismus, der zu Veränderungen in den Objekten führt und neue Nachrichtenaufrufe erzeugt. Dafür steht die [[Kopplung (Softwareentwicklung)|Kopplung]] als Index für den Grad des Feedback.
; [[Vererbung (Programmierung)|Vererbung]]: Vererbung heißt vereinfacht, dass eine abgeleitete Klasse die Methoden und Attribute der Basisklasse ebenfalls besitzt, also „erbt“. Somit kann die abgeleitete Klasse auch darauf zugreifen. Neue Arten von Objekten können auf der Basis bereits vorhandener Objekt-Definitionen festgelegt werden. Es können neue Bestandteile hinzugenommen werden oder vorhandene überlagert werden. Wird keine Vererbung zugelassen, so spricht man zur Unterscheidung oft auch von ''objektbasierter Programmierung''.


; [[Datenkapselung (Programmierung)|Datenkapselung]]: Als Datenkapselung bezeichnet man in der Programmierung das Verbergen von Implementierungsdetails. Auf die interne Datenstruktur kann nicht direkt zugegriffen werden, sondern nur über definierte Schnittstellen. Objekte können den internen Zustand anderer Objekte nicht in unerwarteter Weise lesen oder ändern. Ein Objekt hat eine Schnittstelle, die darüber bestimmt, auf welche Weise mit dem Objekt interagiert werden kann. Dies verhindert das Umgehen von [[Invariante (Informatik)|Invarianten]] des Programms.
== Klassen ==


; [[Feedback (Kommunikation)|Feedback]]: Verschiedene Objekte kommunizieren über einen Nachricht-Antwort-Mechanismus, der zu Veränderungen in den Objekten führt und neue Nachrichtenaufrufe erzeugt. Dafür steht die [[Kopplung (Softwareentwicklung)|Kopplung]] als Index für den Grad des Feedbacks.
''Hauptartikel:'' [[Klasse (objektorientierte Programmierung)|Klasse]]


; [[Persistenz (Informatik)|Persistenz]]: Objektvariablen existieren, solange die Objekte vorhanden sind, und „verfallen“ nicht nach Abarbeitung einer Methode.
Zur besseren Verwaltung gleichartiger Objekte bedienen sich die meisten Programmiersprachen des Konzeptes der Klasse. Klassen sind Vorlagen, aus denen [[Instanz (Informatik)|Instanzen]] genannte Objekte zur Laufzeit erzeugt werden. Im Programm werden dann nicht einzelne Objekte, sondern eine Klasse gleichartiger Objekte definiert.


; [[Polymorphie (Programmierung)|Polymorphie]] (dt. Mehrgestalt): Fähigkeit eines [[Bezeichner]]s, abhängig von seiner Verwendung unterschiedliche Datentypen anzunehmen. Verschiedene Objekte können auf die gleiche Nachricht unterschiedlich reagieren. Wird die Art der Reaktion auf die Nachricht erst zur [[Laufzeit (Informatik)|Laufzeit]] aufgelöst, wird dies auch [[späte Bindung]] genannt.
Man kann sich die Erzeugung von Objekten aus einer Klasse vorstellen wie das Fertigen von Autos aus dem Konstruktionsplan eines bestimmten Fahrzeugtyps. Klassen sind die Konstruktionspläne für Objekte.


; [[Vererbung (Programmierung)|Vererbung]]: Vererbung heißt vereinfacht, dass eine abgeleitete Klasse die Methoden und Attribute der Basisklasse ebenfalls besitzt, also „erbt“. Somit kann die abgeleitete Klasse auch darauf zugreifen. Neue Arten von Objekten können auf der Basis bereits vorhandener Objektdefinitionen festgelegt werden. Es können neue Bestandteile hinzugenommen werden oder vorhandene überlagert werden.
Die Klasse entspricht in etwa einem komplexen [[Datentyp]] wie in der prozeduralen Programmierung, geht aber darüber hinaus: Sie legt nicht nur die Datentypen fest, aus denen die mit Hilfe der Klassen erzeugten Objekte bestehen, sie definiert zudem die [[Algorithmus|Algorithmen]], die auf diesen Daten operieren. Während also zur Laufzeit eines Programms einzelne Objekte miteinander interagieren, wird das Grundmuster dieser Interaktion durch die Definition der einzelnen Klassen festgelegt.


=== Objekte ===
'''Beispiel:'''
; [[Objekt (Programmierung)|Objekt]] (von dt. Ding / Sache)
: Ein Element, welches Funktionen, Methoden, Prozeduren, einen inneren Zustand, oder mehrere dieser Dinge besitzt.


; [[Entität (Informatik)|Entität]]
Die Klasse Auto legt fest, dass das Auto vier Reifen, fünf Türen, einen Motor und fünf Sitze hat.
: Ein Objekt mit einer eindeutigen Identität zur Speicherung von Daten. Beispiel: Eine Person mit den Daten Adresse, Telefonnummer oder Name. Die Daten können geändert werden, ohne dass die Person ihre Identität verliert. Eine Person ist also eine Entität.<ref name="ghosh" />


; [[Value Object|Wertobjekt]]
Das Objekt „Automodell1“ hat schließlich vier Reifen mit dem Durchmesser 60&nbsp;cm und der Breite 20&nbsp;cm, fünf rote Türen, einen Motor mit 150&nbsp;kW und fünf Ledersitze.
: Ein Objekt, welches über seinen Wert definiert wird. Eine Telefonnummer, welche sich ändert, ist also eine andere Telefonnummer. Gleichartig ist eine Adresse, bei der sich lediglich die Hausnummer ändert, eine andere Adresse, selbst wenn alle anderen Daten gleich bleiben. Somit stellt eine Telefonnummer und eine Adresse keine Entität dar, sondern ein Wertobjekt.<ref name="ghosh" />
Ein weiteres Objekt „Automodell2“ hat vier Reifen mit dem Durchmesser 40&nbsp;cm und der Breite 15&nbsp;cm, fünf blaue Türen ...


; [[Attribut (UML)|Eigenschaft]]
Beide Objekte sind unterschiedlich, gehören aber zu der gemeinsamen Klasse Auto.
: Ein Bestandteil des Zustands eines Objekts. Hierbei kann es sich um eine Entität oder ein Wertobjekt handeln.


; [[Dienst (Informatik)|Dienst]]
=== Methoden ===
: Ein Objekt, welches ein Verhalten (z.&nbsp;B. eine Geschäftslogik) in Form von Prozeduren, Funktionen oder Methoden implementiert. Der Dienst verwendet hierbei Entitäten oder Wertobjekte.<ref name="ghosh" />


; [[Prozedur (Programmierung)|Prozedur]]
Die einer Klasse von Objekten zugeordneten Algorithmen bezeichnet man auch als ''Methoden''.
: Verändert den Zustand eines Objektes, ohne einen Rückgabewert zu liefern. Eine Prozedur kann andere Objekte als Parameter entgegennehmen.


; [[Funktion (Programmierung)|Funktion]]
Häufig wird der Begriff ''Methode'' synonym zu den Begriffen [[Funktion (Programmierung)|Funktion]] oder [[Prozedur (Programmierung)|Prozedur]] aus anderen Programmiersprachen gebraucht. Die Funktion oder Prozedur ist jedoch eher als Implementierung einer Methode zu betrachten. Im täglichen Sprachgebrauch sagt man auch „''Objekt ''A'' ruft Methode ''m'' von Objekt ''B'' auf.“''
: Ordnet einer gegebenen Eingabe einen bestimmten Rückgabewert zu. Eine Funktion zeichnet sich insbesondere dadurch aus, dass sie nicht den Zustand eines Objekts verändert.<ref name="ghosh" />


; [[Methode (Programmierung)|Methode]]
Eine besondere Rolle spielen Methoden für die [[Datenkapselung (Programmierung)|Kapselung]], insbesondere die [[Zugriffsfunktion]]en. Spezielle Methoden zur Erzeugung bzw. ''Zerstörung'' von Objekten heißen [[Konstruktoren und Destruktoren]].
: Verändert den Zustand eines Objekts und liefert zudem einen Rückgabewert. Eine Methode kann andere Objekte als Parameter entgegennehmen.


; [[Modul (Software)|Modul]]
In vielen objektorientierten Programmiersprachen lässt sich festlegen, welche Objekte eine bestimmte Methode aufrufen dürfen. So unterscheidet beispielsweise die Programmiersprache [[Java (Programmiersprache)|Java]] vier Zugriffsebenen, die bereits zur [[Kompilierung|Übersetzungszeit]] geprüft werden.
: Eine zusammengefasste Gruppe von Objekten.
# ''Private'' Methoden können nur von anderen Methoden derselben Klasse aufgerufen werden.

# Methoden auf ''Paket-Ebene'' können nur von Klassen aufgerufen werden, die sich im selben [[Java-Syntax#Pakete, Namen, Klassen|Paket]] befinden.
=== Klassen ===
# ''Geschützte'' (''protected'') Methoden dürfen von Klassen im selben Paket und abgeleiteten [[Subklasse|Unterklassen]] aufgerufen werden.
{{Hauptartikel|Klasse (Objektorientierung)}}

Zur besseren Verwaltung gleichartiger Objekte bedienen sich die meisten Programmiersprachen des Konzeptes der Klasse. Klassen sind Vorlagen, aus denen Instanzen genannte Objekte zur Laufzeit erzeugt werden. Im Programm werden nicht einzelne Objekte, sondern eine Klasse gleichartiger Objekte definiert. Existieren in der gewählten Programmiersprache keine Klassen oder werden diese explizit unterdrückt, so spricht man zur Unterscheidung oft auch von [[Objektbasierte Programmierung|objektbasierter Programmierung]].

Man kann sich die Erzeugung von Objekten aus einer Klasse vorstellen wie das Fertigen von Autos aus dem Konstruktionsplan eines bestimmten Fahrzeugtyps. Klassen sind die Konstruktionspläne für Objekte.

Die Klasse entspricht in etwa einem komplexen [[Datentyp]] wie in der [[Prozedurale Programmierung|prozeduralen Programmierung]], geht aber darüber hinaus: Sie legt nicht nur die Datentypen fest, aus denen die mit Hilfe der Klassen erzeugten Objekte bestehen, sie definiert zudem die [[Algorithmus|Algorithmen]], die auf diesen Daten operieren. Während also zur Laufzeit eines Programms einzelne Objekte miteinander interagieren, wird das Grundmuster dieser Interaktion durch die Definition der einzelnen Klassen festgelegt.

'''Beispiel'''

Die Klasse „Auto“ legt fest, dass das Auto vier Reifen einer bestimmten Größe, fünf farbige Türen, einen Motor mit einer bestimmten Leistung und fünf Sitze mit wählbaren Bezügen hat.
# Das Objekt „Auto1“ hat vier Reifen mit dem Durchmesser 19&nbsp;Zoll und der Breite 255&nbsp;mm, fünf rote Türen, einen Motor mit 150&nbsp;kW und fünf Ledersitze.
# Das Objekt „Auto2“ hat vier Reifen mit dem Durchmesser 19&nbsp;Zoll und der Breite 255&nbsp;mm, fünf rote Türen, einen Motor mit 150&nbsp;kW und fünf Ledersitze.
# Ein weiteres Objekt „Auto3“ hat vier Reifen mit dem Durchmesser 16&nbsp;Zoll und der Breite 205&nbsp;mm, fünf blaue Türen, einen Motor mit 90&nbsp;kW und fünf Sitze mit Textilbezug.
Es handelt sich um drei Objekte; zwei davon haben gleiche Attribute. Alle drei sind aber Ausprägungen (Instanzen) der Klasse „Auto“.

==== {{Anker|Methoden}}Methoden bei Klassen ====
{{Hauptartikel|Methode (Programmierung)}}

Die einer Klasse von Objekten zugeordneten Algorithmen bezeichnet man auch als [[Methode (Programmierung)|Methoden]].

Häufig wird der Begriff ''Methode'' synonym zu den Begriffen [[Funktion (Programmierung)|Funktion]] oder [[Prozedur (Programmierung)|Prozedur]] aus anderen Programmiersprachen gebraucht. Die Funktion oder Prozedur ist jedoch eher als Implementierung einer Methode zu betrachten. Im täglichen Sprachgebrauch sagt man auch „Objekt&nbsp;''A'' ruft Methode&nbsp;''m'' von Objekt&nbsp;''B'' auf.“

Eine besondere Rolle spielen Methoden für die [[Datenkapselung (Programmierung)|Kapselung]], insbesondere die [[Zugriffsfunktion]]en. Spezielle Methoden zur Erzeugung und ''Zerstörung'' von Objekten heißen [[Konstruktoren und Destruktoren|Konstruktoren beziehungsweise Destruktoren]].

Methoden können [[Parameter (Informatik)|Parameter]] erhalten, die beim Aufruf übergeben werden müssen, und einen Rückgabewert besitzen, den sie am Ende dem Aufrufer zurückgeben. Beispielsweise hat die Methode ''addiere'' die Parameter ''Zahl 1'' und ''Zahl 2'' und gibt als Rückgabewert die Summe der Zahlen zurück.

In vielen objektorientierten Programmiersprachen lässt sich festlegen, welche Objekte eine bestimmte Methode aufrufen dürfen. So wird meist zwischen folgenden vier Zugriffsebenen unterschieden, die bereits zur [[Kompilierung|Übersetzungszeit]] geprüft werden.
# ''Öffentliche'' (''public'') Methoden dürfen von allen Klassen aufgerufen werden.
# ''Öffentliche'' (''public'') Methoden dürfen von allen Klassen aufgerufen werden.
# ''Geschützte'' (''protected'') Methoden dürfen von Klassen im selben Paket und [[Abgeleitete Klasse|abgeleiteten Klassen]] aufgerufen werden.
Analog zu diesen vier Zugriffsebenen sind in der [[Unified Modeling Language]] (UML) vier Sichtbarkeiten für [[Operation (UML)|Operationen]] definiert.
# Methoden auf ''Paket-Ebene'' können nur von Klassen aufgerufen werden, die sich im selben [[Java-Syntax#Pakete, Namen, Klassen, Schnittstellen|Paket]] befinden – diese Zugriffsebene ist nur bei Programmiersprachen vorhanden, die Pakete bzw. [[Namensraum|Namespaces]] kennen.
# ''Private'' Methoden können nur von anderen Methoden derselben Klasse aufgerufen werden.
Analog zu diesen vier Zugriffsebenen sind in der [[Unified Modeling Language]] (UML) vier [[Sichtbarkeit (Programmierung)|Sichtbarkeiten]] für [[Operation (UML)|Operationen]] definiert.
<!-- Zu tun: Beispiele aus Smalltalk und C++. Wer kann die beisteuern? -->
<!-- Zu tun: Beispiele aus Smalltalk und C++. Wer kann die beisteuern? -->


=== Attribute ===
==== Attribute ====
{{Hauptartikel|Attribut (Programmierung)}}


Objekte (Fenster, Buttons, Laufleisten, Menüs, …) besitzen verschiedene Eigenschaften (Farbe, Größe, Ausrichtung, …). Diese Eigenschaften eines Objekts heißen ''Attribute''.
Objekte (Fenster, Schaltflächen, Laufleisten, Menüs,&nbsp;…) besitzen verschiedene Eigenschaften (Farbe, Größe, Ausrichtung,&nbsp;…). Diese Eigenschaften eines Objekts heißen ''Attribute''.


=== Polymorphie ===
<!-- Manchmal wird zwischen Objekt- und Klassenmethoden nicht unterschieden. -->
{{Hauptartikel|Polymorphie (Programmierung)}}


Unter bestimmten Voraussetzungen können Algorithmen, die auf den Schnittstellen eines bestimmten Objekttyps operieren, auch mit Objekten davon abgeleiteter Klassen zusammenarbeiten.
== Polymorphie ==
''Hauptartikel:'' [[Polymorphie (Programmierung)]]


Geschieht dies so, dass durch Vererbung überschriebene Methoden an Stelle der Methoden der vererbenden Klasse ausgeführt werden, dann spricht man von Polymorphie. Polymorphie stellt damit eine Möglichkeit dar, einer durch ähnliche Objekte ausgeführten Aktion einen Namen zu geben, wobei jede Klasse die Aktion in einer für das Objekt geeigneten Weise implementiert.
Unter bestimmten Voraussetzungen können Algorithmen, die auf den Schnittstellen eines bestimmten Objekttyps operieren, auch mit davon abgeleiteten Objekten zusammenarbeiten.


Diese Technik, das sogenannte ''Overriding'', implementiert aber keine universelle [[Polymorphie (Programmierung)|Polymorphie]], sondern nur die sogenannte Ad-hoc-Polymorphie.
Geschieht dies so, dass durch Vererbung überschriebene Methoden an Stelle der Methoden des vererbenden Objektes ausgeführt werden, dann spricht man von Polymorphie. Polymorphie stellt damit eine Möglichkeit dar, einer durch ähnliche Objekte ausgeführten Aktion einen Namen zu geben, wobei jedes Objekt die Aktion in einer für das Objekt geeigneten Weise implementiert.


=== Terminologie ===
Diese Technik, das so genannte ''Overriding'', implementiert aber keine universelle [[Polymorphie]], sondern nur die sogenannte Ad-hoc-Polymorphie.

== Bezeichnungen ==
Die Begriffe der objektorientierten Programmierung haben teilweise unterschiedliche Namen. Folgende Bezeichnungen werden synonym verwendet:
Die Begriffe der objektorientierten Programmierung haben teilweise unterschiedliche Namen. Folgende Bezeichnungen werden synonym verwendet:


{| class="prettytable"
{| class="wikitable"
!colspan="3"|Bezeichnungen in der objektorientierten Programmierung
|+ Bezeichnungen in der objektorientierten Programmierung
|-
|-
! Deutscher Begriff
|Superklasse
! Alternativen
|= Basisklasse
! Englisch
|= Oberklasse
|-
|-
| [[Abgeleitete Klasse]]
|Subklasse
| Kindklasse, Unterklasse, Subklasse
|= abgeleitete Klasse
| child class, subclass
|= Unterklasse
|-
|-
| [[Attribut (Programmierung)|Attribut]]
|Methode
| Objektvariable, Instanzvariable, Datenelement, Eigenschaft
|= Elementfunktion
| member, property
|= Memberfunktion
|-
|-
| [[Basisklasse]]
|statische Methode
| Elternklasse, Oberklasse, Superklasse
|= Klassenfunktion
| parent class, superclass
|= Metafunktion
|-
|-
| [[Objekt (Programmierung)|Objekt]]
|Attribut
| Exemplar, Instanz
|= Datenelement
| instance
|= Member
|-
|-
| [[Methode (Programmierung)|Methode]]
|(aus einer Klasse erzeugtes) Objekt
| Elementfunktion
|= Exemplar
| method
|= Instanz
|-
| Statische Methode
| Klassenfunktion, Metafunktion
| static method
|}
|}


== Objektorientierte Programmiersprachen ==
== Objektorientierte Programmiersprachen ==
[[Bild:Historie.png|thumb|Historie objektorientierter Programmiersprachen]]
Objektorientierte [[Programmiersprache]]n besitzen einen speziellen [[Datentyp]] – das [[Objekt (Programmierung)|Objekt]]. Damit ermöglichen sie die Objektorientierung. Die ''rein'' objektorientierten Sprachen, wie [[Smalltalk (Programmiersprache)|Smalltalk]], folgen dem Prinzip: „Alles ist ein Objekt.“ Auch elementare Typen wie [[Integer (Datentyp)|Ganzzahlen]] werden dabei durch Objekte repräsentiert – selbst Klassen sind hier Objekte, die wiederum Exemplare von Metaklassen sind. Die verbreiteten objektorientierten Programmiersprachen, unter anderem [[C Sharp|C#]], [[C++]] und [[Java (Programmiersprache)|Java]], handhaben das Objektprinzip nicht ganz so streng. Bei ihnen sind elementare Datentypen keine vollwertigen Objekte, da sie auf Methoden und Struktur verzichten müssen. Sie stellen dem Entwickler auch frei, wie stark er die [[Datenkapselung (Programmierung)|Kapselung]] objektinterner Daten einhält.


Objektorientierte [[Programmiersprache]]n unterstützen die Programmstrukturierung mit einem speziellen [[Datentyp]] – dem [[Objekt (Programmierung)|Objekt]], der die Objektorientierung ermöglicht. Die ''rein'' objektorientierten Sprachen, wie [[Smalltalk (Programmiersprache)|Smalltalk]], folgen dem Prinzip: „Alles ist ein Objekt.“ Auch elementare Typen wie [[Integer (Datentyp)|Ganzzahlen]] werden dabei durch Objekte repräsentiert – selbst Klassen sind hier Objekte, die wiederum Exemplare von Metaklassen sind. Die verbreiteten objektorientierten Programmiersprachen, unter anderem [[C-Sharp|C#]], [[C++]] und [[Java (Programmiersprache)|Java]], handhaben das Objektprinzip nicht alle so streng. Bei ihnen sind elementare Datentypen keine vollwertigen Objekte, da sie auf Methoden und Struktur verzichten müssen. Sie stellen dem Entwickler auch frei, wie stark er die [[Datenkapselung (Programmierung)|Kapselung]] objektinterner Daten einhält.
Die erste bekannte objektorientierte Programmiersprache war [[Simula]]-67. Später wurden die Prinzipien dann in [[Smalltalk (Programmiersprache)|Smalltalk]] weiter ausgebaut. Mit dem [[ANSI]]/X3.226-1994-Standard wurde [[Common Lisp]]/[[Common Lisp Object System|CLOS]] zur ersten standardisierten objektorientierten Programmiersprache und mit [[International Organization for Standardization|ISO]] 8652:1995 wurde [[Ada (Programmiersprache)|Ada 95]] zur ersten objektorientierten Programmiersprache nach dem internationalen ISO-Standard.


Die erste bekannte objektorientierte Programmiersprache war [[Simula]]-67. Später wurden die Prinzipien der Kapselung in einer Klassenhierarchie dann in [[Smalltalk (Programmiersprache)|Smalltalk]] weiter ausgebaut. Mit dem [[ANSI]]/X3.226-1994-Standard wurde [[Common Lisp]]/[[Common Lisp Object System|CLOS]] zur ersten standardisierten objektorientierten Programmiersprache und mit [[International Organization for Standardization|ISO]] 8652:1995 wurde [[Ada (Programmiersprache)|Ada 95]] als erste nach dem internationalen ISO-Standard normierte objektorientierte Programmiersprache festgelegt.
Gängige moderne Programmiersprachen wie [[Java (Programmiersprache)|Java]], [[C++]], [[C-Sharp|C#]], [[Python (Programmiersprache)|Python]], [[Perl (Programmiersprache)|Perl]], [[PHP]] und [[Ruby (Programmiersprache)|Ruby]] unterstützen sowohl die OOP als auch den prozeduralen Ansatz, der in den gängigen Programmiersprachen der 1970er und 1980er Jahre wie [[Pascal (Programmiersprache)|Pascal]], [[Fortran]] oder [[C (Programmiersprache)|C]] vorherrschend war. Im Gegensatz dazu setzt [[Smalltalk-80|Smalltalk]], die älteste heute noch bedeutsame OOP-Sprache, auf kompromisslose Objektorientierung und hatte damit starken Einfluss auf die Entwicklung populärer OOP-Sprachen, ohne selber deren Verbreitung zu erreichen. Auch wenn der Durchbruch der OOP erst in den 1990ern stattfand, wurde die objektorientierte Programmierung bereits Ende der sechziger Jahre als Lösungsansatz für die Modularisierung und die Wiederverwendbarkeit von Code entwickelt.


Gängige moderne Programmiersprachen (z.&nbsp;B. [[Python (Programmiersprache)|Python]]) unterstützen sowohl die OOP als auch den prozeduralen Ansatz, der in den [[Prozedurale Programmierung|klassischen Programmiersprachen]] der 1970er- und 1980er-Jahre wie [[Pascal (Programmiersprache)|Pascal]], [[Fortran]] oder [[C (Programmiersprache)|C]] vorherrschte. Im Gegensatz dazu setzt Smalltalk, die älteste heute noch bedeutsame OOP-Sprache, auf kompromisslose Objektorientierung und hatte damit starken Einfluss auf die Entwicklung populärer OOP-Sprachen, ohne selber deren Verbreitung zu erreichen, weil keine kostengünstig allgemein verfügbare Implementierung angeboten wurde. Auch wenn der Durchbruch der OOP erst in den 1990er-Jahren stattfand, wurde die objektorientierte Programmierung bereits Ende der 1960er Jahre mit Simula-67 als Lösungsansatz für die Modularisierung und die Wiederverwendbarkeit von Code entwickelt.
''Siehe auch:''

*[[Geschichte der Programmiersprachen]]
*[[Liste objektorientierter Programmiersprachen]]
{{Siehe auch|Geschichte der Programmiersprachen|Liste objektorientierter Programmiersprachen|Objektbasierte Programmiersprache}}


== Techniken ==
== Techniken ==
=== Objekt-Konzepte in Programmiersprachen ===
In einigen objektorientierten Programmiersprachen wie [[Go (Programmiersprache)|Go]], [[NewtonScript]] und [[Self (Programmiersprache)|Self]] wird auf die Deklaration von Klassen gänzlich verzichtet. Stattdessen werden neue Objekte von bestehenden Objekten, den sogenannten [[Prototypenbasierte Programmierung|Prototypen]], abgeleitet. Die Attribute und Methoden des Prototyps kommen immer dann zum Einsatz, wenn sie im abgeleiteten Objekt nicht explizit überschrieben wurden. Dies ist vor allem für die Entwicklung kleinerer Programme von Vorteil, da es einfacher und zeitsparend ist.


In manchen Programmiersprachen, beispielsweise in [[Objective-C]], gibt es zu jeder Klasse ein bestimmtes Objekt ([[Klassenobjekt]]), das die Klasse zur Laufzeit repräsentiert; dieses Klassenobjekt ist dann auch für die Erzeugung von Objekten der Klasse und den Aufruf der korrekten Methode zuständig.
In einigen objektorientierten Programmiersprachen wie zum Beispiel [[JavaScript]], [[NewtonScript]] und [[Self (Programmiersprache)|Self]] wird auf die Deklaration von Klassen gänzlich verzichtet. Stattdessen werden bestehende Objekte, so genannte [[Prototypenbasierte Programmierung|Prototypen]] abgeleitet. Die Attribute und Methoden des Prototyps kommen immer dann zum Einsatz, wenn sie nicht im abgeleiteten Objekt explizit überschrieben wurden. Dies ist vor allem für die Entwicklung kleinerer Programme von Vorteil, da es einfacher und zeitsparend ist.


Klassen werden in der Regel in Form von [[Klassenbibliothek]]en zusammengefasst, die häufig thematisch organisiert sind. So können Anwender einer objektorientierten Programmiersprache Klassenbibliotheken erwerben, die zum Beispiel den Zugriff auf Datenbanken ermöglichen.
In manchen Programmiersprachen wie beispielsweise [[Objective C]] gibt es zu jeder Klasse ein bestimmtes Objekt ([[Klassenobjekt]]), das dazu da ist, die Klasse zur Laufzeit zu repräsentieren; dieses Klassenobjekt ist dann auch zuständig für die Erzeugung von Objekten der Klasse und den Aufruf der korrekten Methode.


=== Entwurf von Objekt-Konzepten ===
Klassen werden in der Regel in Form von [[Klassenbibliothek]]en zusammengefasst, die häufig thematisch organisiert sind. So können Anwender einer objektorientierten Programmiersprache Klassenbibliotheken erwerben, die den Zugriff auf Datenbanken ermöglichen.
{{Hauptartikel|Objektorientierte Analyse und Design}}


Die Wortarten einer sprachlichen Problembeschreibung können hilfreiche Hinweise dafür geben, eine Objekt-basierte Modellierung zu konzipieren (sogenannte ''Verb-Substantiv-Methode'').<ref>{{Literatur |Autor=David J. Barnes, Michael Kölling |Titel=Java lernen mit BlueJ: Eine Einführung in die objektorientierte Programmierung |Ort=München |Datum=2009 |ISBN=978-3-86894-001-5 |Seiten=496}}</ref> Dabei werden Objekte und Klassen in der Regel sprachlich durch [[Substantiv]]e beschrieben, wobei Eigennamen auf Objekte und [[Appellativ]]e wie ''Haus'' und ''Tier'' auf Klassen hindeuten.<ref>{{cite journal|first=Russell J. | last=Abbott| title=Program design by informal English descriptions| date=1983| doi=10.1145/182.358441| journal = Communications of the ACM| volume=26| pages=882–894}}</ref> [[Verb]]en stehen in der Regel für Methoden, wobei [[Adverb]]ien und Substantive ergänzende Charakterisierungen der Methoden geben können. Die Werte von Objektattributen entsprechen häufig [[Numeral]]ien oder [[Adjektiv]]en.<ref>{{Literatur |Autor=[[Jörg Bewersdorff]] |Titel=Objektorientierte Programmierung mit JavaScript: Direktstart für Einsteiger |Auflage=2. |Ort=Wiesbaden |Datum=2018 |ISBN=978-3-658-21076-2 |Seiten=30–33 |DOI=10.1007/978-3-658-21077-9_4}}</ref>
Es gibt inzwischen auch Verfeinerungen der objektorientierten Programmierung durch Methoden wie [[Entwurfsmuster]] (englisch ''design patterns''), [[Design By Contract|Design by Contract (''DBC'')]] und grafische [[Modellierungssprache]]n wie [[Unified Modeling Language|UML]].


Es gibt inzwischen auch Verfeinerungen der objektorientierten Programmierung durch Methoden wie [[Entwurfsmuster]], [[Design by contract]] und grafische [[Modellierungssprache]]n wie die [[Unified Modeling Language]].
Einen immer wichtigeren Stellenwert nimmt die [[aspektorientierte Programmierung]] ein, bei dem Aspekte von Eigenschaften und Abhängigkeiten beschrieben werden. Erste Ansätze sind beispielsweise in Java mit [[J2EE]] oder der abstrakten Datenhaltung über Persistenz-Layer sichtbar.

Einen immer höheren Stellenwert nimmt die [[aspektorientierte Programmierung]] ein, bei der Aspekte von Eigenschaften und Abhängigkeiten beschrieben werden. Erste Ansätze sind beispielsweise in Java mit [[Jakarta EE]] oder der abstrakten Datenhaltung über Persistenzschichten sichtbar.

== Grenzen der OOP ==
Das objektorientierte Paradigma hat Vor- und Nachteile je nach Anwendungsfeld in der Softwaretechnik oder konkreter Problemstellung.

=== Abbildung von Problemstellungen auf OOP-Techniken ===
Die OOP kann, wie auch andere Programmierparadigmen, verwendet werden, Probleme aus der realen Welt abzubilden. Als ein typisches Beispiel für Problemstellungen, die sich einer geschickten Modellierung mit OOP-Techniken entziehen, gilt das [[Kreis-Ellipse-Problem]].

=== Objektorientierte Programmiersprachen und natürliche Sprachen ===
Objektorientierte Programmiersprachen können auch unter sprachwissenschaftlichen Aspekten mit natürlichen Sprachen verglichen werden. OO-Programmiersprachen haben ihren Fokus auf den Objekten, welche sprachlich [[Substantiv]]e sind. Die [[Verb]]en (''Aktionen'') sind sekundär, fest an Substantive gebunden (''gekapselt'') und können im Allgemeinen nicht für sich allein stehen. Bei natürlichen Sprachen und z.&nbsp;B. prozeduralen Sprachen existieren Verben eigenständig und unabhängig von den Substantiven (Daten), z.&nbsp;B. als Imperativ und [[Funktion (Programmierung)|Funktion]]. Es kann argumentiert werden, dass diese sprachliche Einschränkung in einigen Anwendungsfällen zu unnötig komplizierten Beschreibungen von Problemen aus der realen Welt mit objektorientierten Sprachen führt.<ref name="executioniKoN">{{cite web| first = Steve| last=Yegge | title = Execution in the Kingdom of Nouns| date=2006-03-30|accessdate=2010-07-03| publisher = steve-yegge.blogspot.com| url=http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html}}</ref><ref name="executioniKoN2">{{cite web| first = Timothy| last= Boronczyk | title = What’s Wrong with OOP| date=2009-06-11|accessdate=2010-07-03| publisher = zaemis.blogspot.com| url=http://zaemis.blogspot.com/2009/06/whats-wrong-with-oop.html}}</ref>

=== OOP und Kontrollfluss ===
Häufig genannte Vorzüge des OOP-Paradigmas sind eine verbesserte [[Wartbarkeit]] und [[Wiederverwendbarkeit]] des statischen Quellcodes.<ref name="realisticcodereuse">{{cite web| first = Scott| last= Ambler| title = A Realistic Look at Object-Oriented Reuse| date=1998-01-01| accessdate=2010-07-04| publisher = drdobbs.com| url=http://www.drdobbs.com/184415594}}</ref> Hierzu werden jedoch die Kontrollflüsse und das dynamische Laufzeitverhalten den Daten/Objekten im Allgemeinen untergeordnet, abstrahiert und weggekapselt. Die [[Kontrollfluss|Kontrollflüsse]] bilden sich nicht mehr für den Entwickler transparent direkt in den Codestrukturen ab (wie z.&nbsp;B. bei [[Prozedurale Programmierung|prozeduralen Sprachen]]), eine Umsetzung in dieser Hinsicht wird dem [[Compiler]] überlassen. Hardware-nähere Sprachen wie das prozedurale [[C (Programmiersprache)|C]] oder [[Assemblersprache|Assembler]] bilden den echten Kontrollfluss und das Laufzeitverhalten transparenter ab.<ref name="flaws">{{cite web| first = Asaf| last= Shelly |title = Flaws of Object Oriented Modeling| date=2008-08-22|accessdate=2010-07-04| publisher = Intel® Software Network| url=http://software.intel.com/en-us/blogs/2008/08/22/flaws-of-object-oriented-modeling/}}</ref> Mit der wachsenden Bedeutung von paralleler Hardware und [[Parallele Programmierung|nebenläufigem Code]] wird jedoch eine bessere Kontrolle und Entwickler-Transparenz der komplexer werdenden Kontrollflüsse immer wichtiger – etwas, das schwierig mit OOP zu erreichen ist.<ref name="multithreadingisaverb">{{cite web|url=http://blogs.techrepublic.com/programming-and-development/?p=518|title=Multithreading is a verb not a noun|date=2007-10-01|accessdate=2010-07-04|last=James|first=Justin|publisher=techrepublic.com}}</ref><ref name="multicore">{{cite web| first = Asaf| last= Shelly| title = HOW TO: Multicore Programming (Multiprocessing) Visual C++ Class Design Guidelines, Member Functions| date=2008-08-22| accessdate=2010-07-04| publisher = support.microsoft.com| url=http://support.microsoft.com/}}</ref>

=== OOP und relationale Datenbanken ===
Ein häufig genannter Bereich, in dem OOP-Techniken als unzureichend gelten, ist die Anbindung von [[Relationale Datenbank|relationalen Datenbanken]]. OOP-Objekte lassen sich nicht direkt in allen Aspekten mit relationalen Datenbanken abbilden. Umgekehrt können über OOP die Stärken und Fähigkeiten von relationalen Datenbanken ebenfalls nicht vollständig ausgeschöpft werden. Die Notwendigkeit, eine Brücke zwischen diesen beiden Konzeptwelten zu schlagen, ist als [[object-relational impedance mismatch]] bekannt. Hierzu existieren viele Ansätze, beispielsweise die häufig verwendete [[objektrelationale Abbildung]], jedoch keine allgemeingültige Lösung ohne den einen oder anderen Nachteil.<ref name="RDMDBobjectmis">{{cite web| first = Ted| last = Neward| title = The Vietnam of Computer Science| date = 2006-06-26| accessdate = 2010-06-02| publisher = Interoperability Happens| url = http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx| archiveurl = https://web.archive.org/web/20060704030226/http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx| archivedate = 2006-07-04| offline = yes| archivebot = 2019-05-04 18:44:01 InternetArchiveBot}}</ref>

=== Laufzeitverhalten und Energieeffizienz ===
Die Effektivität des Laufzeitverhaltens von Anwendungen, die auf OOP-Techniken basieren, wird seit jeher kontrovers diskutiert. Alexander Chatzigeorgiou von der [[Universität Makedonien]] verglich die Laufzeiteffektivität und die Energieeffizienz von typischen Algorithmen ([[Gauß-Jordan-Algorithmus]], [[Trapez-Integration]] und [[Quicksort|QuickSort]]) von [[Prozedurale Programmierung|prozeduralen Ansätzen]] und OOP-Techniken, implementiert als C- und C++-Software. Auf dem verwendeten [[Arm-Architektur|ARM-Prozessor]] ergab sich für drei Algorithmen im Mittel eine um 48,41 % bessere Laufzeiteffektivität mit den prozeduralen C-Algorithmusvarianten. Es ergab sich außerdem eine im Mittel um 95,34 % höhere Leistungsaufnahme der C++-Varianten zu den C-Varianten.<ref name="chatz">{{Cite journal|doi = 10.1016/S0950-5849(02)00205-7| id={{ISSN|0950-5849}}| volume = 45| issue = 4| pages = 195–201| last = Chatzigeorgiou| first = Alexander| title = Performance and power evaluation of C++ object-oriented programming in embedded processors| journal = Information and Software Technology| year = 2003}}</ref> Für Anwendungen auf mobilen Geräten, wie Handys oder MP3-Spielern mit begrenzten Leistungs- und Energiespeichervermögen, sind derartige Unterschiede signifikant, allerdings machen derartige Algorithmen in der Regel nur einen Bruchteil der Applikationen aus.
Als Grund für den Unterschied in Effektivität und Energieeffizienz werden in dem Artikel generelle Abstraktions-Leistungseinbußen und die deutlich größere Anzahl von Zugriffen auf den Arbeitsspeicher durch OOP-Techniken genannt.


== Kritik ==
== Kritik ==

* [[Luca Cardelli]] untersuchte für das [[Digital Equipment Corporation|DEC]] Systems Research Center in dem Paper '[http://doc.cat-v.org/programming/bad_properties_of_OO Bad Engineering Properties of Object-Oriented Languages]' die Effizienz von OOP-Ansätzen mit den Metriken Programmablaufgeschwindigkeit ('Economy of execution'), Compilegeschwindigkeit ('Economy of compilation'), Enwicklungseffizienz für große und kleine Teams ('Economy of small-scale development' und 'Economy of large-scale development') und die Eleganz des Sprachumfangs selbst ('Economy of language features').
=== Modularisierung und andere Prinzipien nicht ausgereift ===
* [[Richard Stallman]] schrieb 1995, "Hinzufügen von OOP zu [[Emacs]] ist ganz klar keine Verbesserung; ich verwendete OOP bei der Arbeit am [[Fenstersystem]] der [[Lisp-Maschine]] und ich stimme dem häufig gehörten 'der überlegene Weg zu programmieren' nicht zu."<ref>{{internetquelle|url=http://groups.google.com/group/comp.emacs.xemacs/browse_thread/thread/d0af257a2837640c/37f251537fafbb03?lnk=st&q=%22Richard+Stallman%22+oop&rnum=5&hl=en#37f251537fafbb03|titel=Mode inheritance, cloning, hooks & OOP (Google Groups Discussion)|zugriff=21. Juni 2008}}</ref>

* Eine Studie von Potok et al. <ref>http://www.csm.ornl.gov/~v8q/Homepage/Papers%20Old/spetep-%20printable.pdf</ref> zeigte keine signifikanten Produktivitätsunterschiede zwischen OOP und Prozeduralen Ansätzen.
Luca Cardelli untersuchte 1996 für das [[Digital Equipment Corporation|DEC]] Systems Research Center die Effizienz von OOP-Ansätzen in dem Artikel ''Bad Engineering Properties of Object-Oriented Languages'' mit den Metriken Programmablaufgeschwindigkeit (''economy of execution''), Kompilationsgeschwindigkeit (''economy of compilation''), Entwicklungseffizienz für große und kleine Teams (''economy of small-scale development'' und ''economy of large-scale development'') und die Eleganz des Sprachumfangs selbst (''economy of language features''). Er kam zu dem Schluss, dass das objektorientierte Sprachdesign noch viel aus dem prozeduralen Sprachendesign lernen müsste, insbesondere im Bereich der guten Modularisierung, der Datenabstraktion und des Polymorphismus, um die hochgesteckten Erwartungen zu erfüllen.<ref name="badproperties">{{cite journal|first=Luca | last=Cardelli| title=Bad Engineering Properties of Object-Oriented Languages| url=http://lucacardelli.name/Papers/BadPropertiesOfOO.html| date=1996| accessdate=2010-04-21| journal = ACM Comput. Surv| volume=28| id={{ISSN|0360-0300}}| pages = 150| doi=10.1145/242224.242415| publisher = ACM}}</ref>
* Nach [[Christopher J. Date]] ist ein kritischer Vergleich zwischen OOP und anderen Technologien, besonders den Relationalen, schwierig, in Ermangelung einer allgemeinen Übereinkunft strikten Definierung über OOP.<ref name="DatePage650">C. J. Date, Introduction to Database Systems, 6th-ed., Page 650</ref>

* [[Alexander Stepanov]] schlug vor, OOP beschreibt eine mathematisch-begrenzte Betrachtungsweise und nannte sie, "fast einen genauso großen Schwindel wie die künstliche Intelligenz ([[Künstliche Intelligenz|KI]])" <ref>http://www.aaai.org/aitopics/html/aieffect.html</ref><ref>[http://www.stlport.org/resources/StepanovUSA.html STLport: An Interview with A. Stepanov<!-- Bot generated title -->]</ref>.
=== Keine Erhöhung der Produktivität gegenüber prozeduralen Ansätzen ===
* [[Edsger W. Dijkstra]]:

<blockquote>... die Gesellschaft lechzt nach [[Schlangenöl]]. Natuerlich hat das Schlangenöl die eindrucksvollsten Namen — sonst würde man es nicht verkaufen können — wie "Strukturierte Analyse und Design", "Software Engineering", "Maturity Models", "Management Information Systems", "Integrated Project Support Environments" "Object Orientation" und "Business Process Re-engineering" (die letzten drei auch bekannt als IPSE, OO and BPR)." — ''[http://www.cs.utexas.edu/users/EWD/transcriptions/EWD11xx/EWD1175.html EWD 1175: The strengths of the academic enterprise]''
Eine Studie von Potok et&nbsp;al. aus dem Jahre 1999 zeigte keine signifikanten Produktivitätsunterschiede zwischen OOP und prozeduralen Ansätzen.<ref name="potok">{{cite journal|url=http://www.csm.ornl.gov/~v8q/Homepage/Papers%20Old/spetep-%20printable.pdf| title=Productivity Analysis of Object-Oriented Software Developed in a Commercial Environment| last=Potok| first=Thomas| coauthors=Mladen Vouk, Andy Rindos| journal=Software – Practice and Experience| volume=29| issue=10| pages=833–847 | date=1999 | accessdate=2010-04-21}}</ref>
</blockquote>

Die Autoren definieren „Produktivität“ in der Einheit „entwickelte/geänderte [[Lines of Code|Programmzeilen]] pro Zeiteinheit“ und untersuchen insbesondere den Einfluss von [[Wiederverwendbarkeit|Code Reuse]] auf diese Metrik. Sie weisen darauf hin, dass eine Konzentration auf Code Reuse unter Umständen der objektorientierten Programmierung nicht gerecht wird, da sie sich noch auf andere Weisen positiv auf die Produktivität auswirken könnte (beispielsweise durch ein einfacheres Design).

Die Autoren führen mehrere Gründe an, weshalb die Ergebnisse ihrer Studie verzerrt sein könnten:

* Es könnte sein, dass als „objektorientiert“ deklarierte Software in Wirklichkeit prozedural entwickelt wurde.
* Sie analysierten nur zwei Generationen objektorientierter Software, was ihrer Aussage nach zu wenig sein könnte.
* Es könnte sein, dass die Qualifikation der verschiedenen Entwicklungsteams unterschiedlich war. Insbesondere wäre es möglich, dass die objektorientierte Software von geringer qualifizierten Teams entwickelt wurde.

Die Autoren vertreten die Meinung, diese Punkte träfen nicht zu.


== Siehe auch ==
== Siehe auch ==
* [[Common Object Request Broker Architecture]] (CORBA)
* [[Handle]]
* [[Distributed Component Object Model]] (DCOM)
* [[Liste objektorientierter Programmiersprachen]]
* [[Prinzipien objektorientierten Designs]]
* [[Reflexion (Programmierung)]]
* [[Reflexion (Programmierung)]]
* [[Schnittstelle (objektorientierte Programmierung)]]
* [[Schnittstelle (Objektorientierung)]]
* [[Trait (Programmierung)]]
* [[Liskovsches Substitutionsprinzip]]
* [[CORBA]]
* [[DCOM]]
* [[Geschichte der Programmiersprachen]]: Denkweise und Begriffe der Objektorientierung zeigten sich zuerst in [[Simula]] – einer Sprache für Simulationszwecke.


== Literatur ==
== Literatur ==
* {{Literatur
* Bernhard Lahres, Gregor Raýman: ''Praxisbuch Objektorientierung'', Galileo Computing, ISBN 3-89842-624-6, Frei verfügbar auf der [http://www.galileocomputing.de/openbook/oo/ Seite] des Verlags
|Autor=Bernhard Lahres, Gregor Raýman
* Harold Abelson, Gerald Jay Sussman, Julie Sussman: ''Structure and Interpretation of Computer Programs.'' The MIT Press, ISBN 0-262-01153-0
|Titel=Praxisbuch Objektorientierung
* Heide Balzert: ''Objektorientierte Systemanalyse'', Spektrum Akademischer Verlag, Heidelberg 1996, ISBN 3-8274-0111-9
|Verlag=Galileo Computing
* [[Grady Booch]]: ''Object-Oriented Analysis and Design with Applications.'' Addison-Wesley, ISBN 0-8053-5340-2
|Datum=
* Peter Eeles, Oliver Sims: ''Building Business Objects.'' John Wiley & Sons, ISBN 0-471-19176-0
|ISBN=3-89842-624-6
* [[Erich Gamma]], Richard Helm, Ralph Johnson, John Vlissides: ''Design Patterns: Elements of Reusable Object Oriented Software.'' Addison-Wesley, ISBN 0-201-63361-2
|Online=Frei verfügbar auf der [http://www.galileocomputing.de/openbook/oo/ Verlags-Website]}}
* Paul Harmon, William Morrissey: ''The Object Technology Casebook. Lessons from Award-Winning Business Applications.'' John Wiley & Sons, ISBN 0-471-14717-6
* {{Literatur
* [[Ivar Jacobson]]: ''Object-Oriented Software Engineering: A Use-Case-Driven Approach.'' Addison-Wesley, ISBN 0-201-54435-0
|Autor=Harold Abelson, Gerald Jay Sussman, Julie Sussman
* [[Bertrand Meyer]]: ''Object-Oriented Software Construction.'' Prentice Hall, ISBN 0-13-629155-4
|Titel=Structure and Interpretation of Computer Programs
* [[Bernd Oestereich]]<!-- sic! -->: ''Objektorientierte Programmierung mit der Unified Modeling Language.'' Oldenbourg, ISBN 3-486-24319-5
|Verlag=The MIT Press
* [[James Rumbaugh]], Michael Blaha, William Premerlani, Frederick Eddy, William Lorensen: ''Object-Oriented Modeling and Design.'' Prentice Hall, ISBN 0-13-629841-9
|Datum=
* David A. Taylor: ''Object-Oriented Information Systems. Planning and Implementation.'' John Wiley & Sons, ISBN 0-471-54364-0
|ISBN=0-262-01153-0}}
* Walter Sonnenberg: "Adaptierbarkeit von Programmen mittels Konzeptklassen", Dissertation Universität Karlsruhe 1979
* {{Literatur

|Autor=Heide Balzert
== Referenzen ==
|Titel=Objektorientierte Systemanalyse
<references/>
|Verlag=Spektrum Akademischer Verlag
|Ort=Heidelberg
|Datum=1996
|ISBN=3-8274-0111-9}}
* {{Literatur
|Autor=[[Grady Booch]]
|Titel=Object-Oriented Analysis and Design with Applications
|Verlag=Addison-Wesley
|Datum=
|ISBN=0-8053-5340-2}}
* {{Literatur
|Autor=Peter Eeles, Oliver Sims
|Titel=Building Business Objects
|Verlag=John Wiley & Sons
|Datum=
|ISBN=0-471-19176-0}}
* {{Literatur
|Autor=[[Erich Gamma]], Richard Helm, Ralph Johnson, John Vlissides
|Titel=Design Patterns: Elements of Reusable Object Oriented Software
|Verlag=Addison-Wesley
|Datum=
|ISBN=0-201-63361-2}}
* {{Literatur
|Autor=Paul Harmon, William Morrissey
|Titel=The Object Technology Casebook. Lessons from Award-Winning Business Applications
|Verlag=John Wiley & Sons
|Datum=
|ISBN=0-471-14717-6}}
* {{Literatur
|Autor=[[Ivar Jacobson]]
|Titel=Object-Oriented Software Engineering: A Use-Case-Driven Approach
|Verlag=Addison-Wesley
|Datum=
|ISBN=0-201-54435-0}}
* {{Literatur
|Autor=[[Bertrand Meyer]]
|Titel=Object-Oriented Software Construction
|Verlag=Prentice Hall
|Datum=
|ISBN=0-13-629155-4}}
* {{Literatur
|Autor=[[Bernd Oestereich]]<!-- sic! -->
|Titel=Objektorientierte Programmierung mit der Unified Modeling Language
|Verlag=Oldenbourg
|Datum=
|ISBN=3-486-24319-5}}
* {{Literatur
|Autor=[[James Rumbaugh]], Michael Blaha, William Premerlani, Frederick Eddy, William Lorensen
|Titel=Object-Oriented Modeling and Design
|Verlag=Prentice Hall
|Datum=
|ISBN=0-13-629841-9}}


== Weblinks ==
== Weblinks ==
* [http://www.galileocomputing.de/openbook/oo/ Praxisbuch Objektorientierung (openbook)]
* [https://openbook.rheinwerk-verlag.de/oop/ Praxisbuch Objektorientierung (openbook)]
* [http://www.galileocomputing.de/openbook/javainsel7/javainsel_03_001.htm#mjf1c83f7d9f2913393ae95bd1dfa81bde Objektorientiertes Programmieren in Java (openbook)]
* [https://openbook.rheinwerk-verlag.de/javainsel/03_001.html Objektorientiertes Programmieren in Java (openbook)]
* [http://www.oszhdl.be.schule.de/gymnasium/faecher/informatik/ooa-ood/index.htm Aufgaben der OOP]
* [http://www.oszhdl.be.schule.de/gymnasium/faecher/informatik/ooa-ood/index.htm Aufgaben der OOP]
* [http://www.b-nm.at/objektorientierte-programmierung/ Flash ActionScript OOP – Einführung in die objektorientierte Programmierung]
* [http://www.complang.tuwien.ac.at/franz/objektorientiert/skript07-1seitig.pdf Skriptum zu OOP, TU Wien (pdf)]
* [http://www.elektronikpraxis.vogel.de/themen/embeddedsoftwareengineering/implementierung/articles/252633/ Fachwissen auf ELEKTRONIKPRAXIS ONLINE] Objektorientierte Programmierung mit C
* [http://www.b-nm.at/objektorientierte-programmierung/ Flash ActionScript OOP - Einführung in die objektorientierte Programmierung]
* [http://www.oopconference.com Die Fachmesse zum Thema OOP]
[[Kategorie:Programmierparadigma]]
[[Kategorie:Objektorientierte Programmierung| ]]


== Einzelnachweise ==
<references>
<ref name="ghosh">
{{Literatur
|Autor=Debasish Ghosh
|Titel=Functional and Reactive Domain Modeling
|Verlag=Manning
|Datum=2016
|ISBN=978-1-61729-224-8
|Sprache=en
|Umfang=325}}
</ref>
</references>


{{Normdaten|TYP=s|GND=4233947-9|LCCN=|NDL=|VIAF=}}
{{Link FA|vi}}

<!-- Kategorien -->
[[Kategorie:Programmierparadigma]]
[[Kategorie:Objektorientierte Programmierung| ]]


<!-- Interwikies -->
[[af:Objekgeoriënteerde programmering]]
[[ar:برمجة كائنية التوجه]]
[[be-x-old:Аб'ектна-арыентаванае праграмаваньне]]
[[bg:Обектно-ориентирано програмиране]]
[[bs:Objektno orijentisano programiranje]]
[[ca:Programació orientada a objectes]]
[[cs:Objektově orientované programování]]
[[da:Objektorienteret programmering]]
[[el:Αντικειμενοστρεφής προγραμματισμός]]
[[en:Object-oriented programming]]
[[eo:Objektema programado]]
[[es:Programación orientada a objetos]]
[[eu:Objektuei orientatutako programazio]]
[[fa:برنامه‌نویسی شیءگرا]]
[[fi:Olio-ohjelmointi]]
[[fr:Programmation orientée objet]]
[[gl:Programación orientada a obxectos]]
[[he:תכנות מונחה עצמים]]
[[hr:Objektno orijentirano programiranje]]
[[hu:Objektumorientált programozás]]
[[id:Pemrograman berorientasi objek]]
[[io:Objektema programado]]
[[is:Hlutbundin forritun]]
[[it:Programmazione orientata agli oggetti]]
[[ja:オブジェクト指向]]
[[ka:ობიექტზე ორიენტირებული პროგრამირება]]
[[ko:객체 지향 프로그래밍]]
[[lt:Objektinis programavimas]]
[[ms:Pengaturcaraan berorientasi objek]]
[[nl:Objectgeoriënteerd]]
[[no:Objektorientert programmering]]
[[pl:Programowanie obiektowe]]
[[pt:Orientação a objetos]]
[[ro:Programare orientată pe obiecte]]
[[ru:Объектно-ориентированное программирование]]
[[sh:Objektno orijentisano programiranje]]
[[simple:Object-oriented programming]]
[[sk:Objektové programovanie]]
[[sr:Објектно-оријентисано програмирање]]
[[sv:Objektorienterad programmering]]
[[ta:பொருள் நோக்கு நிரலாக்கம்]]
[[th:การเขียนโปรแกรมเชิงวัตถุ]]
[[tr:Nesne Yönelimli Programlama]]
[[uk:Об'єктно-орієнтоване програмування]]
[[vi:Lập trình hướng đối tượng]]
[[wuu:面向对象程式编制]]
[[zh:面向对象程序设计]]

Aktuelle Version vom 24. März 2025, 16:03 Uhr

Die objektorientierte Programmierung (kurz OOP) ist ein auf dem Konzept der Objektorientierung basierendes Programmierparadigma. Die Grundidee besteht darin, die Architektur einer Software an den Grundstrukturen desjenigen Bereichs der Wirklichkeit auszurichten, der die gegebene Anwendung betrifft. Ein Modell dieser Strukturen wird in der Entwurfsphase aufgestellt. Es enthält Informationen über die auftretenden Objekte und deren Abstraktionen, ihre Typen. Die Umsetzung dieser Denkweise erfordert die Einführung verschiedener Konzepte, insbesondere Klassen, Vererbung, Polymorphie und spätes Binden (dynamisches Binden).

Die Definition, was objektorientierte Programmierung ist und im Kern ausmacht, variiert und ist auch Veränderungen unterworfen.

Alan Kay, der Erfinder der Programmiersprache Smalltalk und des Begriffs „object oriented“, definierte ihn im Kontext von Smalltalk folgendermaßen:

“1. Everything is an object, 2. Objects communicate by sending and receiving messages (in terms of objects), 3. Objects have their own memory (in terms of objects), 4. Every object is an instance of a class (which must be an object), 5. The class holds the shared behavior for its instances (in the form of objects in a program list), 6. To eval a program list, control is passed to the first object and the remainder is treated as its message”

„1. Alles ist ein Objekt, 2. Objekte kommunizieren durch das Senden und Empfangen von Nachrichten (welche aus Objekten bestehen), 3. Objekte haben ihren eigenen Speicher (strukturiert als Objekte), 4. Jedes Objekt ist die Instanz einer Klasse (welche ein Objekt sein muss), 5. Die Klasse beinhaltet das Verhalten aller ihrer Instanzen (in der Form von Objekten in einer Programmliste), 6. Um eine Programmliste auszuführen, wird die Ausführungskontrolle dem ersten Objekt gegeben und das Verbleibende als dessen Nachricht behandelt“

Alan Kay: The Early History of Smalltalk (1993)[1]

Alan Kay drückte später seine Unzufriedenheit über den von ihm gewählten Begriff „Objektorientierung“ aus, weil dieser aus seiner Sicht den Kernaspekt des Messaging zu kurz kommen ließe.[2]

2003 gab Alan Kay folgende Definition von objektorientierter Programmierung:

“OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.”

„OOP bedeutet für mich nur Messaging, lokales Beibehalten und Schützen und Verbergen des Prozesszustands sowie spätestmögliche Bindung aller Dinge.“

Alan Kay: Antwort auf eine Anfrage, 2003[3]

Der ISO/IEC-2382-15-Standard von 1999 definiert den Begriff object-oriented dagegen wie folgt:

“Pertaining to a technique or a programming language that supports objects, classes, and inheritance.”

„Bezieht sich auf eine Technik oder Programmiersprache, welche Objekte, Klassen und Vererbung unterstützt.“

ISO/IEC 2382-15[4]

Die ISO-Definition gilt inzwischen im Allgemeinen als zu vereinfachend, da auch klassenlose objektorientierte Sprachen existieren und auch der Vererbung inzwischen weniger Bedeutung beigemessen wird als noch in den 1990ern.

Im Vergleich mit anderen Programmiermethoden verwendet die objektorientierte Programmierung neue, andere Begriffe.

Die einzelnen Bausteine, aus denen ein objektorientiertes Programm während seiner Abarbeitung besteht, werden als Objekte bezeichnet. Die Objekte werden dabei in der Regel auf Basis der folgenden Konzepte entwickelt:

Abstraktion
Jedes Objekt im System kann als ein abstraktes Modell eines Akteurs betrachtet werden, der Aufträge erledigen, seinen Zustand berichten und ändern und mit den anderen Objekten im System kommunizieren kann, ohne offenlegen zu müssen, wie diese Fähigkeiten implementiert sind (vgl. abstrakter Datentyp). Solche Abstraktionen sind entweder Klassen (in der klassenbasierten Objektorientierung) oder Prototypen (in der prototypbasierten Programmierung).
Klasse
Die Datenstruktur eines Objekts wird durch die Attribute (auch Eigenschaften) seiner Klassendefinition festgelegt. Das Verhalten des Objekts wird von den Methoden der Klasse bestimmt. Klassen können von anderen Klassen abgeleitet werden (Vererbung). Dabei erbt die Klasse die Datenstruktur (Attribute) und die Methoden von der vererbenden Klasse (Basisklasse).
Prototyp
Objekte werden durch das Klonen bereits existierender Objekte erzeugt und können anderen Objekten als Prototypen dienen und damit ihre eigenen Methoden zur Wiederverwendung zur Verfügung stellen, wobei die neuen Objekte nur die Unterschiede zu ihrem Prototyp definieren müssen. Änderungen am Prototyp werden dynamisch auch an den von ihm abgeleiteten Objekten wirksam.
Datenkapselung
Als Datenkapselung bezeichnet man in der Programmierung das Verbergen von Implementierungsdetails. Auf die interne Datenstruktur kann nicht direkt zugegriffen werden, sondern nur über definierte Schnittstellen. Objekte können den internen Zustand anderer Objekte nicht in unerwarteter Weise lesen oder ändern. Ein Objekt hat eine Schnittstelle, die darüber bestimmt, auf welche Weise mit dem Objekt interagiert werden kann. Dies verhindert das Umgehen von Invarianten des Programms.
Feedback
Verschiedene Objekte kommunizieren über einen Nachricht-Antwort-Mechanismus, der zu Veränderungen in den Objekten führt und neue Nachrichtenaufrufe erzeugt. Dafür steht die Kopplung als Index für den Grad des Feedbacks.
Persistenz
Objektvariablen existieren, solange die Objekte vorhanden sind, und „verfallen“ nicht nach Abarbeitung einer Methode.
Polymorphie (dt. Mehrgestalt)
Fähigkeit eines Bezeichners, abhängig von seiner Verwendung unterschiedliche Datentypen anzunehmen. Verschiedene Objekte können auf die gleiche Nachricht unterschiedlich reagieren. Wird die Art der Reaktion auf die Nachricht erst zur Laufzeit aufgelöst, wird dies auch späte Bindung genannt.
Vererbung
Vererbung heißt vereinfacht, dass eine abgeleitete Klasse die Methoden und Attribute der Basisklasse ebenfalls besitzt, also „erbt“. Somit kann die abgeleitete Klasse auch darauf zugreifen. Neue Arten von Objekten können auf der Basis bereits vorhandener Objektdefinitionen festgelegt werden. Es können neue Bestandteile hinzugenommen werden oder vorhandene überlagert werden.
Objekt (von dt. Ding / Sache)
Ein Element, welches Funktionen, Methoden, Prozeduren, einen inneren Zustand, oder mehrere dieser Dinge besitzt.
Entität
Ein Objekt mit einer eindeutigen Identität zur Speicherung von Daten. Beispiel: Eine Person mit den Daten Adresse, Telefonnummer oder Name. Die Daten können geändert werden, ohne dass die Person ihre Identität verliert. Eine Person ist also eine Entität.[5]
Wertobjekt
Ein Objekt, welches über seinen Wert definiert wird. Eine Telefonnummer, welche sich ändert, ist also eine andere Telefonnummer. Gleichartig ist eine Adresse, bei der sich lediglich die Hausnummer ändert, eine andere Adresse, selbst wenn alle anderen Daten gleich bleiben. Somit stellt eine Telefonnummer und eine Adresse keine Entität dar, sondern ein Wertobjekt.[5]
Eigenschaft
Ein Bestandteil des Zustands eines Objekts. Hierbei kann es sich um eine Entität oder ein Wertobjekt handeln.
Dienst
Ein Objekt, welches ein Verhalten (z. B. eine Geschäftslogik) in Form von Prozeduren, Funktionen oder Methoden implementiert. Der Dienst verwendet hierbei Entitäten oder Wertobjekte.[5]
Prozedur
Verändert den Zustand eines Objektes, ohne einen Rückgabewert zu liefern. Eine Prozedur kann andere Objekte als Parameter entgegennehmen.
Funktion
Ordnet einer gegebenen Eingabe einen bestimmten Rückgabewert zu. Eine Funktion zeichnet sich insbesondere dadurch aus, dass sie nicht den Zustand eines Objekts verändert.[5]
Methode
Verändert den Zustand eines Objekts und liefert zudem einen Rückgabewert. Eine Methode kann andere Objekte als Parameter entgegennehmen.
Modul
Eine zusammengefasste Gruppe von Objekten.

Zur besseren Verwaltung gleichartiger Objekte bedienen sich die meisten Programmiersprachen des Konzeptes der Klasse. Klassen sind Vorlagen, aus denen Instanzen genannte Objekte zur Laufzeit erzeugt werden. Im Programm werden nicht einzelne Objekte, sondern eine Klasse gleichartiger Objekte definiert. Existieren in der gewählten Programmiersprache keine Klassen oder werden diese explizit unterdrückt, so spricht man zur Unterscheidung oft auch von objektbasierter Programmierung.

Man kann sich die Erzeugung von Objekten aus einer Klasse vorstellen wie das Fertigen von Autos aus dem Konstruktionsplan eines bestimmten Fahrzeugtyps. Klassen sind die Konstruktionspläne für Objekte.

Die Klasse entspricht in etwa einem komplexen Datentyp wie in der prozeduralen Programmierung, geht aber darüber hinaus: Sie legt nicht nur die Datentypen fest, aus denen die mit Hilfe der Klassen erzeugten Objekte bestehen, sie definiert zudem die Algorithmen, die auf diesen Daten operieren. Während also zur Laufzeit eines Programms einzelne Objekte miteinander interagieren, wird das Grundmuster dieser Interaktion durch die Definition der einzelnen Klassen festgelegt.

Beispiel

Die Klasse „Auto“ legt fest, dass das Auto vier Reifen einer bestimmten Größe, fünf farbige Türen, einen Motor mit einer bestimmten Leistung und fünf Sitze mit wählbaren Bezügen hat.

  1. Das Objekt „Auto1“ hat vier Reifen mit dem Durchmesser 19 Zoll und der Breite 255 mm, fünf rote Türen, einen Motor mit 150 kW und fünf Ledersitze.
  2. Das Objekt „Auto2“ hat vier Reifen mit dem Durchmesser 19 Zoll und der Breite 255 mm, fünf rote Türen, einen Motor mit 150 kW und fünf Ledersitze.
  3. Ein weiteres Objekt „Auto3“ hat vier Reifen mit dem Durchmesser 16 Zoll und der Breite 205 mm, fünf blaue Türen, einen Motor mit 90 kW und fünf Sitze mit Textilbezug.

Es handelt sich um drei Objekte; zwei davon haben gleiche Attribute. Alle drei sind aber Ausprägungen (Instanzen) der Klasse „Auto“.

Methoden bei Klassen

[Bearbeiten | Quelltext bearbeiten]

Die einer Klasse von Objekten zugeordneten Algorithmen bezeichnet man auch als Methoden.

Häufig wird der Begriff Methode synonym zu den Begriffen Funktion oder Prozedur aus anderen Programmiersprachen gebraucht. Die Funktion oder Prozedur ist jedoch eher als Implementierung einer Methode zu betrachten. Im täglichen Sprachgebrauch sagt man auch „Objekt A ruft Methode m von Objekt B auf.“

Eine besondere Rolle spielen Methoden für die Kapselung, insbesondere die Zugriffsfunktionen. Spezielle Methoden zur Erzeugung und Zerstörung von Objekten heißen Konstruktoren beziehungsweise Destruktoren.

Methoden können Parameter erhalten, die beim Aufruf übergeben werden müssen, und einen Rückgabewert besitzen, den sie am Ende dem Aufrufer zurückgeben. Beispielsweise hat die Methode addiere die Parameter Zahl 1 und Zahl 2 und gibt als Rückgabewert die Summe der Zahlen zurück.

In vielen objektorientierten Programmiersprachen lässt sich festlegen, welche Objekte eine bestimmte Methode aufrufen dürfen. So wird meist zwischen folgenden vier Zugriffsebenen unterschieden, die bereits zur Übersetzungszeit geprüft werden.

  1. Öffentliche (public) Methoden dürfen von allen Klassen aufgerufen werden.
  2. Geschützte (protected) Methoden dürfen von Klassen im selben Paket und abgeleiteten Klassen aufgerufen werden.
  3. Methoden auf Paket-Ebene können nur von Klassen aufgerufen werden, die sich im selben Paket befinden – diese Zugriffsebene ist nur bei Programmiersprachen vorhanden, die Pakete bzw. Namespaces kennen.
  4. Private Methoden können nur von anderen Methoden derselben Klasse aufgerufen werden.

Analog zu diesen vier Zugriffsebenen sind in der Unified Modeling Language (UML) vier Sichtbarkeiten für Operationen definiert.

Objekte (Fenster, Schaltflächen, Laufleisten, Menüs, …) besitzen verschiedene Eigenschaften (Farbe, Größe, Ausrichtung, …). Diese Eigenschaften eines Objekts heißen Attribute.

Unter bestimmten Voraussetzungen können Algorithmen, die auf den Schnittstellen eines bestimmten Objekttyps operieren, auch mit Objekten davon abgeleiteter Klassen zusammenarbeiten.

Geschieht dies so, dass durch Vererbung überschriebene Methoden an Stelle der Methoden der vererbenden Klasse ausgeführt werden, dann spricht man von Polymorphie. Polymorphie stellt damit eine Möglichkeit dar, einer durch ähnliche Objekte ausgeführten Aktion einen Namen zu geben, wobei jede Klasse die Aktion in einer für das Objekt geeigneten Weise implementiert.

Diese Technik, das sogenannte Overriding, implementiert aber keine universelle Polymorphie, sondern nur die sogenannte Ad-hoc-Polymorphie.

Die Begriffe der objektorientierten Programmierung haben teilweise unterschiedliche Namen. Folgende Bezeichnungen werden synonym verwendet:

Bezeichnungen in der objektorientierten Programmierung
Deutscher Begriff Alternativen Englisch
Abgeleitete Klasse Kindklasse, Unterklasse, Subklasse child class, subclass
Attribut Objektvariable, Instanzvariable, Datenelement, Eigenschaft member, property
Basisklasse Elternklasse, Oberklasse, Superklasse parent class, superclass
Objekt Exemplar, Instanz instance
Methode Elementfunktion method
Statische Methode Klassenfunktion, Metafunktion static method

Objektorientierte Programmiersprachen

[Bearbeiten | Quelltext bearbeiten]

Objektorientierte Programmiersprachen unterstützen die Programmstrukturierung mit einem speziellen Datentyp – dem Objekt, der die Objektorientierung ermöglicht. Die rein objektorientierten Sprachen, wie Smalltalk, folgen dem Prinzip: „Alles ist ein Objekt.“ Auch elementare Typen wie Ganzzahlen werden dabei durch Objekte repräsentiert – selbst Klassen sind hier Objekte, die wiederum Exemplare von Metaklassen sind. Die verbreiteten objektorientierten Programmiersprachen, unter anderem C#, C++ und Java, handhaben das Objektprinzip nicht alle so streng. Bei ihnen sind elementare Datentypen keine vollwertigen Objekte, da sie auf Methoden und Struktur verzichten müssen. Sie stellen dem Entwickler auch frei, wie stark er die Kapselung objektinterner Daten einhält.

Die erste bekannte objektorientierte Programmiersprache war Simula-67. Später wurden die Prinzipien der Kapselung in einer Klassenhierarchie dann in Smalltalk weiter ausgebaut. Mit dem ANSI/X3.226-1994-Standard wurde Common Lisp/CLOS zur ersten standardisierten objektorientierten Programmiersprache und mit ISO 8652:1995 wurde Ada 95 als erste nach dem internationalen ISO-Standard normierte objektorientierte Programmiersprache festgelegt.

Gängige moderne Programmiersprachen (z. B. Python) unterstützen sowohl die OOP als auch den prozeduralen Ansatz, der in den klassischen Programmiersprachen der 1970er- und 1980er-Jahre wie Pascal, Fortran oder C vorherrschte. Im Gegensatz dazu setzt Smalltalk, die älteste heute noch bedeutsame OOP-Sprache, auf kompromisslose Objektorientierung und hatte damit starken Einfluss auf die Entwicklung populärer OOP-Sprachen, ohne selber deren Verbreitung zu erreichen, weil keine kostengünstig allgemein verfügbare Implementierung angeboten wurde. Auch wenn der Durchbruch der OOP erst in den 1990er-Jahren stattfand, wurde die objektorientierte Programmierung bereits Ende der 1960er Jahre mit Simula-67 als Lösungsansatz für die Modularisierung und die Wiederverwendbarkeit von Code entwickelt.

Objekt-Konzepte in Programmiersprachen

[Bearbeiten | Quelltext bearbeiten]

In einigen objektorientierten Programmiersprachen wie Go, NewtonScript und Self wird auf die Deklaration von Klassen gänzlich verzichtet. Stattdessen werden neue Objekte von bestehenden Objekten, den sogenannten Prototypen, abgeleitet. Die Attribute und Methoden des Prototyps kommen immer dann zum Einsatz, wenn sie im abgeleiteten Objekt nicht explizit überschrieben wurden. Dies ist vor allem für die Entwicklung kleinerer Programme von Vorteil, da es einfacher und zeitsparend ist.

In manchen Programmiersprachen, beispielsweise in Objective-C, gibt es zu jeder Klasse ein bestimmtes Objekt (Klassenobjekt), das die Klasse zur Laufzeit repräsentiert; dieses Klassenobjekt ist dann auch für die Erzeugung von Objekten der Klasse und den Aufruf der korrekten Methode zuständig.

Klassen werden in der Regel in Form von Klassenbibliotheken zusammengefasst, die häufig thematisch organisiert sind. So können Anwender einer objektorientierten Programmiersprache Klassenbibliotheken erwerben, die zum Beispiel den Zugriff auf Datenbanken ermöglichen.

Entwurf von Objekt-Konzepten

[Bearbeiten | Quelltext bearbeiten]

Die Wortarten einer sprachlichen Problembeschreibung können hilfreiche Hinweise dafür geben, eine Objekt-basierte Modellierung zu konzipieren (sogenannte Verb-Substantiv-Methode).[6] Dabei werden Objekte und Klassen in der Regel sprachlich durch Substantive beschrieben, wobei Eigennamen auf Objekte und Appellative wie Haus und Tier auf Klassen hindeuten.[7] Verben stehen in der Regel für Methoden, wobei Adverbien und Substantive ergänzende Charakterisierungen der Methoden geben können. Die Werte von Objektattributen entsprechen häufig Numeralien oder Adjektiven.[8]

Es gibt inzwischen auch Verfeinerungen der objektorientierten Programmierung durch Methoden wie Entwurfsmuster, Design by contract und grafische Modellierungssprachen wie die Unified Modeling Language.

Einen immer höheren Stellenwert nimmt die aspektorientierte Programmierung ein, bei der Aspekte von Eigenschaften und Abhängigkeiten beschrieben werden. Erste Ansätze sind beispielsweise in Java mit Jakarta EE oder der abstrakten Datenhaltung über Persistenzschichten sichtbar.

Grenzen der OOP

[Bearbeiten | Quelltext bearbeiten]

Das objektorientierte Paradigma hat Vor- und Nachteile je nach Anwendungsfeld in der Softwaretechnik oder konkreter Problemstellung.

Abbildung von Problemstellungen auf OOP-Techniken

[Bearbeiten | Quelltext bearbeiten]

Die OOP kann, wie auch andere Programmierparadigmen, verwendet werden, Probleme aus der realen Welt abzubilden. Als ein typisches Beispiel für Problemstellungen, die sich einer geschickten Modellierung mit OOP-Techniken entziehen, gilt das Kreis-Ellipse-Problem.

Objektorientierte Programmiersprachen und natürliche Sprachen

[Bearbeiten | Quelltext bearbeiten]

Objektorientierte Programmiersprachen können auch unter sprachwissenschaftlichen Aspekten mit natürlichen Sprachen verglichen werden. OO-Programmiersprachen haben ihren Fokus auf den Objekten, welche sprachlich Substantive sind. Die Verben (Aktionen) sind sekundär, fest an Substantive gebunden (gekapselt) und können im Allgemeinen nicht für sich allein stehen. Bei natürlichen Sprachen und z. B. prozeduralen Sprachen existieren Verben eigenständig und unabhängig von den Substantiven (Daten), z. B. als Imperativ und Funktion. Es kann argumentiert werden, dass diese sprachliche Einschränkung in einigen Anwendungsfällen zu unnötig komplizierten Beschreibungen von Problemen aus der realen Welt mit objektorientierten Sprachen führt.[9][10]

OOP und Kontrollfluss

[Bearbeiten | Quelltext bearbeiten]

Häufig genannte Vorzüge des OOP-Paradigmas sind eine verbesserte Wartbarkeit und Wiederverwendbarkeit des statischen Quellcodes.[11] Hierzu werden jedoch die Kontrollflüsse und das dynamische Laufzeitverhalten den Daten/Objekten im Allgemeinen untergeordnet, abstrahiert und weggekapselt. Die Kontrollflüsse bilden sich nicht mehr für den Entwickler transparent direkt in den Codestrukturen ab (wie z. B. bei prozeduralen Sprachen), eine Umsetzung in dieser Hinsicht wird dem Compiler überlassen. Hardware-nähere Sprachen wie das prozedurale C oder Assembler bilden den echten Kontrollfluss und das Laufzeitverhalten transparenter ab.[12] Mit der wachsenden Bedeutung von paralleler Hardware und nebenläufigem Code wird jedoch eine bessere Kontrolle und Entwickler-Transparenz der komplexer werdenden Kontrollflüsse immer wichtiger – etwas, das schwierig mit OOP zu erreichen ist.[13][14]

OOP und relationale Datenbanken

[Bearbeiten | Quelltext bearbeiten]

Ein häufig genannter Bereich, in dem OOP-Techniken als unzureichend gelten, ist die Anbindung von relationalen Datenbanken. OOP-Objekte lassen sich nicht direkt in allen Aspekten mit relationalen Datenbanken abbilden. Umgekehrt können über OOP die Stärken und Fähigkeiten von relationalen Datenbanken ebenfalls nicht vollständig ausgeschöpft werden. Die Notwendigkeit, eine Brücke zwischen diesen beiden Konzeptwelten zu schlagen, ist als object-relational impedance mismatch bekannt. Hierzu existieren viele Ansätze, beispielsweise die häufig verwendete objektrelationale Abbildung, jedoch keine allgemeingültige Lösung ohne den einen oder anderen Nachteil.[15]

Laufzeitverhalten und Energieeffizienz

[Bearbeiten | Quelltext bearbeiten]

Die Effektivität des Laufzeitverhaltens von Anwendungen, die auf OOP-Techniken basieren, wird seit jeher kontrovers diskutiert. Alexander Chatzigeorgiou von der Universität Makedonien verglich die Laufzeiteffektivität und die Energieeffizienz von typischen Algorithmen (Gauß-Jordan-Algorithmus, Trapez-Integration und QuickSort) von prozeduralen Ansätzen und OOP-Techniken, implementiert als C- und C++-Software. Auf dem verwendeten ARM-Prozessor ergab sich für drei Algorithmen im Mittel eine um 48,41 % bessere Laufzeiteffektivität mit den prozeduralen C-Algorithmusvarianten. Es ergab sich außerdem eine im Mittel um 95,34 % höhere Leistungsaufnahme der C++-Varianten zu den C-Varianten.[16] Für Anwendungen auf mobilen Geräten, wie Handys oder MP3-Spielern mit begrenzten Leistungs- und Energiespeichervermögen, sind derartige Unterschiede signifikant, allerdings machen derartige Algorithmen in der Regel nur einen Bruchteil der Applikationen aus. Als Grund für den Unterschied in Effektivität und Energieeffizienz werden in dem Artikel generelle Abstraktions-Leistungseinbußen und die deutlich größere Anzahl von Zugriffen auf den Arbeitsspeicher durch OOP-Techniken genannt.

Modularisierung und andere Prinzipien nicht ausgereift

[Bearbeiten | Quelltext bearbeiten]

Luca Cardelli untersuchte 1996 für das DEC Systems Research Center die Effizienz von OOP-Ansätzen in dem Artikel Bad Engineering Properties of Object-Oriented Languages mit den Metriken Programmablaufgeschwindigkeit (economy of execution), Kompilationsgeschwindigkeit (economy of compilation), Entwicklungseffizienz für große und kleine Teams (economy of small-scale development und economy of large-scale development) und die Eleganz des Sprachumfangs selbst (economy of language features). Er kam zu dem Schluss, dass das objektorientierte Sprachdesign noch viel aus dem prozeduralen Sprachendesign lernen müsste, insbesondere im Bereich der guten Modularisierung, der Datenabstraktion und des Polymorphismus, um die hochgesteckten Erwartungen zu erfüllen.[17]

Keine Erhöhung der Produktivität gegenüber prozeduralen Ansätzen

[Bearbeiten | Quelltext bearbeiten]

Eine Studie von Potok et al. aus dem Jahre 1999 zeigte keine signifikanten Produktivitätsunterschiede zwischen OOP und prozeduralen Ansätzen.[18]

Die Autoren definieren „Produktivität“ in der Einheit „entwickelte/geänderte Programmzeilen pro Zeiteinheit“ und untersuchen insbesondere den Einfluss von Code Reuse auf diese Metrik. Sie weisen darauf hin, dass eine Konzentration auf Code Reuse unter Umständen der objektorientierten Programmierung nicht gerecht wird, da sie sich noch auf andere Weisen positiv auf die Produktivität auswirken könnte (beispielsweise durch ein einfacheres Design).

Die Autoren führen mehrere Gründe an, weshalb die Ergebnisse ihrer Studie verzerrt sein könnten:

  • Es könnte sein, dass als „objektorientiert“ deklarierte Software in Wirklichkeit prozedural entwickelt wurde.
  • Sie analysierten nur zwei Generationen objektorientierter Software, was ihrer Aussage nach zu wenig sein könnte.
  • Es könnte sein, dass die Qualifikation der verschiedenen Entwicklungsteams unterschiedlich war. Insbesondere wäre es möglich, dass die objektorientierte Software von geringer qualifizierten Teams entwickelt wurde.

Die Autoren vertreten die Meinung, diese Punkte träfen nicht zu.

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  1. Alan Kay: The Early History of Smalltalk. In: The second ACM SIGPLAN conference on History of programming languages. ACM, 1. März 1993, S. 78, abgerufen am 4. Juni 2012 (englisch, 10.1145/155360.155364). (smalltalk.org (Memento des Originals vom 5. Februar 2012 im Internet Archive; PDF)  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/www.smalltalk.org)
  2. Alan Kay On Messaging. 10. Oktober 1998, abgerufen am 4. Juni 2012: „[…] Smalltalk is not only NOT its syntax or the class library, it is not even about classes. I’m sorry that I long ago coined the term „objects“ for this topic because it gets many people to focus on the lesser idea. The big idea is „messaging“ […]“
  3. Stefan Ram: Dr. Alan Kay on the Meaning of Object-Oriented Programming. fu-berlin.de, 23. Juli 2003, abgerufen am 4. Juni 2012 (englisch).
  4. ISO 2382-15: 1998 Information technology – Vocabulary – Part 15: Programming languages; Revision of first edition ISO 2382-15: 1985. iso.org, 1999, abgerufen am 4. Juni 2012 (englisch).
  5. a b c d Debasish Ghosh: Functional and Reactive Domain Modeling. Manning, 2016, ISBN 978-1-61729-224-8 (englisch, 325 S.).
  6. David J. Barnes, Michael Kölling: Java lernen mit BlueJ: Eine Einführung in die objektorientierte Programmierung. München 2009, ISBN 978-3-86894-001-5, S. 496.
  7. Russell J. Abbott: Program design by informal English descriptions. In: Communications of the ACM. 26. Jahrgang, 1983, S. 882–894, doi:10.1145/182.358441.
  8. Jörg Bewersdorff: Objektorientierte Programmierung mit JavaScript: Direktstart für Einsteiger. 2. Auflage. Wiesbaden 2018, ISBN 978-3-658-21076-2, S. 30–33, doi:10.1007/978-3-658-21077-9_4.
  9. Steve Yegge: Execution in the Kingdom of Nouns. steve-yegge.blogspot.com, 30. März 2006, abgerufen am 3. Juli 2010.
  10. Timothy Boronczyk: What’s Wrong with OOP. zaemis.blogspot.com, 11. Juni 2009, abgerufen am 3. Juli 2010.
  11. Scott Ambler: A Realistic Look at Object-Oriented Reuse. drdobbs.com, 1. Januar 1998, abgerufen am 4. Juli 2010.
  12. Asaf Shelly: Flaws of Object Oriented Modeling. Intel® Software Network, 22. August 2008, abgerufen am 4. Juli 2010.
  13. Justin James: Multithreading is a verb not a noun. techrepublic.com, 1. Oktober 2007, abgerufen am 4. Juli 2010.
  14. Asaf Shelly: HOW TO: Multicore Programming (Multiprocessing) Visual C++ Class Design Guidelines, Member Functions. support.microsoft.com, 22. August 2008, abgerufen am 4. Juli 2010.
  15. Ted Neward: The Vietnam of Computer Science. Interoperability Happens, 26. Juni 2006, archiviert vom Original am 4. Juli 2006; abgerufen am 2. Juni 2010.  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/blogs.tedneward.com
  16. Alexander Chatzigeorgiou: Performance and power evaluation of C++ object-oriented programming in embedded processors. In: Information and Software Technology. 45. Jahrgang, Nr. 4, 2003, ISSN 0950-5849, S. 195–201, doi:10.1016/S0950-5849(02)00205-7.
  17. Luca Cardelli: Bad Engineering Properties of Object-Oriented Languages. In: ACM Comput. Surv. 28. Jahrgang. ACM, 1996, ISSN 0360-0300, S. 150, doi:10.1145/242224.242415 (lucacardelli.name [abgerufen am 21. April 2010]).
  18. Thomas Potok, Mladen Vouk, Andy Rindos: Productivity Analysis of Object-Oriented Software Developed in a Commercial Environment. In: Software – Practice and Experience. 29. Jahrgang, Nr. 10, 1999, S. 833–847 (ornl.gov [PDF; abgerufen am 21. April 2010]).