• Keine Ergebnisse gefunden

Objektorientierte Programmierung (OOP)

N/A
N/A
Protected

Academic year: 2021

Aktie "Objektorientierte Programmierung (OOP)"

Copied!
8
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Objektorientierte Programmierung (OOP)

1. Motivation

Die objektorientierte Sichtweise der Welt

Als Motivation für die OOP sieht man sich am besten die reale Welt an:

• Die reale Welt besteht aus "Objekten", z. B.: Gegenstände, Häuser, Maschinen, Fahrzeuge, Personen, Tiere, Pflanzen, etc.

• Diese Objekte sind relativ selbständige Einheiten. Sie haben meist einen bestimmten Zustand und erfüllen bestimmte Aufgaben.

• Die Objekte haben ein Innenleben, das wir aber normalerweise nicht verstehen müssen, um sie sinnvoll einzusetzen, und das vielfach gar nicht bekannt ist.

• Es genügt zunächst, das äußere Verhalten eines Objekte zu kennen, zu wissen, welche Aufgabe es erfüllt.

• Um die Welt (äußerlich) zu verstehen, muss man die Aufgaben der

verschiedenen Objekte kennen und wissen, wie sie miteinander kommunizieren und interagieren.

Übertragung auf die Programmierung

Es liegt nahe, die objektorientierte Sichtweise auf Programme zu übertragen:

• Ein Programm besteht aus Objekten, das sind selbständige Teile, die für bestimmte Aufgaben zuständig sind.

• Jedes Objekt enthält bestimmte Informationen, die seinen augenblicklichen Zustand repräsentieren. Diese Daten werden durch Variablen dargestellt. Diese nennt man in der OOP Attribute.

• Die Aufgaben und Aktionen eines Objekts werden durch Funktionen dargestellt.

Diese heißen in der OOP Methoden oder Operationen.

• Die Zusammenfassung von Attributen und Operationen zu Objekten (Kapselung) ist ein wichtiges Prinzip der OOP.

• Man unterscheidet:

- den internen Aufbau eines Objekts

- die nach außen hin sichtbaren Eigenschaften (Schnittstelle, Interface) eines Objekts, sowie seine Funktionalität nach außen

(2)

Durch die objektorientierte Vorgehensweise ist es besser als mit der traditionellen Methode der Programmierung möglich, komplexe Programme überschaubar zu halten.

Anwendungen

Die OOP lässt sich in fast allen Bereichen der Programmierung einsetzen,

insbesondere bei komplexen Projekten. Besonders erfolgreich wird sie eingesetzt bei

• Grafischen Benutzeroberflächen (GUI)

• Simulationen

Objektorientierte Analyse und Entwurf (Design)

Besonders wichtig sind bei der OOP die Analyse der Problemstellung und das Programmdesign. Diese umfassen die Zerlegung der Aufgabe in Objekte (Klassen), die Festlegung der die Schnittstellen der Objekte und die Beziehungen der Objekte untereinander. Der richtige Entwurf kann über den Erfolg des ganzen Projekts entscheiden und erfordert sehr viel Erfahrung.

Deshalb gibt es schon seit Langem verschiedene grafische Methoden für

systematische Analyse und Design (die zusammen Modellierung genannt werden).

1997 entwickelten verschiedene Gruppen zusammen eine vereinheitlichte

Modellierungs-Sprache, die sogenannte Unified Modeling Language (UML). Diese umfangreiche Sprache umfasst zahlreiche Diagrammtypen, von denen sich einige speziell mit den statischen und dynamischen Eigenschaften von Klassen und Objekten befassen.

Objekt 1

Objekt 2

Objekt 3

(3)

2. Aufbau von Objekten

Traditionelle Programmierung (strukturiert, imperativ):

In der strukturierten Programmierung liegt das Hauptaugenmerk auf den

Algorithmen. Diese verwenden Daten, die in Form von Variablen im Programm enthalten sind.

Problem: Funktionen können auf Daten zugreifen, die nicht für sie bestimmt sind.

Objektorientierte Programmierung: Kapselung

In der OOP werden Daten (= Attribute) und Algorithmen (in Form von Funktionen = Operationen) zu Objekten zusammengefasst. Dies ist ein wichtiges Prinzip der OOP.

