Programmierkurs Java

Werbung
Programmierkurs Java
Teil
Objektorientierte Programmierung
Unterrichtseinheit 36
Dokumentation
Dr. Dietrich Boles
Programmierkurs Java
UE 36
Dokumentation
Dietrich Boles
Seite 1
Gliederung
 Programmdokumentation
 Dokumentation der Implementierung
 Java-Bezeichnerkonventionen
 Dokumentation des Protokolls / javadoc
 Beispiel ADT-Klasse Cardinal
 Zusammenfassung
Programmierkurs Java
UE 36
Dokumentation
Dietrich Boles
Seite 2
Programmdokumentation
 2 Typen von Sourcecode-Dokumentation:
(1) Dokumentation des Protokolls
(2) Dokumentation der Implementierung
 Motivation für (1):
 Beschreibung der Funktionalität einer Klasse / Methode für andere
Programmierer
 Motivation für (2):
 bessere Verständlichkeit der gewählten Algorithmen
 einfachere Fehlersuche und Fehlerbeseitigung
 einfachere Wartung, Änderbarkeit und Erweiterbarkeit des Codes
Programmierkurs Java
UE 36
Dokumentation
Dietrich Boles
Seite 3
Dokumentation der Implementierung (1)
 Dokumentation der Implementierung in Java:
 aussagekräftige Bezeichner (Klassen / Methoden / Variablen)
verwenden
 den Code gut strukturieren
 an "kritischen" Stellen Zeilenkommentare einbauen
 Java-Code-Konventionen!
Schlechtes Beispiel:
public class M {
public static int s(int x) {
int r = 0;
for(int i=1; i<=x; i++) { r = r + i; }
return r; } }
Programmierkurs Java
UE 36
Dokumentation
Dietrich Boles
Seite 4
Dokumentation der Implementierung (2)
Gutes Beispiel:
public class Mathematik {
public static int summe(int bis) {
int ergebnis = 0;
// Zahlen von 1 bis "bis" addieren
for(int i=1; i<=bis; i++) {
ergebnis = ergebnis + i;
}
return ergebnis;
}
public static int fakultaet(int n) {
...
}
}
Programmierkurs Java
UE 36
Dokumentation
Dietrich Boles
Seite 5
Java-Bezeichnerkonventionen
 Klassen:
 Anfangsbuchstaben jedes Wortteils groß
 DibosSchachProgramm
 ArrayIndexOutOfBoundsException
 Attribute / Variablen:
 Beginn mit Kleinbuchstaben; Anfangsbuchstaben weiterer Wortteile groß
 anzahlAnZeichen
 maximaleGroesse
 Methoden:
 Beginn mit Kleinbuchstaben; Anfangsbuchstaben weiterer Wortteile groß
 getNumber
 liefereNaechstenSpielzug
 Konstanten:
 ausschließlich Großbuchstaben; Trennung von Wortteilen durch
Unterstrich (_)
 MAX_VALUE
 INVALID_PARAM
Programmierkurs Java
UE 36
Dokumentation
Dietrich Boles
Seite 6
Dokumentation des Protokolls / javadoc
 javadoc: Werkzeug des JDK zur Generierung von HTML-Code zur
Dokumentation des Protokolls einer oder mehrerer Klassen:
 Aufruf:
javadoc <.java-Datei(en)>
 Voraussetzung: Verwendung von javadoc-Kommentaren und javadocSchlüsselwörtern
 javadoc-Kommentare:
/** <zeichen> */
 javadoc-Schlüsselwörter:
 Beschreibung von Klassen:
Beschreibung der Funktionalität
@version <text>
@author <text>
 Beschreibung von Methoden:
