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