qflib - Packages
Overview
Die qflib gliedert sich in thematisch geordnete Packages, die
aufeinander aufbauen. Die Abhängigkeiten der Packages voneinander
lassen sich dem folgenden Diagramm entnehmen:
Grundlage für die gesamte qflib ist das de.qfs.lib.log Package. Das de.qfs.lib.util Package wird von allen anderen
Packages ausser de.qfs.lib.log benötigt. Die Packages de.qfs.lib.config und de.qfs.lib.gui
besitzen gegenseitige Abhängigkeiten. Auf ihnen baut wiederum das
de.qfs.lib.option Package auf, während das de.qfs.lib.command Package unabhängig von
de.qfs.lib.config ist.
Mit Version 0.97.0 ist das de.qfs.lib.transaction Package hinzugekommen,
welches lediglich auf de.qfs.lib.log und de.qfs.lib.util aufsetzt. Ausserdem
wurden in dieser Version alle RMI-spezifischen Klassen aus dem
de.qfs.lib.log Package entfernt und in das de.qfs.lib.logrmi ; Package ausgelagert.
Das de.qfs.lib.tree Package wurde mit Version
0.98.1 eingeführt. Es besteht aus einer Sammlung von Klassen und
Interfaces zur Bearbeitung von Baumstrukturen.
Packages de.qfs.lib.log und de.qfs.lib.logrmi
Logging ist ein oft unterschätztes Hilfsmittel bei der
Softwareentwicklung. Je komplexer ein Programm ist, desto
schwieriger ist die Suche nach Ursachen für Probleme. Der Einsatz
eines Debuggers lohnt sich normalerweise erst, wenn die Quelle des
Übels einigermaßen eingegrenzt ist. Mit einem guten Logging
Konzept und der Unterstützung durch Tools zur Filterung und
Auswertung kann man einem Fehler oft so genau auf die Schliche
kommen, dass ein Debugger überflüssig wird.
Bei "herkömmlichem Logging" mittels println , das
bestensfalls noch durch ein DEBUG Flag aus dem
fertigen Programm entfernt werden kann, kommt es schnell zu
Problemen aufgrund der folgenden Mängel:
-
Kein einheitliches Konzept für die Form von Meldungen, so dass
mangels Gewichtung und Zuordnung zur Quelle der Überblick
verloren geht. Bei multithreading Problemen ist damit kein
Blumentopf zu gewinnen.
-
Zu grobe Kontrolle über die Generierung der Meldungen. Sie
lassen sich nur zur Compilezeit geschlossen aktivieren oder
deaktivieren. Bei aktivierten Meldungen wird dann schnell eine
kritische Masse erreicht, wo die Übersicht verloren geht und
sich Performanceeinbußen bemerkbar machen. In der Folge werden
dann Meldungen auskommentiert oder ganz entfernt, die zu einem
späteren Zeitpunkt wieder von Nutzen sein könnten.
-
Keine Unterstützung durch Tools. Wer sich in einem Editor durch
Logfiles in Megabyte Größenordnung kämpfen muß, hat nur geringe
Chancen, das zu finden, was er sucht.
Als Antwort auf diese Probleme bieten die de.qfs.lib.log und
de.qfs.lib.logrmi Packages:
-
Gewichtung der Meldungen in fünf "Wichtigkeitsstufen", von
Fehler über Warnung und Meldung zu
Methodenaufruf und Debugging, die ihrerseits
eine Unterstufe für Details haben.
-
Mit jeder Meldung wird neben der Stufe automatisch die Uhrzeit,
der aktuelle Thread sowie die aufrufende Klasse und Methode
vermerkt.
-
Ein mehrstufiges Filtersystem erlaubt es, die Erzeugung und
Weitergabe von Meldungen sehr fein zu regulieren und damit
sowohl die Performanceverluste zu minimieren, als auch den
Überblick über die Meldungen zu behalten.
-
Mit dem Logserver qflog steht ein freies
Tool zur Verfügung, das auf diesen Fähigkeiten aufbaut. Es
übernimmt sowohl die Darstellung, Sortierung und Filterung der
Meldungen, als auch die Kontrolle über die Generierung der
Meldungen zur Laufzeit eines Programms.
Da das de.qfs.lib.log Package unabhängig von allen anderen Packages der
qflib ist, kann es bei Bedarf in ein eigenes jar
Archiv extrahiert werden, um zum Beispiel den Downloadbedarf von
Applets zu reduzieren. Ausserdem macht es keinen Gebrauch von den
Collection Klassen, so dass das collections.jar
Archiv für JDK 1.1 Applets nicht bereitgestellt werden muss,
solange sie nur das de.qfs.lib.log Package verwenden.
Package de.qfs.lib.util
Das de.qfs.lib.util Package steht ebenfalls ganz weit unten in der
Packagehierarchie der qflib. Es besteht aus kleinen, nützlichen
Klassen, die unabhängig vom Rest der qflib sind und lediglich
das de.qfs.lib.log Package voraussetzen.
Das de.qfs.lib.util Package enthält unter anderem:
-
ArgsParser
-
Parser für Argumente, die einem Programm auf der Kommandozeile
übergeben werden.
-
DynamicClassLoader
-
Ein
ClassLoader der modifizierte Klassen zur
Laufzeit dynamisch nachlädt.
-
MapResourceBundle
-
Erweiterung des
ResourceBundle Mechanismus um häufig
benötigte Funktionen.
-
MultiMap
-
Eine zu den Collection Klassen kompatible
Map , die
mehrere Werte pro Schlüssel speichert.
-
Visitor
-
Implementierung des Visitor Patterns, auch als Multimethods
bekannt.
Package de.qfs.lib.config
Die Konfiguration ist ein wichtiger Aspekt eines Programms. Dazu
gehört zum einen die Möglichkeit, spezifische vorlieben des
Anwenders für die Parameter des Programms zu berücksichtigen. Zum
anderen ist es für den Anwender lästig, wenn er solche
Kleinigkeiten wie die Positionierung der Fenster oder die
Sortierung von Tabellen nach jedem Start neu anpassen muß.
Das de.qfs.lib.config Package vereinfacht die Handhabung einer solchen
Konfiguration und erlaubt das Speichern der Daten in Textdateien,
die vom Anwender gelesen und editiert werden können. Dazu kommt
ein Mechanismus, der die Überwachung und Anpassung der
Geometrieeigenschaften übernimmt.
Package de.qfs.lib.gui
In diesem Package sind diverse Klassen versammelt, die eine
ansprechende Gestaltung der Oberfläche eines Programms erleichtern
oder Hilfen für gewisse Schwächen und Fehler von Swing bieten.
Das Highlight ist eine Erweiterung der Swing JTable
um Funktionen zum Sortieren und Filtern von Zeilen, welche die
komplexe Problematik hinter einem sehr einfachen Interface
verbirgt. Ein kleines Demo namens SortedTable.java im demo
Verzeichnis zeigt diese in Aktion.
Package de.qfs.lib.option
Das de.qfs.lib.option Package vereint Konzepte aus de.qfs.lib.config und de.qfs.lib.gui ,
um das Erstellen von Dialogen, wie sie zum Beispiel für die
Einstellungen eines Programms benötigt werden, drastisch zu
vereinfachen.
Die zu editierenden Werte werden durch Options repräsentiert und über
OptionEdits
editiert. Dabei erfolgt die Gruppierung der Komponenten, ihr
Layout und ihre Beschriftung vollständig über Property Dateien.
Statt vieler kleiner Beispiele gibt hierzu das Demo
Options.java im demo
Verzeichnis einen guten Überblick über die vorhandenen
Möglichkeiten.
Package de.qfs.lib.command
Das Konzept der Commands hat sich bereits in
anderen Projekten bewährt. Es handelt sich dabei um eine Art
Nachrichtenaustausch, jedoch auf einer höheren Abstraktionsebene
als die AWT Eventloop.
Absender von Kommandos und deren Empfänger können unabhängig
voneinander über den CommandDistributor
agieren. Dies ermöglicht u.a. eine Kommunikation über
Bibliotheksgrenzen hinweg. Daneben wird das Auswerten von
Exceptions wesentlich vereinfacht, weil es einen
gemeinsamen Einstiegspunkt für vom Anwender ausgelöste Aktionen
gibt.
Package de.qfs.lib.transaction
Seit Version 0.97.0 gehört das de.qfs.lib.transaction Package zur
qflib. Mit seiner Hilfe lassen sich die Auswirkungen von
Transaktionen auf der Clientseite besser handhaben. Einzelne
Teilschritte können zu Transaktionen zusammengefaßt werden. Wenn
alles gut geht, werden diese in einem Rutsch mit commit
abgearbeitet, im Fehlerfall wird mit rollback alles bisher
geschehene rückgängig gemacht.
Package de.qfs.lib.tree
Das de.qfs.lib.tree Package wurde mit Version 0.98.1 eingeführt. Es ist
eine Sammlung nützlicher Funktionen zum Traversieren und
Manipulieren von Baumstrukturen. Zentraler Bestandteil ist das
TreeAdapter
Interface, das ähnlich zu Swing's TreeModel ist..
Dieses Package ist zur Zeit noch als experimentell anzusehen.
Multithreading ist bei der Implementierung kaum berücksichtigt und
einige Interfaces können sich noch ändern, allerdings nicht zu
sehr, da wir in unserem Produkt qftestJUI bereits
stark auf dieses Package setzen.
|