Click here to load reader
Upload
vucong
View
216
Download
4
Embed Size (px)
Citation preview
Begriffe und Konzepte der objektorientierten Programmierung (OOP)
Vorwort Wozu objektorientierte Programmierung?Das Erlernen der objektorientierten Programmierung ist für zwei Gruppen von Menschen schwierig:
1. Solche, die noch nie programmiert haben, 2. solche, die schon einmal programmiert haben.
Dabei wage ich zu behaupten, dass es die erste Gruppe noch etwas leichter hat als die Zweite. Sie hat nämlich keine eingefahrenen Denk und Vorgehensmuster, die sie erst überwinden muss. Allerdings sind die ersten Schritte in jeglicher Programmierung stets schwierig, so dass von einem echten Vorsprung nicht die Rede sein kann.
Wenn Sie gerade mit dem Programmieren begonnen haben, kommen Ihnen die meisten Programme vielleicht simpel und schnell überschaubar vor. Alle, die schon etwas mehr Erfahrung haben, werden mir aber zustimmen, dass moderne Softwaresysteme alles andere als einfach sind. Ein Informationssystem von heute ist aus vielerlei Gründen komplex, und das leider allzu oft in sehr hohem Maße. Häufig ist bereits die Problemstellung sehr komplex, denn der Anwender möchte oft alle seine Probleme mit einer Software in den Griff bekommen. Da ein solches System schon aufgrund seiner Größe und der Terminvorgaben nicht von einer Person allein erstellt werden kann, kommt noch die Schwierigkeit hinzu den Entwicklungsprozess vernünftig zu steuern. Außerdem soll immer auch eine hohe Flexibilität gewährleistet werden, um mit den Investionen von heute den Anforderungen von morgen noch gewachsen zu sein.
Das wichtigste Ziel der OOP ist also: Beherrschung der Komplexität
Die Beherrschung der Komplexität gelingt nur durch sukzessives Aufteilen in immer kleinere Einheiten:
Verschiedene Programmierparadigmen (methodiken) verfolgen dabei unterschiedliche Ansätze. Die ersten höheren Programmiersprachen (Fortran, Basic, Pascal, C,...) benutzten das prozedurale bzw. strukturierte Programmierparadigma. Dabei erfolgt die Strukturierung durch Prozeduren, Module und Datenstrukturen.
Das prozedurale Programmieren macht sich die simple Tatsache zunutze, dass es in fast jedem Programm Abläufe gibt, die mehrmals in ähnlicher Form abgearbeitet werden müssen. Diese fasst man dann zu einer Prozedur zusammen, die einen Satz von Parameter übergeben bekommt, mit diesen eine Aufgabe erledigt und anschließend einen Wert zurückliefern kann. Das Programm fährt direkt hinter der Stelle fort, an der die Prozedur aufgerufen wurde.
Der modulare Ansatz geht noch einen Schritt weiter und fasst zusätzlich Prozeduren von verwandter Funktionalität zu Modulen zusammen, die gröbere Untereinheiten des Programms darstellen. Das kann sowohl die Organisation des Entwicklungsprojekts erleichtern, da man jeweils einen Programmierer mit einem Modul betrauen kann, als auch das Testen, da hierbei die Module bereits separat einmal getestet werden können und später nur noch das korrekte Zusammenspiel untersucht werden muss.
Die Daten, mit denen das Programm umgeht, fasst man zu Datenstrukturen zusammen, also zu Gruppen mit eigenem Namen, die einen Datentyp festlegen.
Ein wesentliches Merkmal der strukturierten Programmierung ist aber die strenge Trennung zwischen Daten und Operationen/Funktionen (den Algorithmen).
Bei der objektorientierten Programmierung werden diese Strukturierungsprinzipien nicht einfach komplett ersetzt, sondern durch weitere Konzepte ergänzt (deshalb sollte man bei der OOP auch eher von einer Ergänzung/ Weiterentwicklung der strukturierten Programmierung als von einer Ablösung sprechen).
Grundkonzepte der OOP
● Bildung von Objekten und ihre Zuordnung zu Klassen
● Kapselung
● Vererbung
● Polymorphie
Objekte und Klassen
In der OOP stehen Objekte im Vordergrund. Objekte sind atomare Einheiten, die jeweils einen (inneren) Zustand und ein Verhalten besitzen. Dabei kann ein Objekt beliebig abstrakt sein, es kann ein statisches Gebilde (z.B. ein Auto) sein, es kann aber auch einen Vorgang beschreiben (z.B. ein Tennisspiel).
● Der Zustand des Objekts wird durch Datenstrukturen, ● sein Verhalten – die von ihm ausführbaren Operationen – durch Funktionen/
Prozeduren beschrieben. Ein Objekt verbindet also Daten und die zu ihrer Bearbeitung dienenden Funktionen zu einer Einheit.In der OOP wird eine Methode für ein Objekt aufgerufen, in dem an das Objekt eine entsprechende Nachricht (Botschaft) geschickt wird: Das Objekt interpretiert die Nachricht und reagiert mit der Ausführung einer zugeordneten Operation (Methode).Die Struktur eines Objekts wird durch eine Klasse beschrieben. Eine Klasse ist also eine Abstrahierung (Verallgemeinerung) für eine Menge von gleichartigen Objekten. Ein spezielles Objekt der durch eine Klasse definierten Objektmenge wird auch Instanz genannt. Die Klasse entspricht dem Datentyp prozeduraler Programmiersprachen, während eine Instanz (ein spezielles Objekt dieser Klasse) einer Variablen entspricht.
Kapselung (Encapsulation)Nur die Funktionskomponenten (und Daten) eines Objekts, die zu seiner Verwendung benötigt werden, sind allgemein zugänglich, d.h. öffentlich (public). Sie bilden das Interface (Protokoll), über das zu dem Objekt zugegriffen werden kann (= Schnittstelle zur "Außenwelt").Die übrigen Funktionen und Daten sind nur Komponenten des Objekts selbst zugänglich, d.h. privat (private, protected). Der "Außenwelt" gegenüber bleiben sie verborgen. Hierdurch wird sichergestellt, daß zu einem Objekt nur über eine wohldefinierte Schnittstelle zugegriffen werden kann. Zugriffe zu Interna, die nur zur Realisierung und Verwaltung des Objekts dienen, sind nicht möglich. Vorteile:
● Verhinderung von Fehlern.● Trennung von Interface und Implementierung.
Die Kapselung bewirkt außerdem eine Datenabstraktion: Eine Datenstruktur ist nach außen nicht mehr an eine bestimmte Implementierung gebunden, sondern wird über die auf sie anwendbaren Operationen (Methoden, Funktionen) definiert. Eine Änderung der Implementierung bei gleichbleibendem Interface hat keinen Einfluß auf den Anwendungscode.
Vererbung (Inheritance)Vererbung ermöglicht den Aufbau von Klassenhierarchien: Eine neue Klasse (abgeleitete Klasse) wird aus einer oder mehreren bereits definierten Klasse(n) (Basisklasse) abgeleitet. Sie erbt dadurch die Daten und Methoden der Basisklasse(n). Zusätzlich kann sie durch das Hinzufügen neuer Daten und Methoden im Sinne einer weiteren Spezialisierung abgeändert werden.
● Einfache Vererbung : Ableitung einer Klasse von nur einer Basisklasse.● Mehrfachvererbung : Ableitung einer Klasse von mehreren Basisklassen.
Durch Vererbung übertragene Methoden (Funktionen/Prozeduren) existieren nur einmal (= Code Sharing). Dies erleichtert Änderungen und Erweiterungen an bestehenden Klassenhierarchien.
Beispiel für einfache Vererbung:Basisklasse:Straßenfahrzeug { baujahr, maxspeed, fahren() }Unterklassen:Pkw { neu : kofferraum, kofferraum_oeffnen() }Lkw { neu : ladung, beladen(), entladen() }
Straßenfahrzeug
baujahrmaxspeed
fahren()
Basisklasse(Klassenname)
Eigenschaften (Daten)
Methode
Pkw
baujahrmaxspeedkofferraum
fahren()kofferraum_oeffnen()
Lkw
baujahrmaxspeedladung
fahren()beladen()entladen()
Unterklasse(abgeleitete
Klasse)Generalisierung(die Unterklasse
erbt von der Basisklasse)
Der OOPAnsatz erfordert eine andere Vorgehensweise bei der Problemlösung: Statt einer TopDownZerlegung des Problems ( hierarchische Modularisierung) müssen die relevanten Objekte⇒ (Aufbau und Verhalten) und ihre Beziehungen untereinander ermittelt werden ( aufgaben und⇒ kommunikationsorientierte Zerlegung). Eine weit verbreitete Modellierungsmethode ist dabei die Anwendung von UML (Unified Modeling Language). Das oben dargestellte Klassendiagramm entspricht einer von vielen graphischen Modellierungen von UML.
Polymorphie (Polymorphism)Verwendung des gleichen Namens für unterschiedliche – aber miteinander verwandte – Dinge. Polymorphie in der OOP ermöglicht, daß verschiedenartige Objekte (unterschiedlicher Klassen) unter einem gemeinsamen Oberbegriff (Basisklasse) betrachtet und bearbeitet werden können. Für verschiedenartige Objekte werden unterschiedliche aber meist ähnliche Methoden mit dem gleichen Namen belegt. Die gleiche durch den Namen ausgedrückte Botschaft wird an unterschiedliche Objekte gerichtet zum Aufruf unterschiedlicher Methoden führen. Also nicht die Botschaft (der Aufruf) bestimmt, welche Methode (Funktion) ausgeführt wird, sondern der Empfänger der Botschaft.Polymorphie führt zum Überladen von Funktionen (Methoden) und Operatoren.Überladen von Funktionen (Function Overloading):Mehrere Funktionen, die zu verschiedenen Klassen gehören und/oder mit verschiedenen Datentypen arbeiten, können den gleichen Namen besitzen. Durch den gleichen Namen (virtuelle Funktion) wird ein StandardInterface bereitgestellt, über das sich mehrere unterschiedliche aber meist miteinander verwandte Methoden aufrufen lassen. Die speziell angewandte Methode hängt von dem Empfänger des Funktionsaufrufs und den beim Aufruf übergebenen Daten (Parameter) ab.Überladen von Operatoren (Operator Overloading) :Operatoren können zur Anwendung auf unterschiedliche Datentypen umdefiniert werden. Ein überladener Operator bewirkt den Aufruf einer speziellen vom Benutzer erstellten – Funktion.
Quellen:
● www.cppentwicklung.de/cpplinux/cpp_main/node4.html
● www.ee.hm.edu/fb/lab/lmc/kriskripten/prog2/vorles/P2_K7.pdf
● de.wikipedia.org/wiki/Unified_Modeling_Language