2 Der objektorientierte Ansatz

Werbung
2
Der objektorientierte Ansatz
Wie im ersten Kapitel bereits beschrieben, ist die Objektorientierung
(OOP = Objektorientierte Programmierung) eine wesentliche Eigenschaft von Java. Bevor Sie also richtig in die Programmierung mit Java
einsteigen, sollten wir uns zunächst mit der Frage beschäftigen, was
OOP eigentlich genau ist und welche Prinzipien dahinter stehen. Damit erhalten Sie ein solides Fundament für den Aufbau Ihrer Programmierkenntnisse. Dieses Kapitel hat naturgemäß einen sehr theoretischen Charakter, dafür ist es aber auch so kurz wie möglich gehalten.
Wenn die folgenden Abschnitte für Sie völliges Neuland sind, werden
Sie vermutlich Probleme damit bekommen sich alles im ersten Anlauf
zu merken. Zerbrechen Sie sich darüber aber nicht den Kopf! Versuchen
Sie einfach zunächst einmal alles so gut wie möglich zu verstehen und
die Beispiele nachzuvollziehen. Durch die regelmäßige Anwendung des
neuen Vokabulars und durch praktische Übungen wird sich dann später
alles verfestigen.
Im Zusammenhang mit der OOP hört man auch häufig vom »Paradigma der Objektorientierung«. Hier deutet sich bereits an, dass der
Schritt weg von der prozeduralen und hin zur objektorientierten Programmierung recht bedeutsam gewesen sein muss. Er ist aus verschiedenen Gründen in der Praxis noch nicht allerorten vollzogen und die
reine Theorie wird sowieso nur allzu oft von der Realität des Programmier-Alltags eingeholt. Trotzdem ist die Entwicklung von komplexen
Softwaresystemen ohne Verwendung objektorientierter Ansätze und
Verfahrensweisen heutzutage nicht mehr denkbar.
Aber was unterscheidet nun die prozedurale von der objektorientierten
Programmierung? Und welchen Nutzen bringt Ihnen der neue Ansatz?
Der objektorientierte Ansatz
57
© des Titels »Objektorientierte Programmierung in Java« (ISBN 3-8266-7414-6)
2006 by Redline GmbH, Heidelberg
Nähere Informationen unter http://www.bhv-buch.de/7414
2.1
Prozedurale Programmierung
Um die kennzeichnenden Merkmale einer objektorientierten Programmiersprache verstehen zu können, sollte man idealerweise zunächst die
grundlegenden Prinzipien der prozeduralen Programmierung kennen.
Typische Vertreter der prozeduralen Sprachen sind C, Basic oder Pascal.
Streng objektorientierte Sprachen sind beispielsweise Smalltalk, Eiffel
und eben Java. C++, das auch als »C mit Klassen« bezeichnet wird, gehört zu den Mischlingen der Programmiersprachen. Zwar bietet C++
auf der einen Seite alle objektorientierten Elemente, die Sie auf den
nächsten Seiten kennen lernen werden, allerdings erlaubt es dem Entwickler (im Gegensatz zu Java) auf prozedurale Programmiertechniken
»zurückzufallen«.
Der Entwickler einer neuen Software steht stets vor der gleichen Herausforderung: Er muss einen Ausschnitt aus der Realität in seinem Programm abbilden. Das fertige Produkt soll einen Menschen bei der Erledigung einer Aufgabe unterstützen oder sie ihm sogar ganz abnehmen.
Dazu müssen Systeme aus dem »echten Leben« (beispielsweise die vorher mit Hilfe von Papier und Bleistift durchgeführte Buchhaltung, Lagerverwaltung oder Produktionssteuerung eines Unternehmens) mit
Hilfe der ausgewählten Programmiersprache nachgebildet werden. Dieser Vorgang wird Abstraktion genannt, weil dabei ein abstraktes Softwaremodell eines realen Systems erstellt wird. Mit Hilfe eines kleinen
Beispiels lässt sich verdeutlichen, wie so etwas in den düsteren Zeiten
der prozeduralen Programmierung vor sich gegangen ist. Bitte sehen Sie
mir nach, dass ich dabei an einigen Stellen die Komplexität der Wirklichkeit etwas vernachlässige.
Ein Software-Entwickler soll ein Programm für die Bibliothek einer
Schule schreiben. An das Programm werden einige grob formulierte Anforderungen gestellt:
왘 Mit Hilfe der neuen Software soll der Bücherbestand der Bibliothek
verwaltet werden.
58
Kapitel 2
© des Titels »Objektorientierte Programmierung in Java« (ISBN 3-8266-7414-6)
2006 by Redline GmbH, Heidelberg
Nähere Informationen unter http://www.bhv-buch.de/7414
왘 Das Programm soll zu jedem Zeitpunkt »wissen«, wo sich die einzelnen Bücher befinden – also eine Regalplatznummer oder den aktuellen Ausleiher anzeigen können.
왘 Dass es auch die Ausleihzeiten überwachen und bei Überschreitung entsprechende Meldungen anzeigen soll, ist selbstverständlich.
왘 Die neue Anwendung soll den großen Karteikasten des Bibliothe-
HINWEIS
kars vollständig ablösen und viel Zeit und Arbeit sparen.
Dieser Anforderungskatalog mag Ihnen etwas zu grob formuliert sein und deshalb unrealistisch erscheinen. Dennoch beginnen die meisten Software-Projekte mit genau solchen »Wunschlisten«, die es auszuarbeiten gilt.
Daten
Um hier das reale System mit Hilfe einer Software abzubilden, hätte
sich der Entwickler in den prä-objektorientierten Zeiten an den
Schreibtisch gesetzt und zunächst einmal eine Datenstruktur entworfen, die ein Buch beschreibt. In C implementiert hätte diese dann vereinfacht vielleicht so ausgesehen:
struct buch
{
char titel[50];
char autor[50];
char isbn[14];
char ausleiher[40];
char ausleihdatum[11];
long regalplatz;
}
Vermutlich ahnen Sie bereits, warum ich an dieser Stelle auf die Verwendung von Java-Code verzichtet habe. Genau – solche Konstrukte
Der objektorientierte Ansatz
59
© des Titels »Objektorientierte Programmierung in Java« (ISBN 3-8266-7414-6)
2006 by Redline GmbH, Heidelberg
Nähere Informationen unter http://www.bhv-buch.de/7414
sind nicht sehr objektorientiert, Java aber eine rein objektorientierte
Sprache! Strukturen im ursprünglichen Sinne gibt es hier nicht mehr.
Also müssen Sie sich noch einige Seiten lang gedulden, bevor wir zum
Java-Programmieren kommen.
Auch wenn Sie noch nie in C programmiert haben, ist diese Struktur
vermutlich leicht verständlich für Sie. Es werden einfach einige Eigenschaften eines Buchs zusammengefasst zu einem neuen Datentypen.
Dieser Typ heißt buch und man kann beliebig viele Variablen von ihm
deklarieren. Und genau das muss im nächsten Schritt geschehen.
Der Bibliothekar hat unserem Programmierer versichert, dass es in absehbarer Zukunft nicht mehr als 5000 Bücher gleichzeitig im Bestand
geben wird. Dieser ist aus Erfahrung jedoch vorsichtig mit solchen Aussagen und kalkuliert eine Sicherheitsreserve mit ein. In seinem C-Programm erzeugt er eine Sammlung von 5500 buch-Variablen:
struct buch buecher[5500];
HINWEIS
Mit Hilfe des so deklarierten Arrays buecher kann er jetzt also Informationen zu bis zu 5500 Büchern im Hauptspeicher des Computers ablegen. Für die dauerhafte Speicherung der verwalteten Bücher auf einem
Datenträger muss außerdem eine Datei erzeugt werden, die den gleichen Aufbau hat wie die Datenstruktur. Im Programm ist dann dafür
Sorge zu tragen, dass die Daten aus dieser Datei korrekt in den Speicher
geladen und von dort aus wieder in die Datei geschrieben werden können.
60
Ein echter C-Programmierer würde an dieser Stelle etwas anders arbeiten und ein Array mit dynamischer Größenanpassung
verwenden. So würde im Gegensatz zu dieser Lösung immer
nur so viel Speicherplatz verbraucht, wie tatsächlich benötigt
wird. Aus Gründen der Übersichtlichkeit wird hier aber darauf
verzichtet.
Kapitel 2
© des Titels »Objektorientierte Programmierung in Java« (ISBN 3-8266-7414-6)
2006 by Redline GmbH, Heidelberg
Nähere Informationen unter http://www.bhv-buch.de/7414
Funktionen
Jetzt fehlen noch Funktionen, die auf die in buecher gespeicherten Daten zugreifen und sie lesen und manipulieren können. Sinnvoll erscheinen hier für den Anfang zum Beispiel:
void
void
void
void
buchEingeben(int index);
buchLöschen(int index);
buchAusleihen(int index, char* ausleiher);
buchZuruecknehmen(int index);
Diese Funktionen sind sehr einfach. Sie ersetzen die Aktionen
왘 neue Karteikarte ausfüllen,
왘 alte Karteikarte zerreißen,
왘 einen Entleiher auf der Karteikarte eintragen und
왘 einen Entleiher auf der Karteikarte durchstreichen
die der Bibliothekar bis dato mit seinem Karteikarten-System durchgeführt hat. Gemeinsam ist allen vieren, dass sie auf die Daten eines in
buecher abgelegten Buches zugreifen. buchEingeben() und buchLoeschen() legen die Daten zu einem noch nicht erfassten Buch an bzw. löschen sie wieder. buchAusleihen() hingegen trägt in der Eigenschaft
ausleiher eines bekannten Buchs den Namen eines Ausleihers ein. Ein
Aufruf von buchZuruecknehmen() streicht diesen Namen wieder aus
den Daten.
Jede der Funktionen muss mindestens eine Information übergeben bekommen, bevor sie ihre Aufgabe erledigen kann: den Index des zu bearbeitenden Buchs in der Liste buecher. Nur so kann eine Beziehung zwischen den nicht fest miteinander verbundenen Daten und Funktionen
hergestellt werden.
Das beschriebene Vorgehen des Entwicklers macht deutlich, dass die
prozedurale Programmierung zwischen Daten auf der einen und Funktionen auf der anderen Seite unterscheidet. Beide Ebenen sind vonein-
Der objektorientierte Ansatz
61
© des Titels »Objektorientierte Programmierung in Java« (ISBN 3-8266-7414-6)
2006 by Redline GmbH, Heidelberg
Nähere Informationen unter http://www.bhv-buch.de/7414
ander getrennt und werden vom Entwickler isoliert betrachtet, obwohl
sie eigentlich eng miteinander verwoben sind:
왘 Zunächst setzt er seine Sicht auf die Daten im Programm um. Im
Beispiel sind das die Informationen, die für jedes einzelne Buch abgelegt werden sollen. Dazu überlegt er sich, welche Eigenschaften
ein Buch beschreiben und welche man davon in der Anwendung
benötigt. Heraus kommt dabei ein Datenmodell des alten Karteikastens, eine Beschreibung der Informationsstruktur. Diese Struktur
ist zu Anfang noch ohne Inhalt.
왘 Erst wenn er damit fertig ist, erstellt der Programmierer Funktionen, die diese Datenstrukturen mit Informationen füllen, sie wieder auslesen und den Inhalt manipulieren können. Diese Funktionen müssen dann »wissen«, welchen Datensatz sie bearbeiten sollen, und vor allem auch, wie dieser aufgebaut ist. Jede der
genannten drei Routinen bezieht sich auf die Datenstruktur buch
und ist darauf angewiesen, dass diese sich nicht verändert. Trotzdem bilden sie im Programm keine Einheit mit dieser Struktur,
sondern liegen voneinander getrennt vor.
2.2
Objektorientierte Programmierung
Die strikte Trennung von Daten und Funktionen erscheint auf den ersten Blick nicht unbedingt nachteilig. Der Programmierer der Bibliotheks-Software wird durchaus in der Lage sein, mit Hilfe dieser Vorgehensweise ein funktionierendes und brauchbares Produkt herzustellen.
Aber was passiert, wenn zum Beispiel nachträglich Änderungen nötig
sind? Wenn beispielsweise irgendwann das Erscheinungsjahr mit in die
Informationsstruktur aufgenommen werden soll? Es würde nötig werden, buch um ein Feld zu erweitern:
62
Kapitel 2
© des Titels »Objektorientierte Programmierung in Java« (ISBN 3-8266-7414-6)
2006 by Redline GmbH, Heidelberg
Nähere Informationen unter http://www.bhv-buch.de/7414
struct buch
{
char
char
char
char
char
long
char
}
titel[50];
autor[50];
isbn[14];
ausleiher[40];
ausleihdatum[11];
regalplatz;
veroeffentlichung[20];
So weit wäre alles in bester Ordnung, aber jetzt fangen die Probleme an.
Über das Bibliotheks-Programm verstreut findet sich eine Vielzahl von
Funktionen, die mit der Struktur buch arbeiten. Die vier oben genannten sind nur ein paar Beispiele – in einer realen Software wären es mehrere Dutzend. Jede dieser Funktionen muss angepasst werden. Und da
Daten und Funktionen ja bekanntermaßen nicht als Einheit vorliegen,
sondern voneinander getrennt im Quelltext verstreut sind, kann schon
die Suche nach den zu ändernden Stellen eine echte Sisyphus-Arbeit
sein. Bedenken Sie: Von jeder beliebigen Programmstelle aus können
die in den buch-Strukturen gespeicherten Daten manipuliert werden.
Und alle diese Stellen müssen angepasst oder zumindest geprüft werden.
Mit steigender Komplexität der Software und größer werdenden Entwickler-Teams wird die getrennte Betrachtung von Daten und Funktionen immer problematischer. Dann weiß nämlich irgendwann niemand
mehr, wer gerade welche Datenstrukturen verändert hat oder welche
Programmteile damit arbeiten.
Prozedural gestaltete Software kann also schnell ein Chaos aus im Programm verstreuten Daten und Funktionen werden. Aber es gibt auch
eine Alternative, die viel natürlicher ist und von Haus aus eine bessere
Übersichtlichkeit mitbringt: die objektorientierte Entwicklung.
Der objektorientierte Ansatz
63
© des Titels »Objektorientierte Programmierung in Java« (ISBN 3-8266-7414-6)
2006 by Redline GmbH, Heidelberg
Nähere Informationen unter http://www.bhv-buch.de/7414
Die Welt besteht aus Objekten
Weiter oben wurde schon festgehalten, dass Software reale Systeme abstrahiert, also Ausschnitte unserer »echten Welt« im Rechner nachbildet. Wenn man sich diese Systeme nun anschaut, so stellt man fest,
dass sie aus miteinander in Beziehung stehenden Objekten bestehen.
Das System »Schulbibliothek« besteht beispielsweise aus Regalen, Büchern und Ausleihern. Im vorhergehenden Abschnitt wurden die BuchObjekte betrachtet. Jedes Objekt hat eine Reihe von Eigenschaften
(auch Attribute genannt), durch die es beschrieben wird:
왘 Titel
왘 Autor
왘 Ausleiher
왘 ...
Außerdem gibt es Funktionen (auch Operationen oder Methoden genannt), um diese Eigenschaften zu manipulieren:
왘 Titel eintragen
왘 Autor eintragen
왘 Ausleiher eintragen
왘 ...
Bei der objektorientierten Software-Entwicklung fasst man Eigenschaften und Funktionen zu Objekten zusammen. Sie können sich ein Objekt auch als eine Struktur vorstellen (so wie buch), an die die Funktionen gebunden sind. Dadurch gibt es nicht nur die Datenstruktur selbst
in der gleichen Anzahl wie Bücher, sondern auch die Funktionen. Jedes
Buch-Objekt (nach der bisherigen Planung bis zu 5500) hat seine eigene
Kopie der Funktionen, die ausschließlich auf die objekteigenen Attribute zugreifen. Dadurch muss den Funktionen auch kein Index eines
64
Kapitel 2
© des Titels »Objektorientierte Programmierung in Java« (ISBN 3-8266-7414-6)
2006 by Redline GmbH, Heidelberg
Nähere Informationen unter http://www.bhv-buch.de/7414
Buchs mehr mitgegeben werden, denn sie gehören ja immer zu genau
einer Informationsstruktur.
Zum besseren Verständnis führt Tabelle 2.1 einige Beispiele dafür auf,
welche Eigenschaften und Methoden Objekte in Softwaresystemen haben können. Schon diese kleine Auswahl zeigt, dass softwaremäßig gesehen so ziemlich alles ein Objekt ist. Das schließt neben greifbaren
Dingen wie einer CD auch Personen und nichtgegenständliche Entitäten wie ein Konto oder einen Kundenauftrag ein.
Objekt
Attribute
Methoden
Konto
Nummer, Inhaber, Bevollmäch- einzahlen, abheben, eröffnen, schließen,
tigter, Kontostand, Dispokredit Überziehungszinsen errechnen
CD
Titel, Interpret, Einzeltitel, Label, abspielen, einlegen, auswerfen
Spielzeit
Beamter Name, Dienstalter, Tarifstufe
einstellen, pensionieren, befördern, versetzen, Bleistifte anspitzen lassen
Auftrag
ausfüllen, stornieren, buchen, abschließen, bestätigen
Nummer, Kunde, Bearbeiter,
Einzelposten
Tab. 2.1: Einige Objekte mit ihren Attributen und Methoden
Der erste Vorteil für den Programmierer der Bibliotheks-Software liegt
nun auf der Hand. Da er Daten und Funktionen zusammen in der Definition seiner Buch-Objekte vorliegen hat, kann er zunächst einfach die
Datenstruktur um die neue Eigenschaft erweitern. Anschließend findet
er alle Funktionen, die mit dieser Struktur arbeiten, an der gleichen
Stelle vor. Solange er sicherstellt, dass sich seine Buch-Objekte nach außen hin durch die Änderung nicht anders verhalten, braucht er keine
weiteren Programmstellen zu verändern. Die Erweiterung bestehender
Software wird somit vereinfacht. Doch es gibt noch weitere Vorzüge gegenüber der prozeduralen Entwicklung:
Der objektorientierte Ansatz
65
© des Titels »Objektorientierte Programmierung in Java« (ISBN 3-8266-7414-6)
2006 by Redline GmbH, Heidelberg
Nähere Informationen unter http://www.bhv-buch.de/7414
왘 Objekte können nach einer einmal gefertigten Vorlage in beliebiger
Zahl erzeugt, in Arrays oder anderen Listen verwaltet und wieder
zerstört werden.
왘 Die objektorientierte Betrachtungsweise der Welt ist natürlich und
intuitiv erfassbar für Menschen, denn reale Systeme bestehen tatsächlich aus Entitäten, die miteinander in Beziehung stehen.
왘 Eine Objektvorlage kann leicht in vielen verschiedenen Programmen verwendet werden, die mit den gleichen Objekten aber in einem anderen Zusammenhang arbeiten. Die Wiederverwendbarkeit
ist erheblich besser als bei prozeduralem Code.
왘 Die Implementierung von Objekten ist vollständig transparent für
den Anwender. D.h., ein Funktionen aufrufender Quelltext muss
absolut nichts über die interne Implementierung eines Objekts
wissen.
In den folgenden Abschnitten wird jeweils kurz auf die genannten
Aspekte eingegangen. Bitte beachten Sie, dass diese Ausführungen nur
dem ersten Verständnis der Objektorientierung dienen. Alle diese
Punkte werden im weiteren Verlauf noch detailliert erläutert.
Objekte erzeugen, sammeln und entsorgen
Die Bibliotheks-Software soll bis zu 5500 Bücher verwalten können.
Das bedeutet, dass innerhalb des Programms bis zu 5500 Buch-Objekte
angelegt werden müssen. Natürlich muss der Programmierer das nicht
manuell und für jedes Objekt neu tun. Stattdessen erstellt er eine
Klasse, eine Art Vorlage für die Erstellung von Objekten. Sie beschreibt,
welche Attribute den Zustand des Objekts beschreiben und welche
Operationen auf diesen Attributen ausgeführt werden können.
Wenn man mehr als ein einzelnes Objekt einer Art anlegt, wird man
zumeist eine Art Liste für die Verwaltung heranziehen wollen. An dieser
Stelle unterscheidet sich die objektorientierte nicht von der prozedura-
66
Kapitel 2
© des Titels »Objektorientierte Programmierung in Java« (ISBN 3-8266-7414-6)
2006 by Redline GmbH, Heidelberg
Nähere Informationen unter http://www.bhv-buch.de/7414
len Programmierung. Sie haben bereits oben gesehen, dass auch der
prozedural arbeitende Entwickler ein so genanntes Array anlegte um die
Informationen zu den 5500 Büchern zu speichern. Ganz ähnlich wird
auch mit Objekten verfahren, wobei Java allerdings elegantere und leistungsfähigere Möglichkeiten zur Verfügung stellt als ein einfaches Array wie in der Sprache C.
Objekte belegen System-Ressourcen, und zwar hauptsächlich Platz im
Hauptspeicher des Rechners, auf dem das Programm läuft. Da diese
Ressourcen nicht unbegrenzt vorhanden sind, sollten nicht mehr benötigte Objekte zerstört und damit der von ihnen belegte Speicherplatz
wieder freigegeben werden.
Es hängt von der verwendeten Programmiersprache ab, wie lange ein
Objekt existiert und ob sich der Programmierer selbst um die Freigabe
des Speichers kümmern muss. Innerhalb der Java-Laufzeitumgebung
läuft ein so genannter Garbage Collector, der sich darum kümmert. Er
spürt nicht mehr verwendete Objekte auf und zerstört sie dann. Dadurch werden die zuvor belegten Ressourcen wieder freigegeben.
Natürlich programmieren
Bei diesem Stichwort könnte man zunächst an besonders ökologische
Software-Entwicklung denken oder an Programmierer, die Anhänger der
FKK-Bewegung sind. Tatsächlich ist damit aber etwas anderes gemeint:
Nämlich eine Art der Software-Entwicklung, die sich an der natürlichen
Sichtweise eines Menschen auf seine Umwelt orientiert.
Unsere Umwelt (und alle ihre Teilbereiche, die möglicherweise mit
Hilfe einer Software modelliert werden sollen) ist ein System aus miteinander in Interaktion stehenden Objekten. Das kleine Beispiel der
Schulbibliothek hat das ja bereits aufgezeigt. Dort stehen beispielsweise
Ausleiher mit Ausleihgegenständen und diese wiederum mit Regalen in
Beziehung. Es fällt den meisten Menschen nicht schwer, bei der Betrachtung eines beliebigen Systems (sei es nun ein Warenwirtschaftssy-
Der objektorientierte Ansatz
67
© des Titels »Objektorientierte Programmierung in Java« (ISBN 3-8266-7414-6)
2006 by Redline GmbH, Heidelberg
Nähere Informationen unter http://www.bhv-buch.de/7414
stem, die Personalabrechnung eines Unternehmens oder ein Flugsicherungssystem) auf Anhieb die beteiligten Objekte zu identifizieren und
zu beschreiben. Um das wirklich umfassend und korrekt zu können,
muss natürlich ein gutes Fachwissen vorhanden sein. Aber in der
Grundzügen ist es erst einmal einfach.
Wenn man nun objektorientierte Technologien verwendet, so orientiert
man sich an genau diesen Objekten, die das abzubildende System ausmachen. Die Software-Objekte stehen dann auf die gleiche Art miteinander in Interaktion wie die realen Objekte der »Vorlage«. Dadurch wird
die Entwicklung viel einfacher und intuitiver, da man seine Wahrnehmung der Welt nicht mehr wie bei der prozeduralen Programmierung in
ein ganz anderes Denk-Schema zwängen muss. Stattdessen kann man
– und damit wären wir wieder bei der Überschrift dieses Abschnitts –
natürlich programmieren.
Das Rad nicht immer neu erfinden
Können Sie sich noch an den Jahrtausendwechsel erinnern? Nein, ich
meine nicht die letzten zwei Stunden vor dem Jahreswechsel, die Ihnen
nur noch verschwommen im Gedächtnis sind. Ich meine die zwei Jahre
davor, in denen Katastrophenszenarien durch die Medien geisterten, die
der so genannte Millennium-Bug hätte auslösen können. Sie wissen
schon: Zusammenbruch der Wasserversorgung, GAU im Kernkraftwerk, Atomkrieg oder im schlimmsten Fall sogar eine verspätete Auszahlung der Renten.
Die Welt stand förmlich am Abgrund, aber heldenhafte und überarbeitete Software-Entwickler wie Sie und ich haben das Ruder damals gerade noch mal herumgerissen. Jetzt könnte man sich fragen: Wie
konnte es überhaupt so weit kommen? Und was tun wir in Zukunft gegen solche Probleme?
Nun, auf der ganzen Welt haben zehntausende von Programmierern
hunderttausende von Malen irgendwelche Routinen zur Datumsberech-
68
Kapitel 2
© des Titels »Objektorientierte Programmierung in Java« (ISBN 3-8266-7414-6)
2006 by Redline GmbH, Heidelberg
Nähere Informationen unter http://www.bhv-buch.de/7414
nung und -formatierung geschrieben. Die allermeisten dieser Routinen
haben so ziemlich das Gleiche getan, wurden aber immer wieder neu
entwickelt – und das auch noch mit immer wieder den gleichen Fehlern. Die Hauptarbeit bei der Herstellung der »Jahr-2000-Fähigkeit« war
in den meisten Systemen, die fehlerhaften Programmstellen erst einmal
zu finden. Die eigentliche Korrektur war dann meistens trivial.
Dieses krasse und uns allen bekannte Beispiel aus der Praxis zeigt, welche Ressourcen tagtäglich sinnlos vergeudet werden, um bereits gelöste
Probleme noch mal zu lösen – eben das Rad neu zu erfinden. Um dem
entgegenzutreten benötigt man Strategien zur Wiederverwendung von
Software. Einmal entwickelte Lösungen müssen sich mit wenig Aufwand in beliebig vielen anderen Projekten einsetzen lassen können.
Und zwar nicht, indem man einfach einen Quelltext beliebig oft kopiert
und damit alle seine Fehler und Unzulänglichkeiten verbreitet. Stattdessen muss sich eine Korrektur oder Änderung an einer zentralen
Stelle auch an allen anderen Stellen auswirken, an denen die Routine
noch verwendet wird.
HINWEIS
Die genannten Forderungen lassen sich mit objektorientierter Software
besonders gut erfüllen. Ein einmal entwickeltes Objekt (zum Beispiel
für Datumsberechnung und -formatierung) lässt sich immer wieder verwenden. Und das, ohne den Quelltext jedes Mal zu kopieren. Stattdessen wird die Klasse, also sozusagen die Objektvorlage, an zentraler
Stelle abgelegt und alle anderen Programme können sie von dort beziehen.
Die mehrmalige Verwendung von Objekten ist die Vorstufe zu
komponentenbasierten Systemen. Eine Komponente kann dort
ein einzelnes Objekt oder ein ganzes System von Objekten sein.
Mit Objekten gemeinsam hat eine Komponente, dass sie bestimmte Funktionen und Eigenschaften kapselt und wie ein
Bauklotz in beliebig viele andere Systeme eingebaut werden
kann. Komponenten sind an der Wiederverwendungs-Idee gemessen noch leistungsfähiger und universeller als Objekte.
Der objektorientierte Ansatz
69
© des Titels »Objektorientierte Programmierung in Java« (ISBN 3-8266-7414-6)
2006 by Redline GmbH, Heidelberg
Nähere Informationen unter http://www.bhv-buch.de/7414
Vollständige Transparenz
Ein gutes Objekt ist für den Software-Entwickler, der es verwendet, vollkommen transparent. Er kann es betrachten wie den Kaffeeautomaten
im Büro: Man steckt Geld rein und drückt auf einen Knopf. Anschließend kommt unten Kaffee raus. Im Normalfall kann man also den Automaten bedienen, ohne über sein Innenleben Bescheid zu wissen. Und
wenn er mal nicht funktioniert, dann ruft man eben jemanden an, der
sich damit auskennt. Ob dieser dann nur eine kleine Reparatur vornimmt oder den Automaten vollständig umbaut, ist egal. Hauptsache,
die Bedienung des Automaten bleibt gleich: Geld – Knopf – Kaffee.
Auf die gleiche Art funktioniert auch die Verwendung eines Objekts in
der Software-Entwicklung. Wie ein Objekt mit dem Namen Arbeiter die
monatliche Lohnabrechnung für den Mitarbeiter Müller erstellt, ist
dem verwendenden Programmierer egal. Er steckt nur Informationen
wie Tarifstufe und Steuerklasse hinein und bekommt die Abrechnung
heraus. Die komplexen Berechnungen, die zur Erstellung notwendig
sind, bleiben ihm verborgen und belasten ihn nicht. Und falls sich die
Abrechnung aufgrund steuerrechtlicher Neuerungen oder Ähnlichem
ändern muss, kümmert sich der Programmierer des Arbeiter-Objekts
darum. Solange die Schnittstelle zum Objekt immer gleich bleibt, sind
keine Änderungen an den benutzenden Programmen notwendig.
2.3
Objekte und Klassen
Nachdem nun die objektorientierte Sichtweise auf die Welt beschrieben
worden ist, wird es Zeit sich mit der Terminologie der OOP zu beschäftigen. In den folgenden Abschnitten werden die grundlegenden Begriffe
dazu erläutert. Das wird Ihnen mangels praktischer Erfahrung zunächst
vermutlich alles viel zu abstrakt und kompliziert erscheinen. Ich kann
Sie aber beruhigen: Der Nebel wird sich im weiteren Verlauf des Buchs
erheblich lichten. Deshalb sollten Sie das Kapitel zwar zu Ende lesen,
70
Kapitel 2
© des Titels »Objektorientierte Programmierung in Java« (ISBN 3-8266-7414-6)
2006 by Redline GmbH, Heidelberg
Nähere Informationen unter http://www.bhv-buch.de/7414
Herunterladen