Man nennt es Kapselung. Meist ist damit auch gemeint, dass es nicht möglich ist, von außen auf die Daten eines Objekts zuzugreifen, sondern nur mit Hilfe geeigneter Operationen (s. Verbergen von Informationen)

Daten getrennt von Algorithmen

Funktionen 1

Funktionen 2 Daten 1

Daten 2

Attribute Attribute

Objekt 1 Objekt 2

(4)

Der Unterschied in zwei Wörtern

Man könnte den Unterschied zwischen traditioneller strukturierter Programmierung und objektorientierter Programmierung wie folgt auf den Punkt bringen:

• Die strukturierten Programmierung stellt die Frage "Wie?"

(d. h. die Frage nach dem Algorithmus).

• Die OOP stellt die Frage "Was?"

(d. h. die Frage: was für Objekte brauche ich?).

Sichtbarkeit von Attributen und Operationen (Verbergen von Informationen):

Objektorientierte Programmiersprachen bieten die Möglichkeit, Informationen zu verbergen (information hiding). Dadurch ist es möglich, zwischen einem privaten und einem öffentlichen Teil des Objekts zu unterscheiden. Nur der öffentliche Teil ist für den Benutzer eines Objekts relevant. Er bildet die Schnittstelle nach außen.

( Attribute )

Operationen Attribute

privat (private) unsichtbar

(Implementation)

öffentlich (public) sichtbar

(Interface)

Objekt Operationen

(5)

Objekte und Klassen

Neben dem Begriff "Objekt" tritt in der OOP auch der Begriff "Klasse" auf. Während ein Objekt etwas Konkretes ist, das Speicherplatz belegt und zu jedem Zeitpunkt einen bestimmten Zustand hat, ist eine Klasse etwas Abstraktes: Sie ist ein Muster, das als Vorlage für die Erzeugung von Objekten dient, so wie ein Datentyp das Muster für eine Variable ist. D. h., eine Klasse ist ein Datentyp und ein Objekt, das nach dem Muster dieser Klasse erzeugt wird, ist eine Variable von diesem Datentyp.

Man spricht vom Objekt als der Instanz der Klasse (Instanzvariable).

Datentyp Variable

Klasse Objekt

• Datentyp = Muster oder Vorlage für Variable

• Klasse = Muster oder Vorlage für Objekt

• Objekt = Instanz (eigentlich Exemplar) einer Klasse Eine Klasse belegt normalerweise keinen Speicherplatz.

Ein Objekt benötigt dagegen Speicherplatz um seinen internen Zustand abzuspeichern.

3. Vererbung

Von einer Klasse kann eine andere Klasse abgeleitet werden. Dies bedeutet:

• Die neue Klasse übernimmt (erbt) alle Eigenschaften der Ursprungsklasse (alle Attribute und alle Operationen), kann aber zusätzliche Eigenschaften erhalten.

• Man bezeichnet die neue Klasse als Unterklasse (sub class) der Ursprungsklasse, die Ursprungsklasse als Oberklasse (super class) der neuen Klasse.

Dieser Mechanismus der Ableitung von Klassen, auch Vererbung genannt, ist ein wichtiges Prinzip der OOP.

(6)

Beispiel:

Zu beachten ist dabei, dass jede Instanz der Klasse "Auto" auch gleichzeitig eine Instanz der Klasse "Fahrzeug" ist, da ein Auto alle Eigenschaften eines Fahrzeugs besitzt.

Die Klassen in der OOP spielen also eine ähnliche Rolle wie Klassifizierungen von Objekten im realen Leben. Dabei spielt die Relation "ist abgeleitet von" bei den Klassen die gleiche Rolle wie die Relation "ist ein" bei den realen Objekten.

Ort,

Geschwindigkeit Masse,

Größe beschleunige ()

bremse ()

Klasse Fahrzeug Oberklasse

Zusätzlich:

Tankfüllung Drehzahl zündungAn ()

lenke () schalte ()

Klasse Unterklasse Auto

erweitert /

ist abgeleitet von

(7)

Beispiel Zoologie:

Hier gilt z. B.: Jede Katze ist ein Säugetier, jedes Säugetier ist ein Wirbeltier, aber auch: jede Katze ist ein Wirbeltier.

Analog gilt bei Klassen in der OOP: wenn B Unterklasse von A ist und C Unterklasse von B, dann ist C auch Unterklasse von A (und A ist Oberklasse von C).

Normalerweise hat eine Klasse nur eine Oberklasse. In manchen

