- Objektorientiertes Programmieren
-
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. 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.
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 Konzeption dieser Objekte erfolgt dabei in der Regel auf Basis der folgenden Paradigmen:
- 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).
- 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.
- 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 Invarianten des Programms.
- Polymorphie
- 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, 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 als Index für den Grad des Feedback.
- 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.
- Persistenz
- Objekt-Variablen 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 dann nicht einzelne Objekte, sondern eine Klasse gleichartiger Objekte definiert. Existieren in der erwä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 bzw. Zerstörung von Objekten heißen Konstruktoren und Destruktoren.
In vielen objektorientierten Programmiersprachen lässt sich festlegen, welche Objekte eine bestimmte Methode aufrufen dürfen. So unterscheidet beispielsweise die Programmiersprache Java vier Zugriffsebenen, die bereits zur Übersetzungszeit geprüft werden.
- 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 Paket befinden.
- Geschützte (protected) Methoden dürfen von Klassen im selben Paket und abgeleiteten Unterklassen aufgerufen werden.
- Ö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 Superklasse = Basisklasse = Oberklasse Subklasse = abgeleitete Klasse = Unterklasse Methode = Elementfunktion = Memberfunktion statische Methode = Klassenfunktion = Metafunktion Attribut = Datenelement = Member (aus einer Klasse erzeugtes) Objekt = Exemplar = Instanz 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 objektorientierten Programmiersprache nach dem internationalen ISO-Standard.
Gängige moderne Programmiersprachen wie Java, C++, C#, Python, Perl, PHP und Ruby unterstützen sowohl die OOP als auch den prozeduralen Ansatz, der in den gängigen 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 zum Beispiel JavaScript, NewtonScript und Self wird auf die Deklaration von Klassen gänzlich verzichtet. Stattdessen werden bestehende Objekte, so genannte 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.
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.
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 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.
Kritik
- Luca Cardelli untersuchte für das DEC Systems Research Center die Effizienz von OOP-Ansätzen mit den Metriken Programmablaufgeschwindigkeit (economy of execution), Compilegeschwindigkeit (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).[1]
- 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."[2]
- Eine Studie von Potok et al. [3] zeigte keine signifikanten Produktivitätsunterschiede zwischen OOP und Prozeduralen Ansätzen.
- 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.[4]
- Alexander Stepanow schlug vor, OOP beschreibt eine mathematisch-begrenzte Betrachtungsweise und nannte sie, "fast einen genauso großen Schwindel wie die künstliche Intelligenz (KI)" [5][6].
- Edsger W. Dijkstra:
... die Gesellschaft lechzt nach Schlangenöl. Natürlich 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)." — EWD 1175: The strengths of the academic enterprise
Siehe auch
- Handle
- Reflexion (Programmierung)
- Schnittstelle (objektorientierte Programmierung)
- Liskovsches Substitutionsprinzip
- CORBA
- DCOM
- Geschichte der Programmiersprachen: Denkweise und Begriffe der Objektorientierung zeigten sich zuerst in Simula – einer Sprache für Simulationszwecke.
Literatur
- Bernhard Lahres, Gregor Raýman: Praxisbuch Objektorientierung, Galileo Computing, ISBN 3-89842-624-6, Frei verfügbar auf der Seite des Verlags
- Harold Abelson, Gerald Jay Sussman, Julie Sussman: Structure and Interpretation of Computer Programs. The MIT Press, ISBN 0-262-01153-0
- Heide Balzert: Objektorientierte Systemanalyse, Spektrum Akademischer Verlag, Heidelberg 1996, ISBN 3-8274-0111-9
- Grady Booch: Object-Oriented Analysis and Design with Applications. Addison-Wesley, ISBN 0-8053-5340-2
- Peter Eeles, Oliver Sims: Building Business Objects. John Wiley & Sons, ISBN 0-471-19176-0
- Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Design Patterns: Elements of Reusable Object Oriented Software. Addison-Wesley, ISBN 0-201-63361-2
- Paul Harmon, William Morrissey: The Object Technology Casebook. Lessons from Award-Winning Business Applications. John Wiley & Sons, ISBN 0-471-14717-6
- Ivar Jacobson: Object-Oriented Software Engineering: A Use-Case-Driven Approach. Addison-Wesley, ISBN 0-201-54435-0
- Bertrand Meyer: Object-Oriented Software Construction. Prentice Hall, ISBN 0-13-629155-4
- Bernd Oestereich: Objektorientierte Programmierung mit der Unified Modeling Language. Oldenbourg, ISBN 3-486-24319-5
- James Rumbaugh, Michael Blaha, William Premerlani, Frederick Eddy, William Lorensen: Object-Oriented Modeling and Design. Prentice Hall, ISBN 0-13-629841-9
Referenzen
- ↑ Luca Cardelli: Bad Engineering Properties of Object-Oriented Languages. ([1]).
- ↑ Mode inheritance, cloning, hooks & OOP (Google Groups Discussion). Abgerufen am 21. Juni 2008.
- ↑ http://www.csm.ornl.gov/~v8q/Homepage/Papers%20Old/spetep-%20printable.pdf
- ↑ C. J. Date, Introduction to Database Systems, 6th-ed., Page 650
- ↑ http://www.aaai.org/aitopics/html/aieffect.html
- ↑ STLport: An Interview with A. Stepanov
Weblinks
- Praxisbuch Objektorientierung (openbook)
- Objektorientiertes Programmieren in Java (openbook)
- Aufgaben der OOP
- Skriptum zu OOP, TU Wien (pdf)
- Flash ActionScript OOP - Einführung in die objektorientierte Programmierung
- Die Fachmesse zum Thema OOP
- Einleitung in die Objektorientiere Programmierung, Uni Wuppertal
Wikimedia Foundation.