Folien 61-72 als PDF

Werbung
SWE-61
Zugriffsrechte
Information Hiding (Geheimnisprinzip): Nur die Klassen und die Elemente von Klassen
zugreifbar machen, die zur Benutzung vorgesehen sind (Schnittstelle) - z. B. keine
Implementierungsdetails.
Zugriffsrechte für Klassen:
public
benutzbar
class Circles {...}
class Circles {...}
Zugriffsrechte für Datenelemente und Methoden:
class Circles
{
void
public
void
private
void
protected void
move
move
move
move
(...)
(...)
(...)
(...)
{...}
{...}
{...}
{...}
im gleichen Package
in jedem Package
benutzbar
im gleichen Package
überall
in dieser Klasse
in dieser, in Unterklassen und
im gleichen Package
© 1999 bei Prof. Dr. Uwe Kastens
}
Stilregel:
Datenelemente immer private mit zugehörigen get- und set-Methoden, wenn nötig.
Vorlesung Software-Entwicklung / Folie 61
Ziele:
Zugriffsrechte sinnvoll einschränken
in der Vorlesung:
Erläuterungen dazu
nachlesen:
Judy Bishop: Java lernen, 3.Aufl., Abschnitt 8.2
Übungsaufgaben:
Verständnisfragen:
SWE-62
Richtlinien zum Entwurf von Klassen
1. Anzahl der Objekte zu einer Klasse: beim Entwurf klären, welcher Fall vorliegt:
- beliebig viele:
z. B. Circles im Graphikprogramm; Lieferung in der Lagerhaltung
- eine feste Anzahl: z. B. 3 Skatspieler mit verschiedenen Rollen
- genau eines:
z. B. der Motor im Auto, Nelsons Kaffeeladen
- keines:
z. B. zusammengehörige Klassenmethoden: trigonometrische
Funktionen, Java Gently‘s Text-Klasse.
2. Zusammengehörigkeit: Methoden und Datenelemente einer Klasse gehören eng
zusammen; Operationen und Eigenschaften bzw. Zustand einer Sorte von Objekten.
3. Zielorientiert modellieren: Nur die Operationen und Eigenschaften, die in der Anwendung
gebraucht werden - nicht alle Operationen und Eigenschaften, die real vorkommen.
© 1999 bei Prof. Dr. Uwe Kastens
4. Information Hiding (Geheimnisprinzip): Nur die Elemente zugreifbar machen, die für die
sinnvolle Benutzung nötig sind; enge Schnittstelle (SWE-61).
5. Datenzugriff nur über Methoden: Datenelemente private;
get- und set-Methoden soweit nötig;
festlegen, welche Datenelemente veränderlich sein sollen - explizit durch set-Methode oder
implizit durch andere Methoden.
6. Objektvariable über den Konstruktor initialisieren; durch Konstruktor-Parameter, wenn
sie bei der Objekterzeugung einstellbar sein sollen.
Vorlesung Software-Entwicklung / Folie 62
Ziele:
Einige einfache Regeln beachten
in der Vorlesung:
Erläuterungen dazu
nachlesen:
Judy Bishop: Java lernen, 3.Aufl., Abschnitt 5.1
Übungsaufgaben:
Prüfen Sie die bisher entworfenen Klassen an diesen Regeln
Verständnisfragen:
Begründen Sie, weshalb unnötig zugreifbare Elemente von Nachteil sind.
SWE-63
Entwurf eines objektorientierten Programms: Nelsons Kaffeeladen
In Nelsons Kaffeeladen soll ein Computer-Programm für die Lagerhaltung eingesetzt werden.
Nelson verkauft verschiedene Kaffeesorten, z. B. Java, Columbian, Kenyan.
Jede Lieferung zu einer bestimmten Sorte hat ein Verfalldatum. Sie wird deshalb nicht mit
früheren Lieferungen gemischt. Nelson verkauft jeweils aus der ältesten Sorte zuerst.
Beispiel für einen Zustand des Kaffelagers:
Columbian
65
Kenyan
15
60
23 Jul 1998
Datenelemente der
Klasse Coffee:
5
30 Jun 1998
Name
Preis
Menge
Wiederbestellmenge
Lieferungen
Anzahl der Lieferungen
15
19 May 1999
© 1999 bei Prof. Dr. Uwe Kastens
Datenelemente der
Klasse Batch:
Java
83
60
23 Aug 1998
20
22 Aug 1998
3
17 Jul 1998
Vorlesung Software-Entwicklung / Folie 63
Ziele:
Analyse einer Entwicklungsaufgabe lernen
in der Vorlesung:
Erläuterungen dazu
nachlesen:
Judy Bishop: Java lernen, 3.Aufl., Abschnitt 8.2
Übungsaufgaben:
Verständnisfragen:
Menge
Verfalldatum
SWE-64
Operationen zu Nelsons Kaffeladen
Operationen mit einer Kaffeesorte (Coffee):
• neue Sorte in das Lager aufnehmen
Daten dafür von einer Datei lesen
• Daten ausgeben
• Nachbestellen prüfen
• Preis ändern
• Lieferung einlagern
Operation „neue Lieferung“ von Batch benutzen
• Kaffee verkaufen
Operation „verkaufen“ von Batch benutzen
• überalterte Lieferungen vernichten
Operation „prüfe Verfall“ von Batch benutzen
• verfügbare Menge anzeigen
Operationen mit einer Lieferung (Batch):
© 1999 bei Prof. Dr. Uwe Kastens
• neue Lieferung
Daten dafür von einer Datei lesen
• Daten ausgeben
• Menge anzeigen
• prüfe Verfall
• verkaufen
Vorlesung Software-Entwicklung / Folie 64
Ziele:
Operationen entwerfen
in der Vorlesung:
Bedeutung der Operationen erarbeiten
nachlesen:
Judy Bishop: Java lernen, 3.Aufl., Abschnitt 8.2
Übungsaufgaben:
Verständnisfragen:
SWE-65
Entwurf der Klassen zu Nelsons Kaffeeladen
Zunächst nur Datenelemente und Signaturen der Methoden:
public class Batch
{ Batch (double k, Date d);
double available ();
boolean sell (double k);
void display ();
private double inStock; // Menge
private Date sellByDate;// Verfall
}
public class Coffee
{ Coffee (String s); // bei interaktiver Eingabe der Daten
Coffee ();
// zum Einlesen der Daten
© 1999 bei Prof. Dr. Uwe Kastens
void prepareToStock (BufferedReader in) throws IOException;
boolean newBatchIn (BufferedReader in) throws IOException;
void display ();
private
private
private
private
private
private
String name;
// Kaffeesorte
double price;
// Graz per kg
double stock;
// Menge im lager in kg
double reorder; // Menge, ab der nachbestellt wird, in kg
Batch [] B = new Batch [10]; // die Lieferungen
int batches = 0; // Anzahl der Lieferungen
}
Vorlesung Software-Entwicklung / Folie 65
Ziele:
Klassendeklaration verfeinern
in der Vorlesung:
• Typen der Datenelemente festlegen
• Signaturen der Methoden festlegen
nachlesen:
Judy Bishop: Java lernen, 3.Aufl., Abschnitt 8.2
Übungsaufgaben:
Lesen Sie die Erläuterungen nach. Implementieren Sie das Programm in den Übungen.
Verständnisfragen:
SWE-66
Datei-Format zu Nelsons Kaffeladen
Die Informationen zu Kaffeesorten und -lieferungen werden auf einer Datei gespeichert, so
dass daraus die Datenstruktur erzeugt werden kann.
Die Datei enthält eine Folge von Daten zu einer Kaffeesorte. Darin ist jeweils eine Folge von
Lieferungsdaten enthalten. Wir verwenden die Sentinel-Technik, um das Ende einer
Lieferungsfolge zu kennzeichnen.
Format:
Beispiel:
© 1999 bei Prof. Dr. Uwe Kastens
Name der Kaffeesorte
Preis Nachbestellgrenze
Liefermenge Verfalldatum
...
0
Columbian
59.95 10
10 15-Apr-97
25.5 31-May-97
0
Java
63.50 30
20 23-May-97
100 12-Jul-97
12.25 1-Aug-97
0
Kenyan
60.75 10
15.75 20-May-97
0
Vorlesung Software-Entwicklung / Folie 66
Ziele:
Entwurf eines Datei-Formates
in der Vorlesung:
Erläuterungen dazu
nachlesen:
Judy Bishop: Java lernen, 3.Aufl., Abschnitt 8.2
Übungsaufgaben:
Verständnisfragen:
Begründen Sie, weshalb nicht der Coffee-Konstruktor die Objektvariablen initialisiert, sondern die Methode
prepareToStock. Geben Sie dazu an, in welcher Reihenfolge Coffee-Objekte erzeugt werden und wie aus der Eingabe
gelesen wird.
SWE-67
Formatiert schreiben und lesen
Formate sind Objekte zu Klassen aus dem Package java.text.
Format-Objekte sind einstellbar.
Manche passen sich an landesübliche Schreibweisen an, z. B. Datum, Währung.
Beispiel: Datum lesen und schreiben:
import java.text.*;
import java.util.*;
import java.io.*; import javagently.*;
// für Formate
// für die Klasse Date
Locale.setDefault(Locale.GERMANY);// Umstellung auf deutsche Schreibweise
© 1999 bei Prof. Dr. Uwe Kastens
DateFormat DF = DateFormat.getDateInstance(); // Format-Objekt erzeugen
String s = Text.readString (in);
Date d;
try
{ d = DF.parse(s);
// DF.parse versucht, s als Datum zu entschlüsseln
} catch (ParseException e)
// das könnte misslingen ...
{ System.out.println ("Eingabefehler bei einem Datum");
d = new Date ();
// ersatzweise das Datum von heute
}
System.out.println ("Datum gespeichert: " + DF.format (d));
// d formatiert ausgeben
Vorlesung Software-Entwicklung / Folie 67
Ziele:
Format-Objekte anwenden
in der Vorlesung:
Erläuterungen am Beispiel
nachlesen:
Judy Bishop: Java lernen, 3.Aufl., Abschnitt 7.4, 7.5
Übungsaufgaben:
Probieren Sie die Ausgabe von Datumsangaben und Währungen für verschiedene Länder aus.
Verständnisfragen:
SWE-67a
Zwischenbilanz: allgemeine Sprachkonzepte
Spracheigenschaften
• imperativ, objektorientiert
• statisch typisiert
Programmausführung
• übersetzen, interpretieren
• abstrakte Maschine
• Variable und Zuweisungen
Klassen und Typen
• Typen, Werte und Operationen
• Klassen und Objekte
• Konversion, implizit und explizit
• Signatur von Funktionen, Methoden
• Überladene Operatoren und Methoden
• Lebensdauer von Variablen
• Laufzeitkeller
• Parameterübergabe
• Terminierung von Schleifen und Rekursion
• Zahldarstellung, 2er-Komplement
• Kurzauswertung logischer Formeln
• Ausnahmebehandlung
• abstrakter Datentyp
• rekursiv definierte Datentypen
• Binäre Bäume
allgemeine Konzepte
• Rekursion
• Ausdrücke in Infix-, Präfix-, Postfix-Form
• Wörterbücher
• Algorithmus Sortieren durch Auswahl
• Iteratoren
• Algorithmus Binäre Suche
Vorlesung Software-Entwicklung / Folie 67a
Ziele:
Bisher gelernte allgemeine Sprachkonzepte bewusst machen
in der Vorlesung:
Erläuterungen dazu
nachlesen:
Judy Bishop: Java lernen, 3.Aufl., Abschnitt bis 8.2
Übungsaufgaben:
Wiederholen Sie die genannten Themen.
Verständnisfragen:
SWE-67b
Zwischenbilanz: Java-Konstrukte
Deklarationen von
Typen:
• Klassen mit
• Grundtypen
- Konstruktoren,
- Objekt- und Klassenmethoden
- Objekt- und Klassenvariablen
• Variablen: Objekt-, Klassenvariable,
Parametervariable, lokale Variable
• Methoden (Funktionen)
• Klassen als Typen von Objektreferenzen
• Arrays
• Strings
• Enumeration
• Wrapper-Klassen
• Konversion
Anweisungen:
- für numerische Typen
- nach String
- von und nach Object
• Zuweisung
• Block
• überladene Operatoren und Methoden
• if-Anweisung
• for-, while-, do-Schleife
• Aufruf
Ausdrücke:
• Operatoren, Präzedenzen
• return-, break-Anweisung
• Literale
• try-Block mit Ausnahmebehandlung
• Variable, Konstante
• Eingabe, Ausgabe, Formate
• Aufrufe
• Bibliotheken nutzen
Vorlesung Software-Entwicklung / Folie 67b
Ziele:
Bisher gelernte Sprachkonstrukte von Java bewusst machen
in der Vorlesung:
Erläuterungen dazu
nachlesen:
Judy Bishop: Java lernen, 3.Aufl., Abschnitt bis 8.2
Übungsaufgaben:
Wiederholen Sie die genannten Themen
Verständnisfragen:
SWE-68
Lineare Listen
Lineare Listen repräsentieren Folgen gleichartiger* Elemente als
dynamisch veränderliche Datenstruktur mit linearem Zugriff:
1
2
3
4
5
Listen werden aus Paaren aufgebaut: (Elementwert, Referenz auf den Rest der Liste)
1
2
Einfügen eines Elementes:
3
4
5
7
© 1999 bei Prof. Dr. Uwe Kastens
Löschen eines Elementes:
(*) Implementierung in Java:
nicht notwendig gleichartige Elemente, Elemente sind Objektreferenzen der Klasse Object
Vorlesung Software-Entwicklung / Folie 68
Ziele:
Eine grundlegende Datenstruktur kennenlernen
in der Vorlesung:
Konzept und elementare Operationen erläutern
nachlesen:
Judy Bishop: Java lernen, 3.Aufl., Abschnitt 8.3
Übungsaufgaben:
Verständnisfragen:
Wie entfernt man das erste Element einer Liste?
SWE-69
Implementierung linearer Listen
• Klasse Node für Paare (Element, Rest der Liste):
ein Objekt dazu:
class Node
{ Node (Object d, Node n)
{data = d; link = n;}
Object data; Node link;
5
}
• Objektvariable sind von aussen zugänglich (für die ADT-Klasse List, siehe SWE-71)
• Die vordefinierte Klasse Object umfasst Objektreferenzen beliebiger Klassen
• Deklaration einer Listenvariable, initialisiert mit einer 1-elementigen Liste:
© 1999 bei Prof. Dr. Uwe Kastens
Node list = new Node (new Integer (5), null);
• Element muß ein Objekt sein, also „Wrapper“ (envelope) für Werte von Grundtypen
• null: vordefinierter Name für die einzige Referenz, die kein Objekt identifiziert
Vorlesung Software-Entwicklung / Folie 69
Ziele:
Java-Implementierung linearer Listen verstehen
in der Vorlesung:
• Hilfsklasse Node: nur Konstruktor und Objektvariable
• Elementtyp Object: wie bei allen Behälterklasse, z. B. für Wörterbücher
nachlesen:
Judy Bishop: Java lernen, 3.Aufl., Abschnitt 8.3
Übungsaufgaben:
Ersetzen Sie in der Deklaration der Klasse BinTree ( Folie 41) den Typ char durch die Klasse Object.
Verständnisfragen:
• Schreiben Sie eine mehrelementige Liste als geschlossenen Ausdruck.
SWE-70
Elementare Operationen mit linearen Listen
• Aufbauen einer Liste in umgekehrter Reihenfolge:
Node list = null;
for (int i = n; i > 0; i--)
list = new Node (new Integer (i), list);
• Einen Elementwert zahl in der Liste suchen:
Integer zahlObj = new Integer (zahl);
Node l = list;
while (l != null)
{ if (l.data.equals (zahlObj)) break;
l = l.link;
}
String s = ((l == null) ? s = " not" : "");
System.out.println (zahl + s + " found");
// s.u. (*)
// bedingter Ausdruck
• Ein Element d nach dem Paar l einfügen (l sei != null):
l.link = new Node (d, l.link);
© 1999 bei Prof. Dr. Uwe Kastens
• Ein Paar l mit Vorgänger prev löschen (l, prev seien != null):
prev.link = l.link;
Bei allen Operationen die Sonderfälle am Anfang und Ende der Liste beachten!
(*) equals ist für die Klasse Object definiert und wird von den Wrapper-Klassen als
Wertvergleich spezialisiert.
Vorlesung Software-Entwicklung / Folie 70
Ziele:
Umgang mit linearen Listen lernen
in der Vorlesung:
Operationen an Bildern verdeutlichen
nachlesen:
Judy Bishop: Java lernen, 3.Aufl., Abschnitt 8.3
Übungsaufgaben:
Listen von Strings implementieren, E/A dafür und Suchen darin
Verständnisfragen:
Wie fügt man ein Element VOR einem anderen ein?
SWE-71
Abstrakter Datentyp Liste
ADT- Operationen für Listen mit verschieblicher Position zum Lesen, Einfügen und Löschen:
start
prev
now
aktuelle Position:
class List
{ List();
public void insert (Object x)
{
// Konstruktor
// Element x hinter akt. Pos. einfügen
Node newElem = new Node (x, null);
// und neues Element wird aktuelle Position
if (start == null)
// Liste ist leer
{ start = newElem; now = newElem;}
else
if (now == null) // Position ist außerhalb der Liste, am Anfang einfügen
{ newElem.link = start; start = newElem; now = newElem; prev = null;}
else
{ newElem.link = now.link; now.link = newElem; prev = now; now = newElem;}
© 1999 bei Prof. Dr. Uwe Kastens
}
public void remove () {…}
public Object current () {…}
public void succ() {…}
public void reset () {…}
public boolean isEol () {…}
public boolean isEmpty () {…}
private Node start, prev, now;
// Element löschen
// Wert des Elementes
// Position weitersetzen
// Position an den Anfang
// ist die Position außerhalb der Liste?
// ist die Liste leer?
// die 3 lokalen Variablen
}
Vorlesung Software-Entwicklung / Folie 71
Ziele:
ADT Liste mit Position kennenlernen
in der Vorlesung:
Abstraktion und Technik erläutern
nachlesen:
Judy Bishop: Java lernen, 3.Aufl., Abschnitt 8.3
Übungsaufgaben:
Vervollständigen Sie die Implementierung
Verständnisfragen:
Eine Implementierung ohne die Objektvariable prev wäre auch möglich. Was ist ihr wesentlicher Nachteil?
SWE-72
Anwendung des ADT List: Nelsons Kaffeeladen
Das Array für die Lieferungen zu jeder Kaffeesorte wird durch ein List-Objekt ersetzt:
import List;
class Coffee
{
boolean newBatchIn (BufferedReader in) throws IOException
{ ...
BatchStock.insert (batch);
// gelesene Lieferung einfügen
}
© 1999 bei Prof. Dr. Uwe Kastens
double sell (Double toSell)
// eine Menge Kaffee verkaufen
{ ...
// die Liste der Lieferungen durchlaufen:
for (BatchStock.reset(); !BatchStock.isEol(); BatchStock.succ())
{ Batch b = (Batch)BatchStock.current();
// ... gewünschte Menge aus den Lieferungen entnehmen
}
return toSell;
}
...
private List BatchStock = new List ();
}
Ebenso in der Klasse CoffeeShop ein List-Objekt mit den Kaffeesorten einführen.
Vorlesung Software-Entwicklung / Folie 72
Ziele:
Den ADT List benutzen lernen
in der Vorlesung:
Anwendung der Listenoperationen am Beispiel zeigen
nachlesen:
Judy Bishop: Java lernen, 3.Aufl., Abschnitt 8.4
Übungsaufgaben:
Vervollständigen Sie das Kaffeeladen-Programm und testen es.
Verständnisfragen:
• Begründen Sie weshalb es einfacher ist, den ADT List anzuwenden als lineare Listen direkt zu programmieren.
• Zeigen Sie, wo im Programm Objekte an den Typ Object und vom Typ Object an einen anderen angepasst werden.
Herunterladen