Kapitel 3 Klassen und Objekte
Nichts auf der Welt ist so gerecht verteilt wie der Verstand.
Jeder glaubt, er hätte genug davon.
3.1 Objektorientierte Programmierung
Da Java eine objektorientierte Programmiersprache ist, müssen die Konzepte dieses Paradigmas bekannt sein. Erstaunlicherweise sind dies nicht viele, denn objektorientiertes Programmieren (OOP) basiert nur auf einigen wenigen Ideen. Werden diese beachtet, wird OOP nicht zum Verhängnis und der Vorteil gegenüber modularem Programmieren kann ausgeschöpft werden. Bjarne Stroustrup (Schöpfer von C++, von seinen Freunden auch Stumpy genannt) sagte treffend über den Vergleich von C und C++: »C makes it easy to shoot yourself in the foot, C++ makes it harder, but when you do, it blows away your whole leg.«1 2
Hinweis Herkunft der OO-Sprachen: Java ist natürlich nicht die erste OO-Sprache, auch nicht C++. Klassischerweise gelten Smalltalk und insbesondere Simula-67 als Säulen aller OO-Sprachen. Die eingeführten Konzepte sind bis heute aktuell, darunter die vier allgemein anerkannten Prinzipien der OOP: Abstraktion, Kapselung, Vererbung und Polymorphie.2
|
3.1.1 Warum überhaupt OOP?
In der frühen Softwareentwicklung haben sich zwei Modelle herausgebildet, um Programme zu entwerfen: Top-down- und Bottom-up-Analyse. Beide beschreiben jeweils eine Möglichkeit, Software durch schrittweises Verfeinern zu entwerfen. Bei der Top-down-Analyse steht das Gesamtprogramm im Mittelpunkt, und es wird nach den Funktionen gefragt, um diese an der oberen Stelle benötigte Funktionalität implementieren zu können. Ein Beispiel: Es soll ein Fahrplanauskunftsprogramm geschrieben werden. An oberster Stelle verwenden wir drei Funktionen: eine Funktion, die das Programm initialisiert, eine, die die Bildschirmmaske aufbaut, und eine, die die Benutzereingaben entgegennimmt. Anschließend modellieren wir diese drei Funktionen mittels weiterer Funktionen, in der Funktion »Initialisieren« beispielsweise durch »Speicher beschaffen«, »Informationsdatei laden«, »Informationen in Datenstrukturen umsortieren«. Jede dieser Funktionen wird weiter verfeinert, bis die gewünschte Funktionalität erreicht ist. Der Top-down-Ansatz eignet sich somit nur für Systeme, deren untere Stufen nacheinander entwickelt werden. Denn ohne den unteren Teil ist das gesamte Programm nicht lauffähig. Sofort wird hierdurch folgendes Problem sichtbar: Es muss von vornherein klar sein, welche Funktionen die Software hat, und alle Funktionen müssen bekannt sein. Eine Modularisierung in Teilaufgaben ist schwer möglich, und daran krankt diese Analysetechnik. Schauen wir uns deshalb den Bottom-up-Entwurf an. Dieser Entwurf geht genau in entgegengesetzter Richtung vor. Wir entwickeln erst die Komponenten der unteren Stufe und vereinigen sie dann zu einem Modul höherer Abstraktion. Problem: Diese Technik eignet sich zur Entwicklung nur dann, wenn die unteren Stufen tatsächlich eigenständig lauffähig sind.
Beide Methoden sind nicht wirklich befriedigend, und so wurden Mischformen geschaffen. Mit diesen die Softwareprodukte zu gliedern, zeigte ebenfalls nur durchschnittliche Ergebnisse. Objektorientierte Programmierung wird als Schlüssel für die zukünftige Softwareentwicklung angesehen und erweitert die Leistungsfähigkeit der beiden Analysetechniken Bottom-up und Top-down.
Wird gefragt, welche Faktoren zum Umdenken weg von der prozeduralen und hin zur objektorientierten Programmierung geführt haben, so lassen sich im Wesentlichen drei Eigenschaften anführen:
|
In einem Programm stehen die Daten im Vordergrund. |
|
Funktionen sind kurzlebiger als Daten. |
|
Jede Software ist unzähligen Änderungen unterworfen. |
Die objektorientierte Programmierung versucht nun, diese drei Faktoren zu beachten. Stehen die Daten im Vordergrund, so müssen wir weniger in Funktionen denken, sondern in Objekten, die die Daten beschreiben. Damit Änderungen gut möglich sind, kapseln wir die Funktionen so weit von den Daten, dass sie allgemein angewendet werden können.
Wir sehen schon an dieser kurzen Beschreibung, dass ein Objekt immer im Mittelpunkt steht. Alles dreht sich um das Objekt, und dies bezeichnen wir als objektorientiert. Wichtig ist das Design von oben. So ist es auch bei Objektsystemen viel wichtiger, das Design zu beachten, als die Funktionen zu implementieren. Objektorientierte Softwareentwicklung hält sich ganz an die Aussage des französischen Schriftstellers Francois Duc de La Rochefoucauld (1613-1680): »Wer sich zu viel mit dem Kleinen abgibt, wird unfähig für Großes«.
3.1.2 Modularität und Wiederverwertbarkeit
Die objektorientierte Programmierung stellt zwei Konzepte in den Mittelpunkt des Softwareentwurfs: Wiederverwendbarkeit (das Problem ist jedem bekannt: Programmieren wiederholt sich an allen Stellen, und das Neuschreiben kann nicht vermieden werden) und Modularität. Bei der Wiederverwendung geht es darum, die Bausteine objektorientierter Systeme, die Klassen, zu nutzen. Daher wollen wir nun erst einmal bereits vorhandene Klassen verwenden. Im zweiten Schritt werden wir dann eigene Klassen programmieren. Anschließend kümmern wir uns um das Konzept der Modularität, nämlich wie Gruppen kooperierender Klassen gestaltet werden.
1 ... oder wie es Bertrand Meyer sagt: »Do not replace legacy software by lega-c++ software«.
2 Keine Sorge, alle vier Grundsäulen werden in den nächsten Kapiteln ausführlich beschrieben!
|