Objektorientierte Programmierung

Objektorientierte Programmierung

Die objektorientierte Programmierung (kurz OOP) ist ein auf dem Konzept der Objektorientierung basierendes Programmierparadigma. Die Grundidee dabei 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.

Inhaltsverzeichnis

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 Objekte werden dabei in der Regel auf Basis der folgenden Paradigmen konzipiert:

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 (ADT)). 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.
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.
Polymorphie
Fähigkeit eines Bezeichners, abhängig von seiner Verwendung unterschiedliche Datentypen anzunehmen. Verschiedene Objekte können auf die gleiche Nachricht unterschiedlich reagieren. Wird die Zuordnung einer Nachricht zur Reaktion auf die Nachricht erst zur Laufzeit aufgelöst, 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 als Index für den Grad des Feedbacks.
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.
Persistenz
Objektvariablen existieren, solange die Objekte vorhanden sind und „verfallen“ nicht nach Abarbeitung einer Methode.

Klassen

Hauptartikel: Klasse

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, fünf Türen, einen Motor und fünf Sitze hat.
Das Objekt „Automodell1“ hat schließlich vier Reifen mit dem Durchmesser 60 cm und der Breite 20 cm, fünf rote Türen, einen Motor mit 150 kW und fünf Ledersitze.
Ein weiteres Objekt „Automodell2“ hat vier Reifen mit dem Durchmesser 40 cm und der Breite 15 cm, fünf blaue Türen …
Beide Objekte sind unterschiedlich, gehören aber zu der gemeinsamen Klasse Auto.

Methoden

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 bzw. Destruktoren.

In vielen objektorientierten Programmiersprachen lässt sich festlegen, welche Objekte eine bestimmte Methode aufrufen dürfen. So unterscheiden beispielsweise die Programmiersprachen Java und PHP vier Zugriffsebenen, die bereits zur Übersetzungszeit geprüft werden.

  1. Private Methoden können nur von anderen Methoden derselben Klasse aufgerufen werden.
  2. Methoden auf Paket-Ebene können nur von Klassen aufgerufen werden, die sich im selben Paket befinden.
  3. Geschützte (protected) Methoden dürfen von Klassen im selben Paket und abgeleiteten Klassen aufgerufen werden.
  4. Öffentliche (public) Methoden dürfen von allen Klassen aufgerufen werden.

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

Attribute

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

Polymorphie

Hauptartikel: Polymorphie (Programmierung)

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

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.

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:

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

Objektorientierte Programmiersprachen

Objektorientierte Programmiersprachen besitzen einen speziellen Datentyp – das Objekt. Damit ermöglichen sie die Objektorientierung. 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 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 Kapselung objektinterner Daten einhält.

Die erste bekannte objektorientierte Programmiersprache war Simula-67. Später wurden die Prinzipien 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 zur ersten nach dem internationalen ISO-Standard normierten objektorientierten Programmiersprache.

Gängige moderne Programmiersprachen (z. B. Python) unterstützen sowohl die OOP als auch den prozeduralen Ansatz, der in den üblichen Programmiersprachen der 1970er und 1980er Jahre wie Pascal, Fortran oder C vorherrschend war. 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. 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.

Siehe auch:

Techniken

In einigen objektorientierten Programmiersprachen wie JavaScript, NewtonScript und Self wird auf die Deklaration von Klassen gänzlich verzichtet. Stattdessen werden neue Objekte von bestehenden Objekten, den so genannten 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 den Zugriff auf Datenbanken ermöglichen.

Es gibt inzwischen auch Verfeinerungen der objektorientierten Programmierung durch Methoden wie Entwurfsmuster (englisch design patterns), Design by Contract (DBC) und grafische Modellierungssprachen wie UML.

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 J2EE 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 Substantive sind. Die Verben (‘Aktionen’) sind sekundär, fest an Substantive gebunden (‘gekapselt’) und können i.A. 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.[1][2]

OOP und Kontrollfluss

Häufig genannte Vorzüge des OOP Paradigma sind eine verbesserte Wartbarkeit und Wiederverwendbarkeit des statischen Quellcodes.[3] Hierzu werden jedoch die Kontrollflüsse und das dynamische Laufzeitverhaltens 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.[4] 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.[5][6]

OOP und relationale Datenbanken

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.[7]

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) 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.[8] Für Anwendungen auf mobilen Geräten, wie Handys oder MP3-Spielern mit begrenzten Leistungs- und Energiespeichervermögen, sind diese Unterschiede signifikant. 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

  • Luca Cardelli untersuchte 1996 für das DEC Systems Research Center die Effizienz von OOP-Ansätzen in dem Paper 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 um die hochgesteckten Erwartungen zu erfüllen.[9]
  • Eine Studie von Potok et al. aus dem Jahre 1999 zeigte keine signifikanten Produktivitätsunterschiede zwischen OOP und prozeduralen Ansätzen.[10]

Siehe auch

Literatur

Weblinks

