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.