Programmiersprachen (wie z. B. C++) gibt es allerdings auch die Möglichkeit der Mehrfachvererbung (eine Klasse ist von mehreren Klassen abgeleitet).

4. Polymorphie

Ein weiteres Prinzip der OOP ist die sogenannte Polymorphie (das heißt übersetzt Vielgestaltigkeit). Darunter ist zu verstehen, dass man gleichartige Operationen auf Objekte verschiedener Klassen anwenden kann. So kann man eine Klasse für komplexe Zahlen erstellen und dafür eine Operation + definieren. Man kann aber auch eine Klasse für Zeichenketten erstellen und dafür ebenfalls einen +-Operator definieren, der Zeichenketten verkettet. Somit steht die Operation + je nach Kontext für verschiedene Operationen. Dies gibt es auch schon bei elementaren Datentypen.

Wirbeltiere

Reptilien Fische Säugetiere

Krokodile Katzen Hunde

(8)

5. Einige Design-Prinzipien in der Objektorientierung

Neben den bisher genannten Prinzipien der OOP gibt es noch Prinzipien, an denen man sich beim Entwurf objektorientierter Software orientieren sollte:

• Prinzip einer einzigen Verantwortung: Statt Verantwortung könnte man auch Zuständigkeit sagen. Jede Klasse sollte eine klar definierte Zuständigkeit besitzen.

Erleichtert die Aufteilung eines Programms in Klassen.

• Wiederholungen vermeiden: Damit ist nicht gemeint, dass keine Schleifen programmiert werden sollen, sondern, dass nicht gleichartige Code-Stücke an mehreren Stellen des Programms auftreten sollten. Allgemeiner ausgedrückt:

Eine bestimmte Funktionalität sollte in einem Programm nur an einer Stelle umgesetzt werden. Ist dies nicht der Fall, so sollte eine geeignete Funktion eingesetzt werden.

Erleichtert die Wartbarkeit von Software, macht sie übersichtlicher und verhindert die künstliche Aufblähung von Programmen.

• Offen für Erweiterungen, geschlossen für Änderungen: Dies bedeutet, dass eine Klasse so flexibel programmiert werden sollte, dass sie sich später an erweiterte Aufgaben anpassen lässt (z. B. durch Vererbung), ohne die alte Funktionalität zu verändern.

Gewährleistet die Erweiterbarkeit der Software.

• Trennung von Schnittstelle und Implementierung: es sollte klar getrennt werden, welche Funktionalität eine Klasse nach außen zur Verfügung stellt und wie das intern bewerkstelligt wird.

Erleichtert die Austauschbarkeit einer Klasse in einem Programm.

• Testbarkeit: Zu jeder Klasse sollte es einen Testmodul geben, der Funktionalitäten der Klasse testet (sog. Unit-Tests).

Ermöglicht schon vor Fertigstellung eines kompletten Programms die einzelnen Klassen zu testen, aus denen das Programm aufgebaut ist.

Referenzen

ÄHNLICHE DOKUMENTE

Definition einer Klasse für komplexe Zahlen mit Methoden zum Setzen und zum Abfragen von Real- und Imaginärteil. Später können weitere Methoden zum Setzen und Abfragen von Betrag

Erstellen Sie eine Funktion fft() zur Berechnung der Fast Fourier Transformation eines Vektors aus komplexen Zahlen und testen Sie Ihre Funktion fft() mit einem

Ziel: Entwicklung eines Tests für die Methode add() unter Verwendung von JUnit .... Automatische Tests mit JUnit Ein erstes

Während ein Objekt etwas Konkretes ist, das Speicherplatz belegt und zu jedem Zeitpunkt einen bestimmten Zustand hat, ist eine Klasse etwas Abstraktes: Sie ist ein Muster, das

- unmöglich, alle Prozesse gleichzeitig zu erwischen - Nachrichten, die unterwegs sind, sieht man nicht - ermittelter Zustand ist

Wenn man über einen Container (z.B. Listen oder Arrays) iterieren will verwendet man FOR-EACH-Schleifen. for (TYPE name : variable)

Zum Rechnen habe ich immer Lust.. Beim Werfen bin ich nicht

Sie k¨onnen in dieser Aufgabe auf die folgende statische Methode der Klasse FacebookHelper zur¨uckgreifen, die den Namen eines Nutzers als Parameter erwartet und eine Liste der