Gutes Programmieren

Transcription

Gutes Programmieren
CNAM: Grundlagen der Programmierung 1 (Java)
Autor:
Datum:
Prof. Dr. Bernhard Humm, FB Informatik, FH Darmstadt
20. Dezember 2005
5. Praktikum am 21.12.2005: Gutes Programmieren
Vorbereitung
In diesem Praktikum geht es um die Klasse Book der Library Application. Sie können auf Ihrer
Lösung der letzten Praktika aufsetzen oder die Klasse neu implementieren. Alternativ können Sie die
Musterlösung von Praktikum 3 laden (siehe Kurzanleitung Eclipse). Legen Sie alle Ergebnisse in
einem neuen Package praktikum5 ab.
cd praktikum3
Comparable<Book>
Book
-
allBooks: SortedSet<Book> = new TreeSet<Book>()
author: String
id: String
title: String
+
+
+
+
+
+
+
+
+
Book(String, String, String)
compareTo(Book) : int
findBookById(String) : Book
getAllBooks() : Set<Book>
getAuthor() : String
getId() : String
getTitle() : String
newBook(String, String) : Book
toString() : String
Folgendes wird zu Beginn des Praktikums von der Klasse Book erwartet (weitere Attribute und
Methoden im UML-Diagramm werden in den nachfolgenden Aufgaben schrittweise hinzugefügt):
•
Instanzenvariablen id, author und title (alle vom Typ String)
•
Klassenvariable allBooks (SortedSet<Book>, initialisiert zu new TreeSet<Book>())
•
Konstruktor Book(String id, String author, String title)
•
Book implements Comparable ( Implementierung von compareTo)
20. Dezember 2005
Seite 1
CNAM: Grundlagen der Programmierung 1 (Java)
5. Praktikum am 21.12.2005
Aufgabe 1: Information Hiding
Falls nicht schon geschehen:
•
Deklarieren sie alle Instanzen- und Klassenvariablen als private.
•
Implementieren Sie für alle Variablen public get-Methoden. Implementieren Sie jedoch
keine set-Methoden (warum nicht?).
Aufgabe 2: IdGenerator
Implementieren Sie eine Klasse IdGenerator
cd IdGenerator
IdGenerator
-
counter: int
instance: IdGenerator = new IdGenerator(100)
+
+
+
+
getCounter() : int
getId() : String
getInstance() : IdGenerator
IdGenerator(int)
-instance
•
Klassenvariable IdGenerator instance = new IdGenerator(100)
•
Instanzenvariable int counter
•
Instanzenmethode String generateID(): gibt eine fortlaufende Nummer als String
aus.
Tipp: verwenden Sie Integer.toString(int) für die Konvertierung.
Der IdGenerator kann nun wie folgt verwendet werden:
IdGenerator.getInstance().getId().
Hinweis: die Bereitstellung genau einer Instanz einer Klasse nennt man auch Singleton Pattern.
20. Dezember 2005
Seite 2
CNAM: Grundlagen der Programmierung 1 (Java)
5. Praktikum am 21.12.2005
Aufgabe 3: newBook
Implementieren Sie eine Klassenmethode Book newBook(String author, String title).
Sie führt folgende Aufgaben durch:
•
Instanziierung eines Book-Objekts unter Verwendung des Konstruktors Book (String,
String)
•
Setzen der id unter Verwendung des IdGenerators
•
Einfügen des neuen Objekts in allBooks
Aufgabe 4: Assertions
Garantieren Sie, dass in newBook für beide Eingabeparameter weder null noch ein leerer String
eingegeben werden kann. Verwenden Sie das Java Schlüsselwort assert.
Aufgabe 5: findBookById
Implementieren Sie eine Instanzmethode Book findBookById(String id). Sie liefert aus
allBooks das Book-Objekt zurück, dessen id gleich (equals) zum Eingabeparameter ist.
Aufgabe 6: Exceptions
Implementieren Sie eine Klasse LibraryException extends Exception für fachliche Fehler
(checked exception). Implementieren Sie einen Konstruktor LibraryException(String
message).
Modifizieren Sie findBookById. Falls kein Book Objekt zur übergebenen id gefunden wird, soll
eine LibarayException geworfen werden mit dem Fehlertext “invalid book id“.
Aufgabe 7: JUnit Tests
Laden Sie das Package praktikum4.test von meiner Homepage in Ihr Projekt (siehe
Kurzanleitung Eclipse). Führen Sie PersonTest als JUnit-Test aus. Bei korrekter Implementierung
sollen keine Fehler auftreten.
20. Dezember 2005
Seite 3
CNAM: Grundlagen der Programmierung 1 (Java)
5. Praktikum am 21.12.2005
Aufgabe 8: Logging
Fügen Sie in alle wichtigen Methoden von IdGenerator und Book Log-Anweisungen ein.
Verwenden Sie den einfachen Log-Mechanismus: Logger.global.info(String message)
Aufgabe 9: JavaDoc
Dokumentieren Sie die Klasse Book vollständig mit Java Doc. Dokumentieren Sie insbesondere Vorund Nachbedingungen und geworfene Exceptions.
Generieren Sie HTML-Seiten für JavaDoc aus Eclipse mittels Project / Generate JavaDoc…
Optionale Aufgabe: Erweitertes Logging
Experimentieren Sie mit unterschiedlichen Logger Instanzen. Lesen Sie dazu die APIDokumentation der Klasse Logger.
Optionale Aufgabe: Erweiterte Exceptions
Erkennen Sie weitere fachliche Fehler.
Fügen Sie explizite fachliche Fehlerklassen als Unterklassen von LibraryException ein, zum
Beispiel InvalidBookIdException
Optionale Aufgabe: Eigene Junit Tests
Erweitern Sie die Junit Test Suite um eigene Testfälle
Optionale Aufgabe: Erweiterung auf die gesamte Library Application
Führen Sie alle Erweiterungen an der Book Klasse analog für die Klassen Person, Role und ihre
Unterklassen durch.
20. Dezember 2005
Seite 4