Einzelnachweise

  1. Steve Yegge (30. März 2006): Execution in the Kingdom of Nouns. steve-yegge.blogspot.com. Abgerufen am 3. Juli 2010.
  2. Timothy Boronczyk (11. Juni 2009): What's Wrong with OOP. zaemis.blogspot.com. Abgerufen am 3. Juli 2010.
  3. Scott Ambler (1. Januar 1998): A Realistic Look at Object-Oriented Reuse. www.drdobbs.com. Abgerufen am 4. Juli 2010.
  4. Asaf Shelly (22. August 2008): Flaws of Object Oriented Modeling. Intel® Software Network. Abgerufen am 4. Juli 2010.
  5. Justin James (1. Oktober 2007): Multithreading is a verb not a noun. techrepublic.com. Abgerufen am 4. Juli 2010.
  6. Asaf Shelly (22. August 2008): HOW TO: Multicore Programming (Multiprocessing) Visual C++ Class Design Guidelines, Member Functions. support.microsoft.com. Abgerufen am 4. Juli 2010.
  7. Ted Neward (26. Juni 2006): The Vietnam of Computer Science. Interoperability Happens. Abgerufen am 2. Juni 2010.
  8. Alexander Chatzigeorgiou: Performance and power evaluation of C++ object-oriented programming in embedded processors. In: Information and Software Technology. 45, Nr. 4, 2003, S. 195–201. doi:10.1016/S0950-5849(02)00205-7.
  9. Luca Cardelli: Bad Engineering Properties of Object-Oriented Languages. In: ACM (Hrsg.): ACM Comput. Surv. 28, 1996, S. 150. doi:10.1145/242224.242415. Abgerufen am 21. April 2010.
  10. Thomas Potok, Mladen Vouk, Andy Rindos: Productivity Analysis of Object-Oriented Software Developed in a Commercial Environment. In: Software – Practice and Experience. 29, Nr. 10, 1999, S. 833–847. Abgerufen am 21. April 2010.

Wikimedia Foundation.

Schlagen Sie auch in anderen Wörterbüchern nach:

  • objektorientierte Programmierung —   [Abk. OOP], Prinzip der Programmierung, bei dem die Manipulation von sog. Objekten durch Methoden sowie die Verbindung von Objekten und deren Interaktion im Vordergrund stehen. Der Programmierer muss sich anders als bei der imperativen… …   Universal-Lexikon

  • objektorientierte Programmierung — im Gegensatz zur prozeduralen Programmierung, bei der Daten, Prozeduren und Funktionen getrennt betrachtet werden, fasst man sie bei der o.P. zu einem Objekt zusammen. Objekte sind nicht nur passive Strukturen, sondern aktive Elemente, die durch… …   Lexikon der Economics

  • Vererbung (objektorientierte Programmierung) — Vererbung dargestellt mittels UML. Die abgeleitete Klasse hat die Attribute x und y und verfügt über die Methoden a und b (im UML Sprachgebrauch Operationen a und b). Die Vererbung (engl. Inheritance) ist eines der grundlegenden Konzepte der… …   Deutsch Wikipedia

  • Methode (objektorientierte Programmierung) — 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… …   Deutsch Wikipedia

  • Kapselung (objektorientierte Programmierung) — Die Objektorientierung, kurz OO, ist ein Ansatz zur Entwicklung von Software, der darauf beruht, die zu verarbeitenden Daten anhand ihrer Eigenschaften und der möglichen Operationen zu klassifizieren. Im Vergleich zu Ansätzen, bei denen… …   Deutsch Wikipedia

  • Schnittstelle (objektorientierte Programmierung) — In der objektorientierten Programmierung (OOP) vereinbaren Schnittstellen (engl. Interface) gemeinsame Signaturen von Methoden oder Funktionen, welche in unterschiedlichen Klassen implementiert werden. Die Schnittstelle gibt an, welche Methoden… …   Deutsch Wikipedia

  • Klasse (objektorientierte Programmierung) — Klasse ist in der Objektorientierung ein abstrakter Oberbegriff für die Beschreibung der gemeinsamen Struktur und des gemeinsamen Verhaltens von realen Objekten (Klassifizierung) im Softwaredesign: reale Objekte werden auf die für die Software… …   Deutsch Wikipedia

  • Überschreiben (objektorientierte Programmierung) — Der Begriff Überschreiben (engl. override, wörtlich außer Kraft setzen, überwinden) beschreibt eine Technik in der objektorientierten Programmierung, die es einer Unterklasse erlaubt, eine eigene Implementierung einer von der Oberklasse geerbten… …   Deutsch Wikipedia

  • Aggregation (objektorientierte Programmierung) — Dieser Artikel oder Abschnitt bedarf einer Überarbeitung. Näheres ist auf der Diskussionsseite angegeben. Hilf mit, ihn zu verbessern, und entferne anschließend diese Markierung. Eine Aggregation in der Informatik ist entweder eine Verbindung… …   Deutsch Wikipedia

  • Objektorientierte Analyse und Design — (OOAD) sind objektorientierte Varianten der zwei allgemeinen Phasen Definition (Objektorientierte Analyse) und Architektur (Objektorientiertes Design) im Entwicklungsprozess eines Softwaresystems. Eine Möglichkeit zur Dokumentation von OOAD ist… …   Deutsch Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”