Controller

Werbung
01.04.2004
YOU ARE HERE
Das MVC-Modell
•
•
•
•
•
•
•
•
•
• Model-View-Controller (MVC) ist eines der bekanntesten
Entwurfsmuster
• Ein Entwurfsmuster ist ein bewährter Lösungsansatz
Einführung
Objektorientierte Modellierung
Java-Sprachkonstrukte
Java-Klassenbibliothek
Zeichenketten
Dateien und Streams
Datenstrukturen
Networking
Grafische Benutzungsoberflächen
• MVC trennt Datenhaltung von Datendarstellung
• Model hält Daten einer Anwendung
Controller
• View für graphische Repräsentation der Daten
übermittelt
Interaktionen
• Controller übersetzt Benutzereingaben
Zugriff und
im View in Änderungen am Zustand
Änderungen Ruft auf
des Models
• Komponenten und Container
• Layout-Management
• Pluggable Look & Feel
MVC-Paradigma
• Event Handling
• Menüs
• Programmierstil
• Extensible Markup Language
Model
aktualisiert
View
holt Daten
Java-Praxiskurs
1
MVC-Beispiel
window
2
MVC: Model
window
a b c
x 60 30 10
y 50 30 20
z 80 10 20
Java-Praxiskurs
• Das Model enthält den funktionalen Anwendungskern.
• Es kapselt die enstprechenden Daten und bietet
Operationen an.
• Diese werden vom Controller aufgerufen.
window
A
C
A
B
B
• Zusätzlich bietet das Model Operationen zum Zugriff auf
Daten, die die Views brauchen, um Daten abzufragen.
C
change notification
a=50%
b=30%
c=20%
• Das Model verwaltet die abhängigen Komponenten.
requests, modifications
• Alle Ansichten und einige Controller (diejenigen, die mit
Views zusammenhängen, von denen Änderungen
veranlasst werden) lassen sich beim Model registrieren.
Java-Praxiskurs
3
Java-Praxiskurs
MVC: View
MVC: Controller
• Views präsentieren dem Anwender Informationen.
• Jede View definiert eine Aktualisierungsoperation, die vom
Änderungsmechanismus des Models aufgerufen wird.
• Diese Änderungsoperation ermittelt die anzuzeigenden
Werte und zeigt sie an.
• Ein Controller-Objekt akzeptiert Bedieneingaben als
Ereignisse.
• Ereignisse werden in Anforderungen an das Model oder die
assoziierte View übersetzt.
• Wenn das Verhalten eines Controllers vom Zustand des
Models abhängt, lässt sich der Controller beim
Mechanismus zur Benachrichtigung über Änderungen
registrieren und implementiert eine Aktualisierungsoperation
(z.B. nötig, wenn eine Änderung des Models einen
Menüeintrag aktiviert oder deaktiviert).
• Während der Initialisierung werden alle Views mit dem
Model assoziiert.
• Jede View erzeugt eine Controller-Komponente (1:1Beziehung).
Java-Praxiskurs
4
5
Lehrstuhl für Angewandte Telematik/e-Business
Java-Praxiskurs
6
1
01.04.2004
Das MVC-Modell
Das MVC-Modell: Diskussion
• Vorteile
•
•
•
•
View leicht änderbar
Wiederverwendung durch Entkopplung
Modell mit mehreren Darstellungen
Views sind schachtelbar
(schwer, wenn Modelldaten und View vermischt sind).
• Controller (zur Laufzeit) änderbar
• Z.B. View „abschalten“: Controller, der alle Eingabeereignisse
ignoriert
• Varianten
• Vollständige Entkopplung von Modell und View
• Einseitige Abkopplung des View
• Modell kennt seine Views direkt
• Views müssen Controller benutzen
(dürfen Modell nicht direkt manipulieren)
• Nachteile
• Kleinere, einfache Anwendungen werden unnötig aufgeblasen.
• Die Trennung von Controller und View kann schwierig sein.
Java-Praxiskurs
7
Java-Praxiskurs
8
YOU ARE HERE
Ereignisse
•
•
•
•
•
•
•
•
•
• Programme ohne GUI haben klaren Programmablauf
Einführung
Objektorientierte Modellierung
Java-Sprachkonstrukte
Java-Klassenbibliothek
Zeichenketten
Dateien und Streams
Datenstrukturen
Networking
Grafische Benutzungsoberflächen
• Programme mit GUI sind ereignisgesteuert
• Aktionen des Benutzers erzeugen Ereignisse
(Tastaturanschläge, Mausklicks, Mausbewegungen etc.)
• Problem: GUI kann nicht vorhersehen, was Benutzer tun
wird.
•
•
•
•
Komponenten und Container
Layout-Management
Pluggable Look & Feel
MVC-Paradigma
Event Handling
• Menüs
• Idee:
• Programmierstil
• Extensible Markup Language
Java-Praxiskurs
9
GUI wartet auf Aktionen des Benutzers
Komponenten erzeugen Ereignisse
(Maus, Tastatur,...)
Java-Praxiskurs
10
Benutzer-Ereignisse
Beispiel: Mausklicks
• Ereignis-Objekte (erben von java.util.EventObject)
• Ereignis:
Benutzer drückt Maustaste über einem Schaltknopf
• Reaktion:
Schaltknopf erzeugt Ereignis-Objekt
new java.awt.event.ActionEvent
• stellen bestimmte Ereignisse dar (Interaktion des Benutzers)
• Ereignis-Auslöser-Objekte
• lösen Ereignisse aus (in der Regel graphische Elemente)
• Schaltknopf benachrichtigt alle registrierten Listener und
• ruft dort die passende Listener-Methode auf:
• Ereignis-Lauscher-Objekte (EventListener-Objekte):
•
•
•
•
•
melden sich bei Auslöser-Objekten an,
werden bei Ereignissen benachrichtigt
stellen für Behandlung der Ereignisse passende Methoden bereit
implementieren EventListener-Schnittstellen
bilden die Schnittstelle zur Anwendungsfunktionalität!
• Listener muss Schnittstelle ActionListener implementieren
actionPerformed(ActionEvent e)
• Jede „zuhörende“ Klasse kann die Methode beliebig implementieren
• Jede Klasse hält Methoden für alle interessierenden Ereignisarten bereit
Java-Praxiskurs
11
Lehrstuhl für Angewandte Telematik/e-Business
Java-Praxiskurs
12
2
01.04.2004
Beispiel (1/2)
Beispiel (2/2)
Ziel: Button mit wechselnder Aufschrift
import javax.swing.*;
import java.awt.event.*;
import java.awt.event.*;
import javax.swing.*;
public class Hoerer implements ActionListener {
public void actionPerformed(ActionEvent e){
Wechselbutton but = (Wechselbutton) e.getSource();
but.wechsle();
}
}
public class Wechselbutton extends JButton {
public Wechselbutton (String text){ super(text);}
public void wechsle() {
if (this.getText().equals("Drück mich!")){
this.setText("Nochmal...");
} else {
this.setText("Drück mich!");
}
}
public class Testumgebung {
public static void main(String[] args) {
Hoerer h = new Hoerer();
WechselbuttonFrame wbf = new WechselbuttonFrame(h);
wbf.setSize(200,50);
wbf.setVisible(true);
}
}
}
public class WechselbuttonFrame extends JFrame {
private Wechselbutton b;
public WechselbuttonFrame(Hoerer h){
b = new Wechselbutton("Drück mich!");
getContentPane().add(b);
b.addActionListener(h);
}
}
Java-Praxiskurs
13
Java-Praxiskurs
14
Ereignis-Objekt
Arten von Ereignissen
• Ein Ereignis ist ein Objekt
• in java.util.EventObjekt, java.awt.Event oder
javax.swing.event
Basis-Ereignisse und semantische Ereignisse
• enthält
• auslösende Quelle (z.B. Button)
• Nachricht (z.B. „Maustaste 1 wurde gedrückt“)
EventQuelle
(Button)
Event
Listener
Event
Verwendung
Ereignisart
Basisereignisse
Tastaturereignisse
Mausereignisse
Komponentenereign.
Containerereignisse
Fokusereignisse
Fensterereignisse
Schnittstelle
KeyEvent
MouseEvent
ComponentEvent
ContainerEvent
FocusEvent
WindowEvent
KeyListener
MouseListener
ComponentList.
ContainerListener
FocusListener
WindowListener
Semantische Ereignisse
Aktion des Benutzers ActionEvent
Textereignisse
TextEvent
Auswählen (Checkb.) ItemEvent
Wertmanipulation
AdjustmentEvent
ActionListener
TextListener
ItemListener
AdjustmentListener
15
actionPerformed
textValueChanged
itemStateChanged
adjustmentValueChanged
Java-Praxiskurs
16
Zugehörigkeit
Methoden der Listener-Interfaces
• Ausschnitt (siehe JDK-Dokumentation und Tutorial)
ComponentListener:
Action
Listener
Change
Listener
Item
Listener
X
JDialog
X
JScrollPane
void
void
void
void
Window
Listener
JFrame
X
JComboBox
X
JSlider
X
void focusGained(FocusEvent e)
void focusLost(FocusEvent e)
X
X
X
JTextField
X
JFileChooser
X
componentHidden(ComponentEvent e)
componentMoved(ComponentEvent e)
componentResized(ComponentEvent e)
componentShown(ComponentEvent e)
FocusListener:
X
JButton
Java-Praxiskurs
keyPressed, keyReleased
mouseClicked,-Pressed
componentHidden, -moved
componentAdded, -Removed
focusGained, focusLost
windowIconified, -Opened
Event
Listener
Java-Praxiskurs
Komponente
Lauscher-Methoden
KeyListener:
void keyPressed(KeyEvent e)
void keyReleased(KeyEvent e)
void keyTyped(KeyEvent e)
17
Lehrstuhl für Angewandte Telematik/e-Business
Java-Praxiskurs
18
3
01.04.2004
Methoden der Listener-Interfaces
Methoden der Listener-Interfaces
MouseListener:
ChangeListener:
void
void
void
void
void
mouseClicked(MouseEvent e)
mouseEntered(MouseEvent e)
mouseExited(MouseEvent e)
mousePressed(MouseEvent e)
mouseReleased(MouseEvent e)
void stateChanged(ChangeEvent e)
ItemListener:
void itemStateChanged(ItemEvent e)
WindowListener:
MouseMotionListener:
void
void
void
void
void
void
void
void mouseDragged(MouseEvent e)
void mouseMoved(MouseEvent e)
ActionListener:
void actionPerformed(ActionEvent e)
Java-Praxiskurs
19
Listener implementieren
windowActivated(WindowEvent e)
windowClosed(WindowEvent e)
windowClosing(WindowEvent e)
windowDeactivated(WindowEvent e)
windowDeiconified(WindowEvent e)
windowIconified(WindowEvent e)
windowOpened(WindowEvent e)
Java-Praxiskurs
20
Anonyme Klassen
• Problem:
• Listener sind die Controller im MVC
• sie haben oft nur eine Methode, die sie überschreiben
• dafür gibt es viele von ihnen, viele Klassendateien sind unpraktisch
• Listener-Interfaces beinhalten Methoden, an die Events
weitergeleitet werden.
• Beispiel: interface FocusListener {
void focusGained(FocusEvent e);
void focusLost(FocusEvent e);
}
• Lösung: Anonyme Klassen
• sind Klassen, die keinen Namen haben
• können daher nur einmal instantiiert werden
• Swing-Komponenten können nur Ereignisse an Objekte
bestimmte Listener-Interfaces weiterleiten. Entsprechende
Objekte werden mit add...Listener() bei der SwingKomponente registriert. Hier:
ActionListener a =
new ActionListener() {
public void actionPerformed(ActionEvent e) {...}
};
• anonyme Klasse erweitert ActionListener und überschreibt
Methode actionPerformed()
• Referenz auf Instanz wird in a abgelegt
addFocusListener(...);
Java-Praxiskurs
21
Benutzen von anonymen Klassen
import javax.swing.*; import java.awt.event.*;
22
Benutzen von anonymen Klassen
Wird oft von
ProgrammierProgrammierumgebungen
generiert!
public class Wechselbutton2 extends JFrame {
public Wechselbutton2(){
JButton b=new JButton("Drück mich!");
getContentPane().add(b);
b.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
b_actionPerformed(e);
}
}
);
}
private void b_actionPerformed(ActionEvent e){
JButton but=(JButton) e.getSource();
if (but.getText().equals("Drück mich!")){
but.setText("Nochmal...");
} else {
but.setText("Drück mich!");
}
Java-Praxiskurs
Java-Praxiskurs
...
public static void main(String[] args) {
Wechselbutton2 wb2 = new Wechselbutton2();
wb2.setSize(200,50);
wb2.setVisible(true);
}
}
23
Lehrstuhl für Angewandte Telematik/e-Business
Java-Praxiskurs
24
4
01.04.2004
YOU ARE HERE
Menüs
•
•
•
•
•
•
•
•
•
• Ziel: Menüs an Bildschirm-Fenstern
Einführung
Objektorientierte Modellierung
Java-Sprachkonstrukte
Java-Klassenbibliothek
Zeichenketten
Dateien und Streams
Datenstrukturen
Networking
Grafische Benutzungsoberflächen
•
•
•
•
•
• Gruppieren von Funktionen in Menüs
• Anordnen aller Menüs in 1 Menüleiste am oberen Fensterrand
• Anbinden an Methoden über Ereignisse (analog Knöpfe, etc.)
Komponenten und Container
Layout-Management
Pluggable Look & Feel
MVC-Paradigma
Event Handling
Menüs
• Programmierstil
• Extensible Markup Language
Java-Praxiskurs
25
Java-Praxiskurs
26
Bestandteile eines Menüsystems
Vererbungshierarchie für Menüs
• Menüleiste
• Alle Menu-Elemente sind Container und Komponenten
• nimmt Menüs auf
java.awt.Component
• Trennlinien
• Popup-Menü
java.awt.Container
JComponent
• Menu-Elemente
•
•
•
•
JMenuBar
Menüeinträge
Radiobuttons
Checkbuttons
Kommando-Sammlung (JMenu)
(ein bzw. mehrere Kommandos, verschachtelte Menüs)
Java-Praxiskurs
JPopupMenu
JAbstractButton
JSeparator
JMenuItem
JMenu
27
JCheckBoxMenuItem
JRadioButtonMenuItem
Java-Praxiskurs
28
Beispiel: Menüleiste
Das Letzte...
public class BankautomatGUI extends JFrame {
public BankautomatGUI(String s) {
super(s);
JMenuBar mbar = new JMenuBar();
setJMenuBar(mbar);
• Man kann einem JFrame sagen, wie er sich beim Schließen
verhalten soll: setDefaultCloseOperation(int)
• WindowConstants.DO_NOTHING_ON_CLOSE
JMenu dateiMenu = new JMenu(“Datei“);
mbar.add(dateiMenu);
• Nichts tun, die Applikation muss Aktionen über den
WindowListener selbst ausführen
• WindowConstants.HIDE_ON_CLOSE
JMenu bearbeitenMenu = new JMenu("Bearbeiten");
mbar.add(bearbeitenMenu);
• Standardverhalten, Fenster wird versteckt
• WindowConstants.DISPOSE_ON_CLOSE
JMenuItem editierenItem = new JMenuItem();
editierenItem.setText("Editieren");
bearbeitenMenu.add(editierenItem);
• Automatisches Verstecken und Verwerfen des Fensters
• JFrame.EXIT_ON_CLOSE
JMenuItem anschauenItem = new JMenuItem();
anschauenItem.setText("Anschauen");
bearbeitenMenu.add(anschauenItem);
• Nach dem Schließen des Fensters wird auch die Applikation
beendet (durch System.exit())
setJMenuBar(mbar);
...
Java-Praxiskurs
29
Lehrstuhl für Angewandte Telematik/e-Business
Java-Praxiskurs
30
5
01.04.2004
YOU ARE HERE
Kommentare: Motivation
•
•
•
•
•
•
•
•
•
• Was wäre die Java-Klassenbibliothek ohne die API
Specification?
Einführung
Objektorientierte Modellierung
Java-Sprachkonstrukte
Java-Klassenbibliothek
Zeichenketten
Dateien und Streams
Datenstrukturen
Networking
Grafische Benutzungsoberflächen
Programmierstil
• nicht überschaubar, nicht benutzbar
• Woher kommt die API Specification?
• automatisch aus Quelltextkommentaren generiert
Erkenntnisse
• nur kommentierte Klassen sind wiederverwendbar
• Kommentare sind wichtiger Teil der technischen Dokumentation
• Java nimmt Entwicklern nicht das Schreiben von Kommentaren ab,
erleichtert aber das Produzieren einer professionellen hypertextbasierten Dokumentation aus den Kommentaren ungemein
• Kommentare und javadoc
• Code Conventions
• Extensible Markup Language
Java-Praxiskurs
wertlos!
31
Java-Praxiskurs
Implementierungs-Kommentare
Dokumentations-Kommentare
• Kommentar bis zum Zeilenende
• automatische Generierung von HTML-Dokumentationen
• alles von // bis zum Zeilenende wird vom Compiler ignoriert
•
•
•
•
Anweisung; // Kommentar bis Zeilenende
• geklammerter Kommentar
• alles zwischen /* und */ wird vom Compiler ignoriert
mit dem Tool javadoc (im bin-Verzeichnis des Java 2 SDK)
//- und /*...*/-Kommentare werden von javadoc ignoriert
nur Kommentare im javadoc-Format /**...*/ berücksichtigt
übliche Schreibweise (* am Zeilenbeginn wird ignoriert):
/**
* javadoc-Kommentar
* über mehrere Zeilen
*/
Deklaration
• entweder innerhalb einer Zeile (unschön)
a = b /* Summand */ + c;
• oder über mehrere Zeilen hinweg
Anweisung;
/* Kommentar
...
über mehrere Zeilen */
Anweisung;
• javadoc-Kommentare werden nur ausgewertet...
• Verschachtelung
• //-Kommentare lassen sich in /*...*/-Kommentare einschachteln
• mehrere /*...*/-Blöcke können jedoch nicht verschachtelt werden
Java-Praxiskurs
33
•
•
•
•
vor Klassen- bzw. Interface-Deklarationen
vor Methodendeklarationen
vor Attributdeklarationen
nicht innerhalb von Implementierungsblöcken!
Java-Praxiskurs
javadoc-Kommentarformat
Block Tags @author und @version
/**
*
*
*
*
*
*
*
*
*/
• Konvention: Block Tags in hier vorgestellter Reihenfolge
Ein zusammenfassender Satz. Weitere Sätze, die
Klasse/Interface, Methode oder Attribut im Detail
beschreiben. Textauszeichnungs-HTML-Tags wie z.B.
<b>fett</b> und das Inline-Tag "@link" zum Verweis
auf eine {@link Klasse} sind dabei erlaubt.
34
• Autor(en): @author
•
•
•
•
@tag Block Tags für strukturierte Informationen und
@tag Block Tags für Querverweise
• erster Satz
• endet beim ersten Punkt (.)
• wird in der Übersichtstabelle zu Beginn einer API-Seite angezeigt
• sollte bei überladenen Methoden bereits Unterschiede ausdrücken!
nur bei Klassen oder Interfaces erlaubt
ein Autor: @author Werner Heisenberg
mehrere Autoren: @author W. Heisenberg, G.W. Leibniz
wird nicht in generierte Dokumentation übernommen
• Version: @version
• nur bei Klassen oder Interfaces erlaubt
• z.B. @version 1.01beta
• wird nicht in generierte Dokumentation übernommen
• folgende Sätze
• detaillierte Beschreibung der Verwendung/Funktionalität
• das abgeleitete Objekt sollte mit "dieses" bezeichnet werden
• Umbrüche in HTML ignoriert (erzwingbar mit <br>)
Java-Praxiskurs
32
35
Lehrstuhl für Angewandte Telematik/e-Business
Java-Praxiskurs
36
6
01.04.2004
Block Tags @param und @return
Block Tags @throws und @see
• Parameter: @param
• Exception: @throws
•
•
•
•
•
•
•
•
•
•
•
•
•
nur bei Methoden und Konstruktoren erlaubt
ein Tag pro Parameter erforderlich
Konvention: Reihenfolge wie im Methodenkopf
Syntax: @param Parametername Beschreibung
z.B. @param tage Zahl der Tage der Fristverlängerung
• Beschreibung sollte Parametertyp erwähnen
• Rückgabewert: @return
• Querverweis: @see
• nur bei Methoden mit anderem Rückgabetyp als void erlaubt
• Syntax: @return Beschreibung
• z.B. @return neues Rückgabedatum
•
•
•
•
• Beschreibung sollte auch Rückgabewerte in Sonderfällen nennen
Java-Praxiskurs
(in früheren javadoc-Versionen: @exception)
nur bei Methoden und Konstruktoren erlaubt
ein Tag pro Exception erforderlich
checked Exceptions sollen dokumentiert werden
unchecked Exceptions können dokumentiert werden, wenn sinnvoll
Konvention: alphabetische Reihenfolge
Syntax: @throws Exceptionname Beschreibung
z.B. @throws InputException wenn Eingabe fehlschlug
37
zu einem eigenen Element: @see #verlaengern(int)
zu einer Klasse: @see java.io.InputStream
zu einem fremden Element: @see java.lang.String#length()
zu einer HTML-Datei: @see <a href="spec.html">Spec</a>
Java-Praxiskurs
Bsp.: Kommentar für Klasse
Bsp.: Kommentar für Attribute
/**
* Ein Buch in der Bibliothek. Bücher werden im westlichen
* Kulturkreis seit der Erfindung des Buchdrucks mit
* beweglichen Lettern 1452 durch Gutenberg produziert (im
* asiatischen Raum wurde bereits im 7. Jhd. mit beweglichen
* Holzlettern gedruckt). Der weltweit erste Buchverlag wurde
* in Leipzig gegründet.
*
* @author Matthias Book, Clemens Schäfer
* @version 1.0beta
*/
public class Buch {
...
}
public class Buch {
/** Der Titel dieses Buchs. */
public String titel;
38
/**
* Die Autoren dieses Buchs. Mehrere Autoren sollten durch
* Kommata getrennt aufgeführt werden.
*/
public String autor;
/** Das Erscheinungsjahr dieses Buchs. */
public int jahr;
...
}
• private Attribute können auch kommentiert werden; werden
per Default jedoch nicht in HTML-Ausgabe übernommen
Java-Praxiskurs
39
Java-Praxiskurs
Bsp.: Kommentar für Methoden
Syntax von javadoc (vereinfacht)
public class Buch {
...
/**
* Verlängert die Leihfrist dieses Buchs. Die Verlängerung
* ist nur möglich, wenn die maximale Ausleihzeit noch nicht
* erreicht wurde.
*
* @param tage Zahl der Tage, um die verlängert werden soll
* @return
neues Rückgabedatum
* @throws MaximaleLeihzeitException wenn die maximale
*
Ausleihzeit bereits erreicht wurde
*/
public java.util.Date verlaengern (int tage)
throws MaximaleLeihzeitException {
...
}
...
}
• Dokumentation einzelner Klassen
Java-Praxiskurs
Java-Praxiskurs
41
Lehrstuhl für Angewandte Telematik/e-Business
40
javadoc [-d Zielpfad] [Quellpfad/]Klassendatei(en)
•
•
•
•
wenn keine Ziel-/Quellpfadangabe: aktuelles Verzeichnis
Aufzählung mehrerer Klassendateien durch Leerzeichen getrennt
Wildcards in Dateinamen erlaubt
Unterverzeichnisse werden nicht rekursiv verarbeitet
javadoc –d /doc Buch.java gui/Graphics*.java
• Dokumentation ganzer Pakete
javadoc [-d Zielpfad] [-sourcepath Quellpfad]
[-subpackages] Paketname(n)
•
•
•
•
wenn keine Ziel-/Quellpfadangabe: aktuelles Verzeichnis
Aufzählung mehrerer Pakete durch Leerzeichen getrennt
keine Wildcards in Paketnamen erlaubt
Unterpakete werden nur mit Parameter -subpackages verarbeitet
javadoc –sourcepath /src bibliothek.daten bibliothek.gui
javadoc –sourcepath /src –subpackages bibliothek
42
7
01.04.2004
Syntax von javadoc -u
Bsp.: Dokumentation für Buch
• Seit Java 1.4. gibt es die Option –u
>javadoc -d doc Buch.java
Loading source file Buch.java...
Constructing Javadoc information...
Standard Doclet version 1.4.1
javadoc -u Mailadresse [-d Zielpfad] [Quellpfad/]Klass(en)
• Bedeutung der restlichen Schalter wie vorher
• -u sorgt für
Generating doc\constant-values.html...
Building tree for all the packages and classes...
Building index for all the packages and classes...
Generating doc\overview-tree.html...
Generating doc\index-all.html...
Generating doc\deprecated-list.html...
Building index for all classes...
Generating doc\allclasses-frame.html...
Generating doc\allclasses-noframe.html...
Generating doc\index.html...
Generating doc\packages.html...
Generating doc\Buch.html...
Generating doc\package-list...
Generating doc\help-doc.html...
Generating doc\stylesheet.css...
• Upload an java.sun.com von Dokumentation und Klassendatei(en)
• Hinzufügen des Packages zum Java Community Process
• Im Java Community Process werden die Dateien geprüft und
• ggf. in die kommende Version von Java übernommen
• Warum per Javadoc?
• Nur ordentlich kommentierte Dateien haben eine Chance
• Beispiel:
javadoc -u [email protected] –subpackages bibliothek
> _
Java-Praxiskurs
43
Java-Praxiskurs
44
YOU ARE HERE
Code Conventions: Motivation
•
•
•
•
•
•
•
•
•
•
• 80% der im Software-Lebenszyklus anfallenden Kosten
werden für Wartung aufgewendet
• Software wird i.d.R. nicht während ihres ganzen
Lebenszyklus vom gleichen Autor gewartet
• Code-Konventionen verbessern die Lesbarkeit des Codes
Entwickler können fremden Code schneller und gründlicher
verstehen
Einführung
Objektorientierte Modellierung
Java-Sprachkonstrukte
Java-Klassenbibliothek
Zeichenketten
Dateien und Streams
Datenstrukturen
Networking
Grafische Benutzungsoberflächen
Programmierstil
• Code Conventions sind Richtlinien für Struktur,
Formatierung und Benennung von Quelltextelementen
• Code Conventions sind semantische Beschränkungen für
syntaktisch korrekte Programme
Sie werden daher nicht Compiler geprüft, manchmal aber
vom Editor
• Kommentare und javadoc
Code Conventions
• Extensible Markup Language
45
Java-Praxiskurs
Struktur von Klassendateien
Struktur von Klassendeklarationen
• einleitender Implementierungskommentar in /*...*/
• Doku-Kommentar in /**...*/ für Klasse/Interface
• technische Hinweise, z.B. Copyright, Autor, Version etc.
• wird nicht in javadoc-Dokumentation übernommen
46
• wird in javadoc-Dokumentation übernommen
• class- bzw. interface-Kopf
• ggf. Sichtbarkeitsmodifikator, abstract, extends, implements
• ggf. package-Anweisung
• ggf. Implementierungskommentar in /*...*/
• Einordnung der Klasse in ein Paket
• Paketname sollte mit inversem Domainnamen beginnen
• kann technische Interna, Implementierungsdetails beschreiben
• Klassenvariablen (als static deklariert)
• Reihenfolge: public, protected, paketsichtbar, private
• ggf. import-Anweisungen
• Instanzvariablen (Attribute)
• Einbinden von Klassen aus fremden Paketen
• Reihenfolge: public, protected, paketsichtbar, private
• Konstruktoren
• Methoden
• Klassen- bzw. Interface-Deklaration
jeweils mit
DokumentationsKommentar
Java-Praxiskurs
• Reihenfolge: wie es Sinn macht
Java-Praxiskurs
47
Lehrstuhl für Angewandte Telematik/e-Business
Java-Praxiskurs
48
8
01.04.2004
Formatierung von Blöcken
Zeilenumbrüche
• öffnende Klammer { steht hinter dem Block-Kopf
• eine Anweisung pro Zeile
• Zeilen sollten maximal 80 Zeichen lang sein
• empfohlene Formatierung von Zeilenumbrüchen
• eingeschlossene Anweisungen 4 Leerzeichen einrücken
• schließende Klammer } steht in eigener Zeile
• Ausnahme: ein zur Kontrollstruktur gehöriges Schlüsselwort folgt
(z.B. else, while, catch, finally)
•
•
•
•
•
•
• auch einzeilige Blöcke sollten geklammert werden
if (Bedingung) {
Anweisung;
Anweisung;
} else if (Bedingung) {
Anweisung;
} else {
Anweisung;
}
Java-Praxiskurs
Umbruch nach einem Komma
Umbruch vor einem Operator
bei Klammerung: lieber auf höherer als auf tieferer Klammerebene
Einrückung bis zum Beginn des Ausdrucks auf der vorherigen Zeile
wenn die Einrückung zu extrem wäre, nur 8 Leerzeichen einrücken
mehrzeilige if/while-Bedingungen immer 8 Leerzeichen einrücken
public static synchronized boolean methode (int parameter1,
int parameter2, String parameter3) {
if ((Bedingung1 && Bedingung2) ||
(Bedingung3 && Bedingung4)) {
Anweisungen;
}
}
49
Java-Praxiskurs
Deklarationen
Leerzeilen und -zeichen
• eine Deklaration pro Zeile
Platz für Kommentare
• möglichst mit Initialisierung verbinden
• Leerzeilen
•
•
•
•
• außer, wenn Initialwert von komplexer Berechnung abhängt
• Variablen zu Beginn eines Blocks deklarieren
• Überdeckung von Attributnamen vermeiden
• außer bei Attributinitialisierung in Konstruktoren, set...-Methoden
• Negativbeispiel:
zwischen Klassen- und Interface-Deklarationen
zwischen Methoden
zwischen lokalen Variablendeklarationen und Quelltext eines Blocks
zwischen semantisch abgeschlossenen Quelltextabschnitten
• Leerzeichen
• zwischen Schlüsselwörtern und Klammern: while (...)
• nicht zwischen Methodennamen und Klammern: methode(...)
• nicht direkt in Klammern: (a + b) statt ( a + b )
String titel;
public void methode (int parameter) {
Anweisungen;
String titel, autor;
Anweisungen;
titel = andereMethode ();
Anweisungen;
}
Java-Praxiskurs
• nach Kommas und Semikolons, aber nicht davor
• zwischen Operatoren und Operanden, aber nicht bei ++, -- und .
51
Java-Praxiskurs
Namenskonventionen
Farben
• Pakete
• Seit Java 1.4. gehören auch die Farben des SyntaxHighlighting zu Code Conventions
• Beginn mit inverser Domain, dann beliebige Hierarchiestruktur
• komplett klein: de.lpz-ebusiness.bibliothek.daten
52
• blau
• Sichtbarkeitsmodifikatoren (public, protected, private)
• Schlüsselwörter (package, import, class, new …)
• TableOfContents
• rot
• Primitive Typen (boolean, byte, char, int, long …)
• Außerdem: void, String
• grün
• Kommentare (//Kommentar, /* K… */, /** javadoc */)
• Klassen, Interfaces
• möglichst Substantive, möglichst keine Abkürzungen
• 1. Buchstabe, Wortanfänge groß: class TableOfContents
• Methoden
• möglichst mit Verben, möglichst keine Abkürzungen
• 1. Buchstabe klein, Wortanfänge groß: public int getYear()
• Attribute, Variablen
• möglichst keine Abkürzungen (außer temporäre Variablen wie i, c, x)
• 1. Buchstabe klein, Wortanfänge groß: private int yearPublished
• Nur noch Editoren, die diese Farben im Quellcode erzeugen, dürfen
das Label „100% Pure Java“ tragen
• Klassenkonstanten
• möglichst keine Abkürzungen, komplett großgeschrieben
• Worttrennung mit _: static final int MIN_YEAR = 1452;
Java-Praxiskurs
50
• Diese Folien entsprechen fast komplett diesen Konventionen! ☺
53
Lehrstuhl für Angewandte Telematik/e-Business
Java-Praxiskurs
54
9
01.04.2004
Online-Feedback
• Bewertung von
• Vorlesung
• Übungen
• Begleitmaterial
• nur heute online unter
• www.lpz-ebusiness.de
• nur mit Feedback-TAN
• gültig für eine Stimme
• Austeilung in Vorlesung
• Ergebnisse morgen
• in Vorlesung und Netz
Java-Praxiskurs
55
Lehrstuhl für Angewandte Telematik/e-Business
10
Herunterladen