Werkzeugtipps zur Arbeit in der Implementierungsphase des Softwarepraktikums
2001
javadoc
Seine Klassen sollte man immer ausführlich kommentieren, damit andere
und auch man selbst später nachvollziehen können, was Methoden und
Felder zu bedeuten haben. Mit dem Kommando javadoc
läßt
sich aus speziellen Kommentaren automatisch eine HTML-Dokumentation
generieren. Diese Kommentare fangen jeweils mit /**
an und stehen
jeweils vor der zu dokumentierenden Klasse/Methode, etc. Sie dürfen
HTML-Code enthalten sowie eine Reihe vordefinierter Tags die
mit @ anfangen. Hier ein kurzes Beispiel:
/**
* A string buffer implements a mutable sequence of characters.
* A string buffer is like a {@link String}, but can be modified. At any
* point in time it contains some particular sequence of characters, but
* the length and content of the sequence can be changed through certain
* method calls.
* <p>
* String buffers are used by the compiler to implement the binary
* string concatenation operator <code>+</code>. For example, the code:
* <p><blockquote><pre>
* x = "a" + 4 + "c"
* </pre></blockquote><p>
* is compiled to the equivalent of:
* <p><blockquote><pre>
* x = new StringBuffer().append("a").append(4).append("c")
* .toString()
* </pre></blockquote>
*
* @author <a href="http://www.inf.fu-berlin.de/~dahm/">Markus Dahm</a>
* @version $Id: swp-HOWTO.html,v 1.8 2000/05/23 00:20:49 busch Exp $
* @see java.lang.String
*/
public class MyStringBuffer implements java.io.Serializable {
/** The value is used for character storage.
*/
protected char value[];
/**
* Constructs a string buffer with no characters in it and an
* initial capacity specified by the <code>length</code> argument.
*
* @param length the initial capacity.
* @exception NegativeArraySizeException if the <code>length</code>
* argument is less than <code>0</code>.
*/
public MyStringBuffer(int length) { }
/**
* Returns the length (character count) of this string buffer.
*
* @return the length of the sequence of characters currently
* represented by this string buffer.
*/
public int length() { return count; }
}
|
Erläuterung der Tags:
@author | Hier gibt man die Autoren der Klasse an,
z.B. mit einem Link auf dessen Homepage |
@exception oder @throws | Welche Exceptions kann diese
Methode auslösen |
@link | Verweis auf eine andere Klasse oder Methode im Fließtext |
@param | Beschreibung eines formalen Parameters |
@return | Beschreibung des Rückgabewerts |
@see | Verweis auf eine andere Klasse oder Methode am Ende |
@version | Version der Klasse, wer CVS benutzt sollte
hier einfach $Id$ eintragen, das wird dann von CVS automatisch transformiert |
Die Dokumentation wird am einfachsten wie folgt erzeugt, wobei man
mit -d optional ein Verzeichnis angeben kann, in das die Dateien
geschrieben werden sollen.
% javadoc -author -version -d docs swp.gui swp.mail
Das Ergebnis sieht dann in etwa so aus:
Class MyStringBuffer
java.lang.Object
|
+--MyStringBuffer
- public class MyStringBuffer
- extends java.lang.Object
- implements java.io.Serializable
A string buffer implements a mutable sequence of characters.
A string buffer is like a String
, but can be modified. At any
point in time it contains some particular sequence of characters, but
the length and content of the sequence can be changed through certain
method calls.
String buffers are used by the compiler to implement the binary
string concatenation operator +
. For example, the code:
x = "a" + 4 + "c"
is compiled to the equivalent of:
x = new StringBuffer().append("a").append(4).append("c")
.toString()
- See Also:
String
, Serialized Form
value
protected char[] value
- The value is used for character storage.
MyStringBuffer
public MyStringBuffer(int length)
- Constructs a string buffer with no characters in it and an
initial capacity specified by the
length
argument.
- Parameters:
length
- the initial capacity.- Throws:
- NegativeArraySizeException - if the
length
argument is less than 0
.
length
public int length()
- Returns the length (character count) of this string buffer.
- Returns:
- the length of the sequence of characters currently
represented by this string buffer.
Concurrent Versions System
CVS (Concurrent Versions System) ist ein Versionsverwaltungssystem, dass die gemeinsame, auch räumlich verteilte Arbeit an einem Projekt unterstützt. CVS ist freie Software und findet in den meisten Open-Source-Projekten Verwendung. Es ist Bestandteil jeder aktuellen Unix/Linux-Distribution.
Aber nicht vergessen: CVS ist nur ein technisches Hilfsmittel, es
ersetzt nicht die Kommunikation zwischen den Entwicklern!
Arbeiten mit CVS
Auf den Sun-Rechnern befindet sich die aktuellste Installation von cvs unter
"/import/gnu/bin/cvs".
Befehle
Angenommen, das Projekt existiert bereits im Repository. Das Repository liegt im Verzeichnis <cvsroot> und das Projekt heißt swp.
-
"cvs -d <cvsroot> checkout swp" legt ein neues Arbeitsverzeichnis mit Arbeitskopien aller Dateien an.
-
"cvs update -d" aktualisiert das Arbeitsverzeichnis und legt ggf. auch neue Verzeichnisse an. Achtung: Gab es Konflikte?
- "cvs commit <dateiname>" übergibt die angegebene(n) Datei(en) ins Repository. In einem Kommentar, der auch bereits mit -m "<text>" angegeben werden kann, gibt man Auskunft über die letzten Änderungen.
- "cvs add <dateiname>" fügt eine neue Datei des Arbeitsverzeichnisses zum Repository hinzu, "cvs remove <dateiname>" löscht eine Datei.
- "cvs log <dateiname>" zeigt, wer die Datei wann und warum geändert hat.
Konflikte?
Erscheint beim Update einer Datei ein C vor dem
Dateinamen, liegt ein Konflikt vor. Jemand hat nach meinem Auschecken
eine neue Version der Datei eingecheckt. In den meisten Fällen kann
cvs diese Konflikte auflösen, wobei allerdings auch Voricht geboten
ist: cvs kann Konflikte auflösen, wenn die Änderungen an verschiedenen
Stellen in einer Datei waren, cvs berücksichtigt nicht die Sematik der
Änderungen!
Falls cvs die Konflikte nicht auflösen kann, wird eine Warnung ausgegeben. Die problematische Region ist in der Datei gekennzeichnet ("<<<<<<") und wird der anderen Version gegenübergestellt. Der Konflikt muss nun vor dem commit manuell und mit Verstand aus der Welt geschafft werden.
Remote arbeiten
Das Arbeitsverzeichnis kann sich auch in einem anderen Dateisystem befinden, etwa zu Hause auf einem Linux-Rechner, der temporär über ppp im Internet ist.
Dazu muß man noch die Umgebungsvariable CVS_RSH definieren,
mit
setenv CVS_RSH ssh (csh).
Beim initialen Auschecken wird CVS-Root (hinter "-d") nun so angegeben: <benutzername@rechner.domain:pfadZumRepository>.
Danach kann im Arbeitsverzeichnis wie gewohnt mit den CVS-Befehlen auf das Repository an der Uni zugegriffen werden.
Style guide
In den Tutorien solltet Ihr Euch noch einigen, wie Ihr mit CVS arbeitet, insbesondere wie häufig und in welchem Zustand eingecheckt werden soll.
Hier ein paar Vorschläge:
- Stets mit den aktuellen Ergebnissen der anderen
weiterarbeiten, d.h. zu Arbeitsbeginn immer erstmal cvs
update aufrufen.
- Am Ende eines Arbeitsschrittes den anderen den aktuellen
Arbeitsergebnisse zur Verfügung stellen, also häufig cvs
commit aufrufen.
- Auf keinen Fall zu häufig cvs commit
aufrufen: Immer nur definierte Zwischenstände abgeben, d.h. die
Änderungen sind in sich schlüssig, das ganze Projekt läßt sich
weiterhin fehlerfrei übersetzten (und Du hast das auch
ausprobiert) und soweit bereits möglich hast Du Deine Änderungen
auch getestet.
- Insbesondere ist das gemeinsame Repository nicht dazu da,
nur zwischen einer Kleingruppe Code auszutauschen. Wenn z.B. die
GUI-Gruppe intern bereits mit experimentellere Versionen
autauschen möchte, die anderen aber lieber etwas halbwegs
stabiles behalten wollen, sollte die GUI-Gruppe nachlesen, wie
man in einem CVS-Projekt eine Verzweigung (Branch) anlegt.
- Bei cvs commit konsequent die geforderten Kommentare
angeben!
- Was passiert, wenn jemand einen Bug in fremdem Code findet
und ihn fixen könnte? Einigt Euch!
Mehr Information
Hier nicht erwähnt ist, wie man ein Repository anlegt, Branches, die
Vergabe von Tags, das Auschecken alter Versionen und administrative
Möglichkeiten, die CVS bietet. RTFM:
http://www.gnu.org/manual/cvs-1.9
Weiterhin sind diverse graphische Tools noch nicht erwähnt, mit Hilfe derer
mit CVS gearbeitet werden kann, wie z.B. cervisia (KDE), cvsweb
(Über Webseiten durchs Repository browsen) und viele andere mehr.
CVS-Zugriff von Windows aus ermöglicht wincvs.
(Alle derzeit nicht an
der Uni installiert.)
(X)Emacs als Java-Entwicklungsumgebung
XEmacs ist ein leistungsfähiger Texteditor, der auch Unterstützung für
das Programmieren, u.a. in Java, bietet. Aufzurufen ist er hier in der
Uni mit /import/xemacs/bin/xemacs.
Einführung in die grundlengenden Arbeitstechniken
Das ist bereits eingebaut; man drücke einfach Ctrl-h t (d.h. erst
Ctrl-h, danach t) und landet im eingebauten Tutorial. Eine
Kommandoübersicht zum Ausdrucken findet sich hier unter emacs-refcard.ps im
PostScript-Format.
Programmierhilfen
- Syntax Highlighting: Schon per default ausgewählt, Java-Schlüsselwörter
und Konstrukte werden hervorgehoben. Zu steuern ist das ganze über Menüs:
Options -> Syntax Highlighting.
- Parenthesis Highlighting: Wenn ich mit dem Cursor auf einer Klammer
stehe, wird die dazu passende hervorgehoben. Zu steuern über Menü:
Options -> Paren Highlighting.
- Automatische Einrückung: Sobald man auf TAB drückt, wird die aktuelle
Zeile eingerückt.
- Alles Einrücken: Das geht auch für das ganze file: Ctrl-c Ctrl-q tut dies.
- Ganze Regionen auskommentieren: Markieren, Ctrl-C Ctrl-C und alles ist
auskommentiert. Wieder einkommentieren über das Java-Menü.
- Kompilieren aus dem Emacs: Meta-x compile <enter>. Dann das nötige
Kommando eingeben (z.B. javac MyFile.java und Enter drücken.
(Nebenbei: Meta-X kann man immer auch ersetzen mit Esc-X). In dem Kontext,
in dem man das compile-Kommando eingibt, ist übrigens mit den Pfeiltasten
eine History erreichbar.
Damit dieses funktioniert, muß man vor Aufruf des XEmacs den CLASSPATH so
gesetzt haben, daß der Compiler alle Klassen die das zu kompilierende file
braucht findet. Insbesondere sollte also der Pfad des Projektes drin sein.
- Fehler dabei: Mit der mittleren Maustaste auf den Fehler klicken, das
führt direkt in die problematische Zeile
- Nochmal kompilieren: Meta-x recompile. Führt das letze compile-Kommando
erneut aus.(Nebenbei: nachdem man schon "recom" getippt hat, kann man mit
TAB komplettieren)
Das Startup-file .emacs
Beim Starten wertet der XEmacs das file ~/.emacs aus. Hierin werden
auch die ausgewählten Optionen gespeichert. Man kann dort nützliche Dinge
eintragen.
- Tastenbelegungen:
(global-set-key [F5] 'goto-line)
Wenn man den langen Namen der Funktion kennt, die man will, kann man so
eine globale Taste dafür definieren.
Eine gute Quelle für solches Tuning ist das .emacs von Markus:
~dahm/.emacs.
JDE
Dies ist das Java Development Environment für (X)Emacs. Es geht noch etwas
über die bereits im Standardpaket vorhandenen Möglichkeiten hinaus.
Installation
Erstmal muß man im .emacs dem Editor mitteilen, daß man auch dieses Paket nutzen
will, das nicht in der Standardinstallation enthalten ist. Deswegen muß man den
Pfad, in dem er nach Dateien sucht, erweitern und dann das Paket laden:
msetq load-path
(nconc
'( "/import/public/opt/jde-2.1.5" )
load-path))
(require 'jde)
Features
- Die Speedbar. Mit Ctrl-c Ctrl-v Ctrl-s aufzurufen verschafft sie sofortigen
Überblick über die Klassen im Projekt und deren Methoden. Alle klickbaren
Dinge hier muß man übrigens mit der mittleren Maustaste anklicken.
- Get/Set-Pair. Aus dem JDE-Menü erreichbar, generiert automatisch Attribut
plus get/set-Methoden die auch schon per javadoc dokumentiert sind.
- Ctrl-c Ctrl-v Ctrl-l. System.out.println("blalblalbla").
Jikes im Emacs
Dafür muß man zusehen, daß der JIKESPATH richtig gesetzt ist, denn jikes weiß im
Gegensatz zu javac nicht, wo die Klassenbibliothek liegt. Also:
setenv JIKESPATH /import/java2/jre/lib/rt.jar:/home/elfe/materlik/swp
(Dieses natürlich sinnvoll verändern), bevor man xemacs aufruft. Aus dem emacs
heraus möchte man jetzt auf jeden Fall mit der Option "+E" kompilieren, dies
stellt nämlich emacs-kompatiblen Output ein, so daß die Hinspringerei mit der
mittleren Maustaste funktioniert.
Quellen, Links, ...
Arbeiten mit Teraterm und X-Win32 unter Windows
Wenn man unter Windows eine Verbindung zu den Unix-Servern aufbauen
will, so ist das Programm "TeraTermPro" zu verwenden. Telnet sollte nicht
benutzt werden, da dies ein Sicherheitslücke darstellt.
Das Einloggen funktioniert wie folgt:
-
TeraTermPro starten
-
Host angeben (troll oder elfe oder ... bzw. troll.inf.fu-berlin.de von
ausserhalb)
-
Security Warning mit "Continue" bestätigen.
-
SSH wählen (meistens voreingestellt)
-
UserId eingeben
-
Passwort eingeben
Jetzt hat man die Möglichkeit, über ein Terminalfenster mit dem
Rechner zu kommunizieren und z.B. Befehle wie pine, javac, java, zip, chmod,
ls,... aufzurufen. Dies geht auch von zu Hause.
Will man ein Programm ausführen, welches ein eigenes Fenster öffnet,
so muss man das Fenster auf seinen Rechner umleiten. Dazu dort ist das
Programm X-Win32 erforderlich.
Um nun die Ausgabe auf den entsprechenden Rechner zu setzten, verhält
man sich (bei csh und zsh) wie folgt:
-
setenv DISPLAY <Rechnername>:0.0 (z.B. setenv DISPLAY pc168:0.0)
-
Starten von X-Win32
-
Kurzer Test ist z.B. mit dem Aufruf von xclock möglich.
Arbeiten mit Ultraedit
Ultraedit ist ein sehr leistungsfähiger Editor unter Windows.
Er beherrscht sowohl Syntaxhighlighting als auch die Möglichkeit DOS-Programme
(wie z.B. javac) aufzurufen. Die Ausgabe wir dann in ein Textfile umgeleitet
und angezeigt (Praktisch für die Fehlerausgabe des Compilers).
-
Ausführung von DOS Befehlen
-
Unter Advanced -> DOS Command kann man die entsprechenden Kommandos eingeben
-
Hilfreich ist eine Batch Datei in der schon nötige Befehle zum Compilieren
des Codes enthalten ist.
-
Einstellen des Syntaxhighlighting
-
Normalerweise müßte Syntaxhighlighting für Java voreingestellt
sein.
-
Ansonsten kann man es unter Advanced -> Configuration -> Syntax Highlighting
einstellen.
-
Die Programmiersprache einstellen
-
Die Wordlist angeben (C:\Programme\ULTRAEDT\wordfile.txt)
Verfügbare Werkzeuge, die wir hier nicht vorstellen
Auf den NT-Rechnern sind verfügbar (erreichbar über das Startmenü):
- Rational Rose 98 Professional Java Edition: UML-basiertes Werkzeug, das insbesondere die Entwurfsphase unterstützt. Kann aus Klassendiagrammen Codegerüste generieren.