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