Kapitel 6: Objektorientierung

Aus ComeniusWiki
Version vom 3. Februar 2014, 18:21 Uhr von B.Schiller (Diskussion | Beiträge)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Zur Startseite - Kapitel 1 - Kapitel 2 - Kapitel 3 - Kapitel 4 - Kapitel 5


Bis jetzt haben wir Aufgaben durch einfaches Hintereinaderausführen von Befehlen (inklusive der bekannten Kontrollstrukturen) gelöst. Diese Art der Programmierung bezeichnet man als imperative Programmierung. Diese Form der Programmierung ist geeignet für Probleme, die in vorhersehbarer Weise ablaufen, so wie es i.d.R. bei mathematischen Problemen der Fall ist. Ist das Verhalten verschiedener Teile eines Modells nicht so genau vorherzusagen, dann sollte man auf das Paradigma der objektorientierten Programmierung zurückgreifen.
Unter Objektorientierung versteht man eine Modellierung komplexer Systeme, bei der ein System durch ein Zusammenspiel verschiedener Objekte beschrieben wird. Der Begriff Objekt ist dabei unscharf gefasst: ausschlaggebend an einem Objekt ist nur, dass ihm bestimmte Attribute (Eigenschaften) und Methoden zugeordnet sind und dass es in der Lage ist, von anderen Objekten Informationen zu empfangen beziehungsweise an diese zu senden. Objekte müssen dabei nicht gegenständlich (konkret) sein, sondern können auch mehr oder weniger abstrakt sein. Entscheidend dabei ist, dass das Grundkonzept der Objektorientierung (Objekte mit bestimmten Eigenschaften und Methoden) sinnvoll umgesetzt werden kann. Programmiertechnisch entspricht diesem Ansatz das Konzept der Klasse, in der Objekte aufgrund ähnlicher Eigenschaften zusammengefasst werden. Ein Objekt wird im Programmcode als Instanz einer Klasse definiert.


Die wichtigsten Vorteile der objektorientierten Programmierung sind:

  • Aufteilung von komplexen Softwaresystemen in kleine, einfache, in sich geschlossene Einheiten,
  • einfache und klar verständliche Schnittstellen zwischen den einzelnen Einheiten,
  • weitgehende Vermeidung von Programmierfehlern beim Zusammenspiel zwischen den Komponenten,
  • geringer Programmieraufwand durch die Wiederverwendung von Elementen.

Je kleiner und einfacher die Objekte und Klassen und die Schnittstellen zwischen ihnen gewählt werden, desto besser werden diese Ziele erreicht. Unter Schnitstellen versteht man dabei die Beschreibung, wie Klassen oder Methoden benutzt werden können, ohne dass dabei ihre Implementierung sichtbar wird. Wir kennen eine derartige Beschreibung bereits aus der Nutzung von packages wie java.lang.Math.


Der konkrete Modellierung eines Problems der realen Welt als eines Systems von Objekten hängt davon ab, welchen Zweck das Modell erfüllen soll. Ein Autohändler wird sicher andere Attribute eines Autos für wichtig halten als ein Autohersteller. Auch wird ein Autohändler sich mit dem Attribut "Farbe" oder "Lackierung" begnügen um ein Auto näher zu charakterisieren, während ein Autohersteller die Farben/Lackierungen in einer eigenen Klasse mit eigenen Attributen zusammenfassen wird.
Dementsprechend steht am Anfang des Prozesses der Softwareerstellung die Überlegung, aus welchen Objekten und Klassen eine Aufgabenstellung besteht, und welche Eigenschaften und Aktionen diese Objekte haben - vorerst noch unabhängig von der verwendeten Programmiersprache. Man bezeichnet diesen Schritt als Objekt-orientierte Analyse (OOA).

Aufgaben 6.1.


Das Paradigma der objektorientierten Programmierung ruht auf vier Säulen:

  • Beziehungen
  • Vererbung
  • Kapselung
  • Polymorphismus


Beziehungen
Objekte und Klassen existieren nicht für sich allein, sondern stehen in Beziehung zueinander:

- sie sind sich ähnlich (haben Gemeinsamkeiten) (Generalisierung/Spezialisierung)
- sie enthalten einander (Aggregation/Komposition)


Vererbung
Die Vererbung dient dazu, ausgehend von existierenden Klassen neue Klassen zu schaffen, wobei die Beziehung zwischen ursprünglicher und neuer Klasse dauerhaft ist. Eine neue Klasse kann dabei eine Erweiterung oder eine Einschränkung der ursprünglichen Klasse sein. Beispiel: Die Klasse Quadrat erbt einen Großteil der Eigenschaften der Klasse Rechteck, ebenso die Klasse Kreis einen Großteil der Eigenschaften der Klasse Ellipse.


Kapselung
Unter Kapselung versteht man den Schutz von Klassen und Attributen vor unerwünschtem Zugriff. Jedes Objekt ist sozusagen von einer Kapsel umgeben, die Daten und Methoden des Objekts schützt. Die Kapsel verbirgt die Teile des Objekts, die von außen nicht oder nur durch bestimmte andere Objekte erreichbar sein sollen. Die Stellen, an denen die Kapsel durchlässig ist, sind die oben erwähnten Schnittstellen.


Polymorphismus
Der Polymorphismus macht es möglich, dass verschiedene Unterklassen dieselbe Botschaft verstehen, obwohl die technische Umsetzung der Reaktion auf diese Botschaft völlig unterschiedlich sein kann. Auf die Botschaft "bremsen" können sowohl Objekte vom Typ "Fahrrad" als auch vom Typ "LkW", die beide zur Oberklasse "Fahrzeug" gehören, reagieren, und das Resultat ist bei beiden vergleichbar, nämlich, dass die Geschwindigkeit verringert wird. Allerdings sind die Handgriffe, die hierzu erforderlich sind, bei beiden Objekten sehr unterschiedlich.