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