Quality First SoftwareQuality First Software
qflib
Packages
EinführungPackagesBeispieleAPI DokumentationProjekte
Auf dieser Seite
Überblick
Packages de.qfs.lib.log und de.qfs.lib.logrmi
Package de.qfs.lib.util
Package de.qfs.lib.config
Package de.qfs.lib.gui
Package de.qfs.lib.option
Package de.qfs.lib.command
Package de.qfs.lib.transaction
English version
Overview
Packaged de.qfs.lib.log and de.qfs.lib.logrmi
Package de.qfs.lib.util
Package de.qfs.lib.config
Package de.qfs.lib.gui
Package de.qfs.lib.option
Package de.qfs.lib.command
Package de.qfs.lib.transaction
Überblick

Die qflib gliedert sich in thematisch geordnete Packages, die aufeinander aufbauen. Die Abhängigkeiten der Packages voneinander lassen sich dem folgenden Diagramm entnehmen:

qflib hierarchy

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.

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 Meldungsgenerierung 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.

Verweise  Beispiele, API Referenz
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 ResourcBundle 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.
Verweise  Beispiele, API Referenz
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.

Verweise  API Referenz
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 Sortierung und Filterung, welche die komplexe Problematik hinter einem sehr einfachen Interface verbirgt. Ein kleines Demo namens SortedTable.java im demo Verzeichnis zeigt diese in Aktion.

Verweise  Beispiele, API Referenz, Demo SortedTable.java
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.

Verweise  API Referenz, Demo Options.java
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.

Verweise  API Referenz
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.

Verweise  API Referenz

Letzte Änderung: 17.02.2001, Copyright © 2000 Quality First Software, Gregor Schmid