Beschreibung der Funktionalität
Vorbedingungen, Nachbedingungen
@param <name> <beschreibung>
@return <beschreibung>
@throws <klassenname> <beschreibung>
Programmierkurs Java
UE 36
Dokumentation
Dietrich Boles
Seite 7
Dokumentation des Protokolls / javadoc-Beispiel (1)
/**
* Repraesentation von objektorientierten Hamstern im
* Java-Hamster-Modell
*
* @author Dietrich Boles (Universitaet Oldenburg)
* @version 1.0 (25.01.2006)
*
*/
public class Hamster {
/**
* Blickrichtung Nord
*/
public final static int NORD = 0;
/**
* Blickrichtung Ost
*/
public final static int OST = 1;
/**
* Blickrichtung Sued
*/
public final static int SUED = 2;
/**
* Blickrichtung West
*/
public final static int WEST = 3;
Programmierkurs Java
UE 36
Dokumentation
Dietrich Boles
Seite 8
Dokumentation des Protokolls / javadoc-Beispiel (2)
/**
* Konstruktor zum Erzeugen und Initialisieren eines Hamsters
* mit den uebergebenen Parametern
*
* @param reihe
*
die Reihe des Territoriums, in der der Hamster
*
erzeugt wird
* @param spalte
*
die Spalte des Territoriums, in der der Hamster
*
erzeugt wird
* @param blickrichtung
*
die Richtung, in der der Hamster anfangs schaut
*
(siehe Konstanten)
* @param anzahlKoerner
*
die Anzahl an Koernern, die der Hamster anfangs
*
im Maul hat
* @throws HamsterInitialisierungsException
*
wird geworfen, wenn: (a) eine Kachel
*
(reihe/spalte) nicht existiert
*
(b) die Kachel (reihe/spalte) durch eine Mauer
*
blockiert ist
*
(c) der Wert von blickrichtung nicht zwischen 0
*
und 3 liegt
*
(d) der Wert von anzahlKoerner < 0 ist
*/
public Hamster(int reihe, int spalte, int blickrichtung,
int anzahlKoerner)
throws HamsterInitialisierungsException { ... }
Programmierkurs Java
UE 36
Dokumentation
Dietrich Boles
Seite 9
Dokumentation des Protokolls / javadoc-Beispiel (3)
/**
* Der aufgerufene Hamster springt auf die in Blickrichtung
* vor ihm liegende Kachel.
*
* @throws HamsterNichtInitialisiertException
*
wird geworfen, wenn der Hamster noch nicht
*
initialisiert worden ist
* @throws MauerDaException
*
wird geworfen, wenn die Kachel in Blickrichtung
*
vor dem Hamster durch eine Mauer blockiert ist
*
oder der Hamster in Blickrichtung am Rand des
*
Territoriums steht
*/
public void vor()
throws HamsterNichtInitialisiertException,
MauerDaException { ... }
Programmierkurs Java
UE 36
Dokumentation
Dietrich Boles
Seite 10
Dokumentation des Protokolls / javadoc-Beispiel (4)
/**
* liefert genau dann true, wenn sich in Blickrichtung vor dem
* aufgerufenen Hamster keine Mauer befindet (wenn sich der
* Hamster in Blickrichtung am Rand des Territoriums befindet,
* wird false geliefert)
*
* @return true, wenn sich in Blickrichtung vor dem aufgerufenen
*
Hamster keine Mauer befindet; sonst false
* @throws HamsterNichtInitialisiertException
*
wird geworfen, wenn der Hamster noch nicht
*
initialisiert worden ist
*/
public boolean vornFrei()
throws HamsterNichtInitialisiertException {
...
}
Programmierkurs Java
UE 36
Dokumentation
Dietrich Boles
Seite 11
Dokumentation des Protokolls / javadoc-Beispiel (5)
/**
* gibt den uebergebenen String auf den Bildschirm aus und
* fordert den Benutzer auf, einen String einzugeben; der
* eingegebene String wird als Wert geliefert
*
* @param aufforderung
*
der auszugebende String
* @return der vom Benutzer eingegebene String
* @throws HamsterNichtInitialisiertException
*
wird geworfen, wenn der Hamster noch nicht
*
initialisiert worden ist
*/
public String liesZeichenkette(String aufforderung)
throws HamsterNichtInitialisiertException {
...
}
...
}
Programmierkurs Java
UE 36
Dokumentation
Dietrich Boles
Seite 12
Dokumentation des Protokolls / javadoc-Beispiel (6)
Programmierkurs Java
UE 36
Dokumentation
Dietrich Boles
Seite 13
Beispiel ADT-Klasse Cardinal (1)
package number;
import io.IO;
/**
* ADT-Klasse zur Repraesentation Natuerlicher Zahlen als Objekte.
*
* @author Dietrich Boles
* @version 2.0, 06.03.2005
*/
public class Cardinal {
/**
* speichert den eigentlichen Wert
*/
protected int wert;
Programmierkurs Java
UE 36
Dokumentation
Dietrich Boles
Seite 14
Beispiel ADT-Klasse Cardinal (2)
/**
* Default-Konstruktor; initialisiert mit dem Wert 0
*/
public Cardinal() {
this.wert = 0;
}
/**
* Konstruktor; initialisiert mit dem uebergebenen Wert
*
* @param w
*
Initial-Wert
* @throws NegativerWertException
*/
public Cardinal(int w) throws NegativerWertException {
if (w < 0)
throw new NegativerWertException(w);
this.wert = w;
}
Programmierkurs Java
UE 36
Dokumentation
Dietrich Boles
Seite 15
Beispiel ADT-Klasse Cardinal (3)
/**
* Copy-Konstruktor; initialisiert mit einem existierenden Objekt
*
* @param obj
*
existierendes Cardinal-Objekt (!= null)
*/
public Cardinal(Cardinal obj) {
this.wert = obj.wert;
}
/**
* Klonieren eines Cardinal-Objektes
*
* @return kloniertes Cardinal-Objekt
*/
public Object clone() {
return new Cardinal(this);
}
Programmierkurs Java
UE 36
Dokumentation
Dietrich Boles
Seite 16
Beispiel ADT-Klasse Cardinal (4)
/**
* String-Konvertierung
*
* @return Wert des Cardinal-Objektes als String-Repraesentation
*/
public String toString() {
return "" + this.wert;
}
/**
* Aufaddieren eines anderen Cardinal-Objektes
*
* @param obj
*
anderes Cardinal-Objekt (!= null)
*/
public void add(Cardinal obj) {
this.wert = Cardinal.add(this, obj).wert;
}
Programmierkurs Java
UE 36
Dokumentation
Dietrich Boles
Seite 17
Beispiel ADT-Klasse Cardinal (5)
/**
* Addieren zweier Cardinal-Objekte
*
* @param obj1
*
erstes Cardinal-Objekt (!= null)
* @param obj2
*
zweites Cardinal-Objekt (!= null)
* @return Summe der beiden Parameter-Objekte
*/
public static Cardinal add(Cardinal obj1, Cardinal obj2) {
try {
if (obj1.wert + obj2.wert >= 0) {
return new Cardinal(obj1.wert + obj2.wert);
} else { // Summe > Integer.MAX_VALUE
return new Cardinal(obj1.wert + obj2.wert –
Integer.MIN_VALUE);
}
} catch (NegativerWertException exc) {
// kann nicht sein
return null;
}
}
Programmierkurs Java
UE 36
Dokumentation
Dietrich Boles
Seite 18
Beispiel ADT-Klasse Cardinal (6)
/**
* Dividieren zweier Cardinal-Objekte
*
* @param divident
*
Divident als Cardinal-Objekt (!= null)
* @param divisor
*
Divisor als Cardinal-Objekt (!= null)
* @return Quotient der beiden Parameter-Objekte
* @throws DivNullException
*/
public static Cardinal div(Cardinal divident, Cardinal divisor)
throws DivNullException {
if (divisor.wert == 0)
throw new DivNullException();
try {
return new Cardinal(divident.wert / divisor.wert);
} catch (NegativerWertException exc) {
// kann nicht sein
return null;
}
}
Programmierkurs Java
UE 36
Dokumentation
Dietrich Boles
Seite 19
Beispiel ADT-Klasse Cardinal (7)
// Testprogramm
public static void main(String[] args) {
try {
int eingabe1 = IO.readInt("Natuerliche Zahl: ");
int eingabe2 = IO.readInt("Natuerliche Zahl: ");
Cardinal nat1 = new Cardinal(eingabe1);
Cardinal nat2 = new Cardinal(eingabe2);
Cardinal nat3 = Cardinal.div(nat1, nat2);
IO.println("Divisor: " + nat2);
IO.println("Divident: " + nat1);
IO.println("Quotient = " + nat3);
} catch (NegativerWertException exc) {
IO.println("negativer Wert: " + exc.getWert());
} catch (DivNullException exc) {
IO.println("Division durch Null!");
}
}
}
Programmierkurs Java
UE 36
Dokumentation
Dietrich Boles
Seite 20
Beispiel ADT-Klasse Cardinal (8)
package number;
/**
* Fehlerklasse fuer die Division durch 0
*
* @version 2.0, 06.03.2005
* @author Dietrich Boles
*/
public class DivNullException extends Exception {
}
Programmierkurs Java
UE 36
Dokumentation
Dietrich Boles
Seite 21
Beispiel ADT-Klasse Cardinal (9)
package number;
/**
* Fehlerklasse fuer negative Zahlenwerte
*
* @version 2.0, 06.03.2005
* @author Dietrich Boles
*/
public class NegativerWertException extends Exception {
/**
* der fehlerhafte Wert
*/
protected int wert;
Programmierkurs Java
UE 36
Dokumentation
Dietrich Boles
Seite 22
Beispiel ADT-Klasse Cardinal (10)
/**
* Konstruktor; initialisiert mit uebergebenem Wert
*
* @param wert
*
Initial-Wert
*/
public NegativerWertException(int wert) {
this.wert = wert;
}
/**
* get-Methode zum Liefern des (negativen) Wertes
*
* @return aktueller Wert des Attributes "wert"
*/
public int getWert() {
return this.wert;
}
Demo
}
Programmierkurs Java
UE 36
Dokumentation
Dietrich Boles
Seite 23
Zusammenfassung
 Typen von Sourcecode-Dokumentation:
 Dokumentation des Protokolls ( javadoc)
 Dokumentation der Implementierung
 Sinn und Zweck:
 Nutzung von Klassen
 einfachere Fehlersuche und Fehlerbeseitigung
 einfachere Wartung, Änderbarkeit und Erweiterbarkeit des Codes
Programmierkurs Java
UE 36
Dokumentation
Dietrich Boles
Seite 24
Herunterladen