Inhalt: Objekte ohne Methoden Objekte mit einfachen Methoden Objekte und Methoden mit Parametern Objekte und Methoden mit Rückgabewert Objekte mit einem Array als Attribut Beziehungen zwischen Objekten I Beziehungen zwischen Objekten II Übersicht Beziehungstypen Konstruktoren Vererbung Sequenzdiagramme mit UML Datenbankanbindung Softwareentwicklung und Wasserfallmodell Version 1.7.5 1
Objektorientierte Softwareentwicklung 2
Beispiel: Für ein Vektorzeichenprogramm sollen Rechtecke als Objekte verwaltet werden. Vorüberlegung: Welche allgemeinen Eigenschaften hat ein Rechteck? 3
Welche allgemeinen Eigenschaften hat ein Rechteck? Farbe Seite A (Länge) Seite B (Länge) 4
Die allgemeinen Eigenschaften werden in einer so genannten Klasse festgehalten. Klassen werden in UML wie folgt dargestellt: Klassenname Attribute mit Datentypen 5
Klassen in UML-Darstellung werden wie folgt in JAVA umgesetzt: Datei Rechteck.java: 6
Es sollen zwei konkrete Rechtecke mit den Namen r1 und r2 als Objekte aus der Klasse Rechteck erzeugt und getestet werden: 7
Die Objekte werden innerhalb einer anderen Datei (hier Testrechteck.java) erzeugt. Diese Datei und die Datei Rechteck.java müssen im selben Verzeichnis liegen! Hier startet das Programm Objekt erzeugen Objekt mit Werten füllen. 8
Objektorientierte Softwareentwicklung 9
Bislang ist das Objekt rein passiv. Es können über die Attribute nur Werte zugewiesen bzw. wieder ausgelesen werden. Um den Objekt eigene Funktionalität zu geben müssen Methoden (Operationen, Funktionen) zugefügt werden. 10
Dem Objekt Rechteck soll eine Methode zur Ausgabe der Objektsdaten auf dem Bildschirm hinzugefügt werden. Diese Methode soll zeigedaten heißen. 11
Methoden werden im unteren Teil aufgelistet. Methodenname 12
13
Datei Rechteck.java: Zugriff die eigenen Objektattribute. 14
Datei Testrecheck.java 15
16
Programmcode ausführen Programmcode übersetzen Datei Testrechteck.java: Datei Rechteck.java: 17
Objektorientierte Softwareentwicklung 18
Bislang werden die Objektattribute durch direkten Zugriff von außen gesetzt. Dies hat den Nachteil, dass das Objekt keine Möglichkeit hat auf fehlerhafte Wertzuweisungen zu reagieren. Zum Setzen der Attribute ist es daher sinnvoll Methoden einzusetzen. Diese können dann ggf. fehlerhafte Wertzuweisungen abfangen. 19
Sie Klasse Rechteck soll durch zwei Methoden setzea und setzeb erweitert werden. Diese Methoden sollen die Objektattribute seitea und seiteb setzen und überprüfen, ob die Werte positiv sind. Bei negativen Werten soll eine Fehlermeldung ausgegeben werden. 20
Vorüberlegungen: 1. Braucht die Methode Parameter? JA, der Methode muss eine Länge übergeben werden. Der Parameter muss vom Typ double sein, da die Seitenlänge eine Kommazahl sein kann. 21
Methodenname Ein Parameter vom Typ double Der Parameter hat den Namen a. Unter diesem Namen kann der Parameter angesprochen werden. 22
Test, ob a positiv Setzen den Attributs seitea Auf den übergebenen Wert. Fehlermeldung falls a negativ. 23
Objekt erzeugen Objektattribute über die Methoden setzen. Wert negativ. Liefert eine Fehlermeldung. 24
25
Objektorientierte Softwareentwicklung 26
Ein Programm soll ein Rechteckobjekt erzeugen und mit den Methoden setzea und setzeb die Seitenlängen setzen. Nur wenn das Rechteck fehlerfrei d.h. mit positiven Werten für a und b - erzeugt wurde, sollen die Objektdaten auf dem Bildschirm ausgegeben werden. 27
Problem: Das Programm, welches das Objekt Rechteck erzeugt, weiß nicht, ob die Attribute korrekt gesetzt wurden. 28
Lösung: Die Methoden, welche die Seitenlängen setzen, müssen nach außen mitteilen, ob das Setzen erfolgreich war. 29
Die Funktion hat ein Rückgabewert vom Typ boolean. Wenn die Attribute korrekt gesetzt wurden soll die Methode true zurückgeben, sonst false. 30
Rechteck +seitea: double +seiteb: double +farbe: String +setzea(a: double): boolean +setzeb(b: double): boolean Mitteilen des Ergebnis Nach außen. 31
32
33
Objektorientierte Softwareentwicklung 34
Es soll eine Klasse Messwerte entwickelt werden: Diese Klasse kann bis zu 100 Messewerte verwalten. Die Klasse hat Methoden um einen neuen Messwert hinzuzufügen (alle bisherigen Messwerte sollen erhalten bleiben), alle bislang gespeicherten Messwerte auf dem Bildschirm auszugeben, um den Durchschnitt aller Messwerte zu berechnen. 35
Problem: Wie sollen bis zu 100 Werte als Objektattribute verwaltet werden? Lösung 1: Es werden 100 Attribute angelegt. Schlechte Lösung da: Hoher Aufwand 100 Variablen anzulegen! Aufwendige Programmierung, da 100 Attributnamen. Unflexibel, da Programm schwierig zu erweitern, wenn noch mehr Werte verwaltet werden sollen. 36
Lösung: es muss ein Array als Attribut verwendet werden, welches die Messwerte speichert. Problem: Das Array weiß nur, wie viele Werte es maximal (100) aufnehmen kann. Es weiß aber nicht, welche Position im Array als nächstes frei ist. Lösung: Das Objekt muss sich merken, welches die nächst freie Position ist. 37
Messwerte -werte: double[0..100] -freieposition: int = 0 +werthinzufuegen(double wert): void +zeigeallewerte(): void +berechnedurchschnitt(): double 38
39
40
Objektorientierte Softwareentwicklung 41
Für eine Versicherungsfirma soll eine objektorientierte Software zur Verwaltung von Fahrzeugen und Kunden entwickelt werden. Jedem Auto soll dabei ein Kunde als Besitzer zugeordnet werden. 42
? Anmerkung: Die Attribute sind nur exemplarisch vorhanden und es sind keine Methoden dargestellt. 43
Rollenname Assoziationsname Auto +hersteller: String +baujahr: int +haftpflichtklasse: int gehört Kardinalität +Besitzer 1 Kunde +nummer: int +vorname: String +nachname: String Assoziation 44
Auto +hersteller: String +baujahr: int +haftpflichtklasse: int gehört +Besitzer 1 Kunde +nummer: int +vorname: String +nachname: String 45
a1 : Auto hersteller = "Volkswagen" baujahr = 2008 haftpflichtklasse = 12 k1 : Kunde nummer = 1234 vorname = "Max" nachname = "Mustermann" 46
Anmerkung: Der Einfachheit halber wurde direkt auf die Objektattribute zugegriffen. Für das Setzen der Attribute sollten Setzen-Methoden bereitgestellt werden. Dies gilt auch für das Herstellen der Beziehung. Siehe dazu auch die entsprechende Übung. 47
Objektorientierte Softwareentwicklung 48
Es soll eine objektorientierte Software zur Verwaltung von Schülern und Schulklassen entwickelt werden. Sowohl Schüler als auch Schulklassen sollen in der Software als Objekte repräsentiert werden. Eine Schulklasse soll über eine Methode zum Hinzufügen eines Schülers und eine Methode zum Anzeigen aller Schüler verfügen. 49
Darstellung eines Schülers: 50
Darstellung einer Schulklasse: 51
Beziehung zwischen Schulklasse und Schüler? 52
Schulklasse Schueler -bezeichnung: String -schulform: String +setzebezeichnung(bezeichnung: String): void +setzeschulform(form: String): void +schuelerhinzufuegen(s: Schueler): void +zeigeschueler(): void hat +SchuelerInKlasse * -name: String -vorname: String -nummer: int +setzename(name: String): void +setzevorname(vorname: String): void +setzenummer(nummer: int): void Das * bedeutet: in einer Klasse befinden sich viele/mehrere Schüler. 53
Testbeispiel-Objektstruktur: k1 : Schulklasse bezeichnung="12foi2" schulform="fos" s1 : Schueler name="simpson" vorname="bart" nummer=1234 s2 : Schueler name="van Houten" vorname="milhouse" nummer=4321 54
Schulklasse Schueler -bezeichnung: String -schulform: String +setzebezeichnung(bezeichnung: String): void +setzeschulform(form: String): void +schuelerhinzufuegen(s: Schueler): void +zeigeschueler(): void hat +SchuelerInKlasse * -name: String -vorname: String -nummer: int +setzename(name: String): void +setzevorname(vorname: String): void +setzenummer(nummer: int): void Für die Klasse Schueler gibt es keine Besonderheiten. Sie wird wie gehabt implementiert (siehe nächste Folie). 55
56
Problem: Die Klasse Schulklasse muss sich viele Schüler merken. Schulklasse Schueler -bezeichnung: String -schulform: String +setzebezeichnung(bezeichnung: String): void +setzeschulform(form: String): void +schuelerhinzufuegen(s: Schueler): void +zeigeschueler(): void hat +SchuelerInKlasse * -name: String -vorname: String -nummer: int +setzename(name: String): void +setzevorname(vorname: String): void +setzenummer(nummer: int): void Lösung: Die Klasse Schulklasse merkt sich in einem Array alle Schüler. 57
Lösung: Die Klasse Schulklasse merkt sich in einem Array alle Schüler. Dabei ist folgendes zu überlegen: Das Array ist vom Typ Schueler. Das Array muss groß genug sein (z.b. 50). Das Array muss einen Namen haben (hier: SchülerInKlasse). Das Array wird der Reihe nach aufgefüllt. Die erste Position ist daher die 0, die letzte die 49 (da 50 Einträge). Man muss sich merken, welches die nächste freie Position im Array ist. Alle Plätze davor sind belegt. 58
Array für Schüler Variable für freie Position Schüler in Array einfügen freie Position eins weiter schalten Alle Schüler im Array der Reihe nach ausgeben. 59
60
Objektorientierte Softwareentwicklung 61
Gerichtete Assoziation: Klasse A kennt / benutzt Klasse B. Umsetzung: Referenz auf Klasse B in Klasse A. Assoziation: Klasse C kennt / benutzt Klasse D und umgekehrt (Beziehung geht in beide Richtungen). Umsetzung: Die Klassen referenzieren sich gegenseitig. 62
Aggregation: Komposition: Aggregationen bzw. Kompositionen sind spezielle Assoziationen, die "Teile/Ganzes"-Beziehung beschreiben. Das "Teil des "Ganzen kann bei der Aggregation auch einzeln existieren, bei der Komposition nur, wenn auch das "Ganze" existiert. Das "Ganze" befindet sich auf der Seite der Raute. Bei der Implementierung werden Aggregationen und Kompositionen häufig nicht anders als normale Assoziationen behandelt. 63
Beispiel für eine Aggregation: Die Räder sind Teil von einem Auto und können auch ohne das Auto existieren. Beispiel für eine Komposition: Ein Gehirn ist ein Teil von einem Menschen. Ohne den Menschen kann das Gehirn aber nicht existieren. 64
Objektorientierte Softwareentwicklung 65
Die Aufgabe des Konstruktors ist es bei der Objekterzeugung bestimmte Vorbereitungen zu erledigen (z.b. Variablen mit Startwerten zu belegen), ohne die ein Arbeiten mit dem Objekt nicht möglich ist.
Es soll eine Klasse Rechteck entwickelt werden. Bereits bei Objekterzeugung sollen die Seitenlängen gesetzt werden. Es wird ein Konstruktor zum Setzen der Seitenlängen benötigt: 67
Konstruktoren werden als spezielle Methoden aufgeführt. 68
Implementierung der Klasse Rechteck: Objekterzeugung: Nicht mehr möglich ist jedoch: 69
Die Klasse Rechteck soll erweitert werden: Die Objekterzeugung ohne Werteübergabe bei Objekterzeugung soll ermöglich werden. Zusätzlich soll bei Objekterzeugung optional auch das Attribut Farbe gesetzt werden können. 70
Es werden mehrere Konstruktoren eingeführt. Diese können wahlweise für die Objekterzeugung verwendet werden. 71
Implementierung der Klasse Rechteck: Möglichkeiten der Objekterzeugung: 72
Objektorientierte Softwareentwicklung 73
Für einen Betrieb ist eine Mitarbeiterverwaltung zu entwickeln. In dem Betrieb gibt es zwei Arten Mitarbeiter: Angestellte und Arbeiter Angestellte erhalten einen Basislohn und eine Provision, während Arbeiter einen Stundenlohn erhalten. 74
Angestellte und Arbeiter haben als Mitarbeiter gemeinsame Eigenschaften (Name, Vorname,..) und Methoden. Zusätzlich haben die Mitarbeiter spezielle Eigenschaften und Methoden, die sich voneinander unterscheiden je nachdem, ob die Angestellte oder Arbeiter sind. Idee: Gemeinsamkeiten zusammenfassen und nach Unterschieden spezialisieren. 75
Spezialisierung Generalisierung Gemeinsamkeiten Unterschiede Alle Angestellte und Arbeiter haben / erben alle Eigenschaften und Methoden von Mitarbeitern und erweitern diese entsprechend. Überlegung: Wie müssen sich die Methoden berechnegehalt und zeigedaten verhalten? Neu: Sichtbarkeit protected (Zugriff von außen verboten, aber Erben können zugreifen) 76
77
78
79
80
81
Objektorientierte Softwareentwicklung 82
UML Sequenzdiagramme dienen dazu Interaktionen zwischen Objekten darzustellen. Objekte interagieren über Methodenaufrufe miteinander. 83
Ein Kunde will an einem Bankautomat Geld abheben. Benötigte Schnittstellen: 84
85
Mehrfach Geld abheben: 86
Nur Geldabheben, wenn erfolgreich im System eingeloggt: 87
Entweder Einzahlen oder Auszahlen je nach Kontostand: 88
Objektorientierte Softwareentwicklung 89
Treiber JAVA- Programm JDBC-API Datenbank Installation des MySQL-Treibers: 1. Datei mysql-connector-java-5.1.6-bin.jar in das Verzeichnis \lib\ext der Java-Laufzeitumgebung kopieren. 2. Unter Eclipse: Datei mysql-connector-java-5.1.6-bin.jar importieren. 90
Kommunikation eines JAVA Programms mit einer MySQL-Datenbank: Verbindung aufbauen MySQL-Befehle generieren MySQL-Befehl(e) abschicken MySQL-Befehle ggf. auswerten Verbindung schließen 91
Es soll auf eine MySQL-Datenbank mit Namen verwaltung zugegriffen werden. In die Tabelle mitarbeiter sollen Daten eingefügt werden. Aus der Tabelle mitarbeiter sollen alle Datensätze ausgelesen und auf dem Bildschirm angezeigt werden. 92
93
94
95
Objektorientierte Softwareentwicklung 96
schrittweise und systematische Vorgehensweise in der Softwareentwicklung Softwareentwicklungsprozess ist in Phasen organisiert jede Phase hat definierte Start- und Endpunkte mit eindeutig definierten Ergebnissen. die Ergebnisse einer Phasen sind bindende Vorgaben für die nächst tiefere Phase ein ( Wasserfall ). Aufwärtslaufen in den Phasen möglich, sofern in der aktuellen Phase etwas schieflaufen sollte, um den Fehler auf der nächsthöheren Stufe beheben zu können. 97
98
Arbeitsauftrag, Lastenheft Was wird benötigt? Was soll programmiert werden? Umsetzung in eine Programmiersprache (z.b. JAVA) Klassen, Attribute, Methoden, Schnittstellen, Beziehungen, UML Testfälle überlegen, Testen der Umsetzung Alltagsbetrieb der Software, neuer Prozess bei Fehlern oder Erweiterungen notwendig. 99
Autor: Christian Frye Version: 1.7.5 Datum: 26. März 2012 Web: http://moodle.erasmus-kittler-schule.de http://www.eks-darmstadt.de Mail: christian.frye@erasmus-kittler-schule.de 100