Objektorientierte Systementwicklung 2 Objektorientierte Systementwicklung 2.1 Von der strukturierten Programmierung zum objektorientierten Softwaredesign Vorbemerkung zum methodischen Vorgehen. Viele Wege führen nach Rom (ROM) Der Autor dieses Buches hat sich entschieden, in die Thematik der „echten“ Objektorientierung erst dann einzusteigen, wenn der Anwender die Grundlagen der strukturierten Programmierung beherrscht. Wohl wissend, dass es andere methodische Ansätze gibt (Viele Wege führen nach Rom), wird in diesem Kapitel so vorgegangen, dass grundlegende Programmstrukturen (lineare Strukturen, Auswahlanweisungen und Wiederholungsanweisungen) mit Java/Eclipse1 erarbeitet werden und erst in einem weiteren Schritt Objekte aus deren Klassen „entstehen“. So erklärt sich die Überschrift dieses Abschnitts, in dem versucht wird, softwareübergreifende Programmstrukturen zu erarbeiten, objektorientiert zu programmieren und erst in einem weiteren Schritt mit der grafischen Benutzeroberfläche von Eclipse zum Softwaredesign überzugehen. Vorab eine wichtige Adresse, die Ihnen vor allem dann hilft, wenn Sie am PC sitzen und sich vor Verzweiflung die Haare raufen. Es ist eine lexikalische Auflistung, zusammengestellt vom Max-Planck-Institut. www.mpi-inf.mpg.de/departments/d5//teaching/ss05/is05/java/GoToJava2.2/ html/index_i.html#ixb100574 2.1.1 Von der Problemstellung zum Algorithmus Bereits im Band für die Eingangsklasse wurde ein Computer als ein technisches Gerät bezeichnet, das Informationen automatisch verarbeiten und speichern kann. Im Unterschied z. B. zu einem normalen Automaten, wie einem Getränkeautomaten, der nur festgelegte Aktionen ausführt, kann dem Computer die Vorschrift, nach der er arbeiten soll, jeweils neu vorgegeben werden. 1 Eclipse ist nicht nur ein Softwareprodukt. Es war in den 30er Jahren ein Pkw-Statussymbol von Peugeot. Weltweit ist noch die Existenz von 34 dieser Peugeot-401-Eclipse-Modellen bekannt. 468871 71 72 Objektorientierte Systementwicklung Eine solche Handlungsvorschrift heißt Algorithmus. Bevor aber überhaupt ein Computer zum Einsatz kommt, beginnt die Arbeit mit einer Problemstellung. Hier wird in allgemeinen Formulierungen beschrieben, was ein Computer überhaupt tun soll. Danach wird in einem weiteren Schritt die Problemstellung in einer Problemanalyse konkretisiert. Erst danach erfolgt die eigentliche Arbeit am Gerät, nämlich die Übertragung der Ergebnisse der Problemanaylse in ein maschinenverständliches Konzept, die Programmierung, moderner ausgedrückt: Softwaredesign. Zu Beginn ein Ausflug in die Geschichte. Wussten Sie schon, dass das Wort Algorithmus auf den persisch-arabischen Mathematiker und Astronom Muhammad Ibn Musa Al-Hwârizmî nach seinem Werk „Kitab al jabr w. almuqabala“ („Regeln der Wiedereinsetzung und Reduktion“) um 825 n. Chr. zurückzuführen ist? Das Werk – es ist im Original leider nicht mehr vorhanden – behandelt algebraische Gleichungen, das indische Zahlensystem und das Rechnen in diesem. Eine lateinische Übersetzung aus dem 12. Jahrhundert „Algorithmi de numero Indorum“ existiert noch.1 Seit Jahrhunderten versteht man unter einem Algorithmus eine präzise, d. h. in einer festgelegten Sprache abgefasste, endliche Beschreibung eines allgemeinen Verfahrens unter Verwendung ausführbarer Verarbeitungsschritte zur Lösung einer Aufgabe. Wie setzt man mithilfe eines Computers einen Algorithmus um? Ein Computer ist mittels eines Rechenwerks in der Lage, einfache Operationen in hoher Geschwindigkeit auszuführen. Die Reihenfolge der auszuführenden Operationen wird über das Steuerwerk organisiert, wobei folgende beiden Voraussetzungen erfüllt sein müssen: u Das zu lösende Problem muss durch Arbeitsanweisungen (Operationen) beschreibbar sein. u Die Reihenfolge der auszuführenden Operationen muss bekannt sein. Merke Alle Rechenanlagen erfordern zu ihrer Handhabung ein System von Anweisungen, deren Anwendung festen Regeln unterliegt. Eine solche Folge von präzise formulierten Anweisungen, die einen eindeutigen und vollständigen Lösungsweg aufzeigen, bezeichnet man als Algorithmus. Den in eine Programmiersprache übersetzten Algorithmus nennt man ein Programm. Ein Programm besteht somit aus einer Folge von logisch angeordneten Programmzeilen zur Lösung eines konkreten Problems. 1 Wenn Sie mehr erfahren wollen, hier eine interessante Adresse: www.kk.s.bw.schule.de/mathge/alhwariz.htm 468872 Von der strukturierten Programmierung zum objektorientierten Softwaredesign Algorithmen werden mittels Programmiersprachen auf Computer übertragen. Die Darstellung eines Algorithmus‘ kann u. a. in umgangssprachlicher Form u im Pseudo-Code, u in grafischer Form (Struktogramm oder Programmablaufplan [PAP]) und/oder u in einer Programmiersprache erfolgen. 2.1.2 Vom Algorithmus zum Programm Tipp Nur echten Genies ist es vorbehalten, eine gegebene Problemstellung sofort in eine Programmiersprache zu übertragen. Allen anderen wird empfohlen, die Lösung inTeilschritten vorzunehmen, wobei sich die folgenden Schritte der Problemanalyse bewährt haben. 1. Schritt: Problemstellung Soll ein Programm entwickelt werden, so muss zunächst eine Problemstellung vorliegen. 2. Schritt: Problemanalyse Um eine vorgegebene Problemstellung programmtechnisch lösen zu können, ist es erforderlich, die gewünschten Ergebnisse (Ausgabedaten) und die dazu vorhandenen Ausgangsdaten (Eingabedaten) genau zu analysieren. Dazu dient die Problemanaylse, die u. a. auf folgende Fragen eine Antwort geben soll. u Was soll ausgegeben werden? Zusammenstellung der Ausgabedaten. u Welche Daten müssen eingegeben werden? Zusammenstellung der Eingabedaten. u Wie sollen die Eingabedaten verarbeitet werden? Eindeutige Darstellung des gewählten Lösungswegs. 3. Schritt: Grafische Darstellung im Struktogramm Merke Ein Struktogramm zeigt in grafischer Form die logische Reihenfolge der einzelnen Arbeitsschritte. Es ist somit ein nach DIN 66261 genormtes Hilfsmittel zur Planung, Entwicklung und Dokumentation von Programmstrukturen. Ein linearer Verlauf wird z. B. durch eine untereinander stehende Folge von Vierecken dargestellt und nach jeder Anweisung mit einer horizontalen Linie abgeschlossen. 468873 73 74 Objektorientierte Systementwicklung 4. Schritt: Codierung, d. h. Übertragung in eine Programmiersprache. In diesem Buch wird die objektorientierte Programmiersprache Java unter der Oberfläche von Eclipse eingesetzt. 5. Schritt: Programmtest Der so erstellte Programmcode wird vom Computer und/oder in Form eines Schreibtischtests auf syntaktische (formale) und/oder semantische (logische) Fehler getestet. 6. Schritt: Dokumentation Während der gesamten Softwareentwicklung wird jede einzelne Entwicklungsstufe dokumentiert. 2.1.3 Phasen bei der Erstellung von Softwareprojekten 468874 Von der strukturierten Programmierung zum objektorientierten Softwaredesign 2.1.4 Vom Programmcode zur Maschinensprache Ablaufsteuerung der beschriebenen Arbeitsschritte Folgender Klassiker der Programmierung soll verdeutlichen, wie man von einer konkreten Problemstellung zu einem Algorithmus gelangt. Ein spektakuläres Landgeschäft PROBLEMSTELLUNG Im Jahr 1627 verkauften die Indianer die Insel Manhattan für den Spottpreis von 24,00 US-$ an einen Niederländer namens Pieter Minnewit. Dieser gründete darauf das Fort Neu-Amsterdam und jeder weiß, was seitdem daraus geworden ist. Aber einmal abgesehen davon, dass die 24,00 US-$ für Minnewit und seine weißen Nachkommen ausgezeichnet investiert waren, hätten auch die Indianer eine gute Verzinsung erzielt, wenn sie die 24,00 US-$ auf einem Sparkonto angelegt hätten (was 1627 leider nicht möglich war). Unterstellen wir einmal, die Indianer hätten das Geld zu einem Zinssatz von nur 2 % angelegt und die Zinsen und Zinseszinsen immer liegen gelassen. Auf wie viel Dollar wäre das Kapital bis heute angewachsen? Ausgabedaten: Endkapital im aktuellen Jahr, z. B. im Jahr 2009 Eingabedaten: Anfangskapital, Zinssatz, Anfangsjahr (hier 1627), aktuelles Jahr 468875 75 76 Objektorientierte Systementwicklung Verarbeitung: Rechnerisch gesehen erreicht ein Kapital K in n Jahren – wenn die Zinsen alljährlich zum Kapital hinzuaddiert werden durch Zinseszinsen zu p % – den Endwert Kn = Kqn. Dabei ist der jährliche Diskontfaktor q = 1 + p/100. Die Formel unserer Aufgabe lautet daher für das Jahr 2009:1 K(2009–1627) = 24,00 · 1,02382 Bitte schätzen Sie, wie viel Dollar die Indianer für ihren Kapitaleinsatz von 24,00 US-$ vor 382 Jahren erhalten hätten. Wetten, auch heute bleibt den indianischen Nachfahren nichts anderes übrig, als sich über die entgangenen Möglichkeiten grün und blau zu ärgern. 2.2 Grundlegende Eigenschaften von Java Warum programmieren mit Java? Java läuft überall, in Pkws, Waschmaschinen, Verkehrsampeln, Sicherheitssystemen, im Mikrowellengerät, … unter Windows oder Mac … Es gilt: „write once run anywhere.“ Kurz: Java ist objektorientiert und plattformunabhängig. Wenn das keine triftigen Gründe sind! Frage: Was hat Java mit einer indonesischen Insel zu tun? Antwort: Nichts! Java ist nichts anderes als die Bezeichnung einer in den USA populären Kaffeesorte, die bei vielen Programmierern neben der Tastatur als „Dauerbegleiter“ steht. 2.2.1 Besonderheit bei der Übersetzung und Ausführung eines Java-Programms Merke Java ist eine objektorientierte Programmiersprache, die auch spezielle Möglichkeiten zur Implementierung internetbasierter, verteilter Anwendungen bietet. Die Besonderheit von Java liegt vor allem in der Art und Weise, wie Java-Programme übersetzt und ausgeführt werden: Java ist eine Mischung aus interpretierter und compilierter Sprache und vereinigt die Vorteile beider Konzepte. 1 Weitere Informationen zu den finanzmathematischen Grundlagen entnehmen Sie bitte folgender Adresse: https://www.uni-hohenheim.de/i410a/etcompu/zinsform/finanz.htm. 468876 Grundlegende Eigenschaften von Java Wie versteht mein Computer das von mir geschriebene Programm? Zur Lösung dieser Ausgangsfrage gibt es verschiedene Konzepte. Gemeinsamkeit aller Programmiersprachen ist, dass sie in die Sprache der Maschine übersetzt werden müssen. Ein solches Übersetzprogramm ist der Compiler. Er übersetzt ein Quellprogramm in ein Zielprogramm. Verwandt mit einem Compiler ist ein Interpreter, der ein Programm nicht in die Zielsprache übersetzt, sondern Schritt für Schritt direkt ausführt. Java kann beides! Der Java-Quellcode wird zunächst von einem Java-Compiler übersetzt. Die Besonderheit liegt nun darin, dass der Übersetzer keinen Maschinencode erzeugt, sondern einen plattformunabhängigen Binärcode (Bytecode). Dieser Bytecode kann unabhängig vom Betriebssystem und Prozessor ausgeführt werden, vorausgesetzt es existiert ein Java-Interpreter für die entsprechende Rechnerplattform. Der Java-Bytecode ist ein maschinencode ähnlicher Binärcode, der vom JavaInterpreter ausgeführt wird. Man bezeichnet den Java-Interpreter auch als Java Virtual Machine. Diese virtuelle Maschine simuliert einen fiktiven Mikroprozessor, der Befehle des Java-Bytecodes empfängt und verarbeitet wie ein realer Mikroprozessor. Sie können den Begriff Maschinensprache ruhig wörtlich nehmen. Es handelt sich um Anweisungen, die ein Computer direkt ausführen kann, die den meisten Menschen aber wie „Böhmische Dörfer“ vorkommen, da alle Anweisungen in einer Folge von Dualzahlen erstellt sind. Benutzerfreundliche Programme sind nicht in Maschinensprache geschrieben. Somit müssen Übersetzungsprogramme eingesetzt werden. Eine weitere Besonderheit bei der Ausführung von Java-Programmen ist die Art und Weise, wie sie gestartet werden können. Programme der meisten anderen Sprachen können nur auf eine Art gestartet bzw. ausgeführt werden. Bei Java jedoch hat der Anwender zwei Möglichkeiten: u Ausführen als Applikation: Das Java-Programm wird wie ein „normales“ Programm lokal auf dem jeweiligen Rechner gestartet und interpretiert. u Ausführen als Applet1: Ein Applet ist ein spezielles Java-Programm, das mit einem WWW-Browser aus dem Internet geladen wird. Typischerweise sind Java-Applets 1 Applets sind nicht Gegenstand dieses Buches. 468877 77 78 Objektorientierte Systementwicklung in HTML (HyperText Markup Language) eingebettet. HTML ist die Sprache, mit der alle WWW-Seiten geschrieben sind. Derjenige Rechner, der die WWW-Seite mit dem Applet bereitstellt, wird Server genannt, der Rechner, der das Applet lädt und ausführt, Client. Sobald das Applet auf Anforderung durch den Client vom Server übertragen wurde, wird es automatisch als Programm innerhalb des WWW-Browsers des Clients ausgeführt.1 2.2.2 Java-Programmierung – ein Blick hinter die Kulissen Der Entwickler schreibt den Quelltext (java-Datei), z. B. System.out.println("Dies ist mein erstes Projekt"); Das Programm wird kompiliert, also in einen Bytecode übersetzt (class-Dateien). Die virtuelle Maschine interpretiert den Bytecode und führt ihn aus. Edit Compile Run 1 vgl. Wolfgang Braun, Informatik an beruflichen Gymnasien, Eingangsklasse, Seite 35 ff. 468878 Projekterstellung mit Eclipse Wichtiges auf einen Blick Java-Programme werden nach ihrer Erstellung compiliert. Dabei entsteht ein Zwischencode, der sogenannte Bytecode. Er ist nicht ausführbar, aber vollkommen unabhängig von der Hardware und dem Betriebssystem und kann z. B. über das Internet an andere Nutzer verschickt werden. Ein Interpreter des Nutzers übernimmt die weitere Verarbeitung. 2.3 Projekterstellung mit Eclipse Das Software-Entwicklungswerkzeug Eclipse ermöglicht dem Benutzer bei der Erstellung von Java-Problemlösungen zwei Vorgehensweisen: 1. Arbeiten mit der von Windows bekannten bunten Welt der Fenster, Schaltflächen,Textfelder, Farben u. v. m., also der Einsatz einer GUI = Graphical User Interface, oder 2. zeilenweise Ein- und Ausgabe der Ergebnisse als Texte in verschiedenen Fenstern. Das Ausgabefenster wird Konsolenfenster, kurz Konsole genannt. Beide Möglichkeiten werden in diesem Buch vorgestellt, wobei sich der Autor entschieden hat, zuerst mit der Eclipse-Konsole zu arbeiten. Eclipse ist ein freies Softwareentwicklungswerkzeug, das es seit dem Jahr 2002 gibt. Es handelt sich um Open Source, also Software, die nach Belieben weitergegeben werden kann, ohne dass Lizenzgebühren anfallen. Eclipse bietet dem Benutzer eine IDE (integrated development environment = integrierte Entwicklungsumgebung), bestehend aus u Editor (Erstellung von Programmtexten) u Compiler (Übersetzungsprogramm) u Debugger (Fehlersuche) Genug der Theorie: Es kann losgehen! 468879 79