|
Linux ComponentWareSoftware-Entwicklung auf der Basis von fertigen Komponenten wird dank Kylix jetzt auch unter Linux möglich.Mit Kylix kommt in diesen Tagen nicht nur das erste echte RAD-Tool für Linux auf den Markt. Kylix bzw. sein Windows-Gegenstück Delphi stehen auch für eine ganze Komponenten-Kultur, die unter Windows eine riesige Anhängerschaft hat. Dort ist es wohl die Technologie, für welche die meisten freien Software-Bausteine angeboten werden.. Dieser Beitrag gibt einen Überblick über die Komponenten-Philosophie und die dahinterstehende Software-Technik und zeigt dann anhand von zwei Beispielen, wie Softwareentwickler davon profitieren können. Kylix enthält eine völlig neue Komponenten-Bibliothek mit dem Namen CLX (sprich "Klix"), die vor allem für Oberflächenelemente benutzt wird. Diese Bibliothek ersetzt die Visual Component Library (VCL) von Delphi mit einem Betriebssystem-unabhängigen Ansatz. Das Komponentenmodell, die grundlegende Objekthierarchie und die meisten Schnittstellen sind jedoch identisch. Somit existiert nun mit CLX/VCL eine gemeinsame Basis unter Linux und Windows für die Entwicklung von binären Softwarebausteinen. (Einen ausführlichen Artikel zu CLX finden Sie ebenfalls in diesem Heft.) Objektorientierung im GroßenGenerell werden Komponenten als die Bausteine für Objektorientierung im Großen betrachtet. Die Vorstellung dabei ist, dass ein Großteil der Anwendungs-Software im Wesentlichen durch Zusammenstellen von fertigen Grundelementen, eben der Komponenten, erstellt werden kann. Der Anwendungsentwickler muss dazu seine Aufgabenumfeld sehr gut kennen, einen Überblick über die vorhandenen Komponenten haben und gut mit der als "Kleber" (engl. glue) benutzten Programmiersprache umgehen können. Erspart wird ihm jedoch die Beschäftigung mit Spezialgebieten wie Datenbanken, TCP/IP-Kommunikation, X-Programmierung, Drucken usw. Für diese technischen Probleme werden von Spezialisten wiedereinsetzbare Komponenten geschaffen, in denen die Schwierigkeiten der Systemprogrammierung verborgen sind. Das kann eine Komponente für eine TCP/IP-Verbindung sein, für eine Datenbank-Abfrage, für einen Drucker. Die Komponenten-Entwickler sind auf technische Probleme spezialisiert und stellen mit ihren Lösungen die Bausteine für die Anwendungsentwickler zur Verfügung. Eine Komponente wird als binärer Software-Baustein geliefert und stellt
seine Funktionalität dem Anwender über Methoden, Eigenschaften und
Events zur Verfügung. Mit den Eigenschaften wird die Komponenten, oft
schon zur Entwurfszeit, projektiert und an die Anwendung angepasst. Über
Methodenaufrufe wird der Komponente aus der Anwendung ein Befehl erteilt, und
Ereignisse dienen dazu, der Anwendung aus der Komponenten heraus eine Nachricht
zu schicken. Nehmen wir als Beispiel eine sehr einfache Komponente, einen Schalter wie er z.B. in Dialogen zum Bestätigen benutzt wird. Typische Eigenschaften eines Schalters sind seine Position im Dialog, seine Größe und seine Farbe. Die Methoden einer Komponente würden ihn z.B. aktivieren und deaktivieren und mit einem Ereignis könnte der Schalter die Anwendung benachrichtigen, wenn er betätigt wurde. Gerade Ereignisse sind ein sehr interessanter Mechnismus, da aus der Komponente heraus ein Aufruf in eine Anwendung getätigt werden muss, die beim Übersetzen der Komponente noch nicht vorhanden ist. Hier wird eine objektorientierte Form des Call-back-Mechanismus benötigt. KomponentenmodelleIn einigen Systemumgebungen funktioniert die Komponenten-basierte Entwicklung heute in Ansätzen schon recht gut. Von Microsoft gibt es mit der COM-Technologie und Visual Basic eine tief in Windows integrierte Komponententechnologie und eine einfache (manche sagen zu einfache) Anwendungs-Programmiersprache. Als Programmiersprache für die Komponenten selbst kommt meist C++ zum Einsatz. In der Java-Welt gibt es mit Java Beans und Enterprise Java Beans sogar zwei grundsätzlich verschiedene Komponentenmodelle, die beide Java sowohl für die Komponenten als auch für die Anwendung benutzen. Dies führt zu einer höheren Durchgängigkeit und damit zu einer einheitlicheren Tool-Landschaft und besseren Ausnutzung von Know-how. Den selben Vorteil hat das Delphi/Kylix-Komponentenmodell. Auch hier wird eine Programmiersprache, Object Pascal, durchgängig für beide Aspekte der Entwicklung benutzt. Zusätzlich hat Borland diese Programmiersprache durch einige Erweiterungen optimal an die Komponenten-Philosophie angepasst, so dass es heute keine kommerzielle Sprache gibt, die besser für die Erstellung und Verwendung solcher Softwarebausteine geeignet ist als Object Pascal. Ansonsten ist das Komponentenmodell von Kylix dem der Java Beans sehr ähnlich. Wie dieses (und anders als z.B. CORBA) setzt es auf
Binärkompatibilität zwischen Anwendung und Komponente. Das bedeutet,
dass beim Übersetzen des Quellcodes (bei Kylix in Maschinensprache, bei
Java in Byte-Code) dafür gesorgt werden muss, dass Aufrufe zwischen den
Partnern funktionieren auch wenn die Bausteine einzeln kompiliert und gebunden
werden. Unter Kylix und Delphi wird das dadurch erreicht, dass alle Komponenten
von der Basisklasse TComponent erben müssen. Dadurch stehen automatisch
grundlegende Dienste wie Meta-Informationen (auch Inspektion oder Reflexion
genannt), Persistenz und visueller Entwurf zur Verfügung. Ausgeliefert
werden Komponenten in sogenannten Packages, das sind shared objects mit einer
vorgegebenen Schnittstelle, die eine oder mehrere Komponenten enthalten
können. Marktplätze für KomponentenUnter Windows gibt es eine rege Szene für den Austausch von Delphi-Komponenten und es steht zu erwarten, dass das für Linux bald ebenso sein wird. So hat z.B. gerade das Swiss Delphi Center unter http://www.swissdelphicenter.ch/ einen Bereich für Kylix-Komponenten eingerichtet. Andere Anlaufstellen für Delphi-Komponenten sind http://www.torry.net/ oder http://www.delphisource.com/. Insgesamt gibt es wohl einige Dutzend dieser Delphi-Komponenten-Börsen im Web. Ein großer Teil der dort angebotenen Software ist Freeware, andere sind kommerziell, werden aber inklusive Quellcode vertrieben. Ein erheblicher Anteil dieser Komponenten dürfte ohne aufwändige Änderungen nach Linux portierbar sein. Damit steht einem Marktplatz für Linux-Software-Komponenten nichts mehr im Weg. Wer eine solche Kylix-Komponente herunterlädt, registriert das Package in der Kylix- Entwicklungsumgebung mit dem Befehl Komponenten/Package installieren... und sieht die neue Komponente sofort auf einer Seite der Komponentenpalette. Vor dort kann sie per Drag and Drop auf ein Formular oder ein Datenmodul gezogen werden. An dieser Stelle muss man zwischen visuellen und nicht-visuellen Komponenten unterscheiden. Visuelle Komponenten sind typische Elemente der Bedienoberfläche, z.B. Schalter, Eingabefelder, Listen usw. Diese Komponenten stellen sich beim Entwurf genauso dar, wie später im laufenden Programm. Nicht-visuelle Komponenten sind in der fertigen Applikation nicht zu sehen und werden im Entwurfsmodus nur mit einem kleinen Symbol dargestellt, damit sie besser editiert werden können. Beispiele für nicht-visuelle Komponenten sind Datenbank-Verbindungen, Drucker oder TCP/IP-Connections. Die Eigenschaften der Komponente werden im Objekt-Inspektor angezeigt und können dort verändert werden. Diese Änderungen spiegeln sich sofort in der Komponente selbst wieder. Ereignisse aus der Komponente werden per Vorgabe im übergeordneten Formular oder Datenmodul bearbeitet. Der Objekt-Inspektor legt nach Wunsch eine entsprechende Methode an und verbindet sie mit dem entsprechenden Ereignis aus der Komponente. Beim Übersetzen des Programms kann man wählen, ob die Komponente als eigenständiges binäres Modul verwendet werden soll oder alles zu einem einzigen ausführbaren Programm gebunden wird. Erste Third-Party-Komponenten verfügbarEine aktuell schon verfügbare Dritthersteller-Komponente für Kylix ist MtkMemData von MorphTek.com. Die Komponente selbst ist Freeware und steht auf http://www.morphtek.com zum Download bereit. Für den Quellcode erwartet der Hersteller allerdings einen Obolus.. Mit dieser Komponente können tabellenartige Datenstrukturen im Speicher abgelegt werden, um anschließend über eine Standard-Schnittstelle wie auf die Ergebnismenge einer Datenbank-Abfrage zuzugreifen. Dieses Vorgehen erscheint auf den ersten Blick umständlich, ist jedoch im Rahmen einer Komponenten-Strategie sehr sinnvoll. Für die Standard-Schnittstelle von Datenmengen (manchmal auch record set genannt), wie sie von CLX/VCL definiert wird, existiert nämlich eine reiche Auswahl an Zusatzkomponenten und Werkzeugen. Z.B. zum Editieren der Daten in Formularen und Datengittern, zum Erzeugen von Diagrammen und Graphiken, zum Konvertieren in andere Datenformate, zum Übertragen auf andere Rechner, zum Manipulieren, zum Laden und Speichern, zum Umwandeln von und nach XML, zum Erstellen von Reports und vieles mehr. Wenn man also für eine eigene Datenstruktur diese Komponente benutzt, kann man sofort aus all diesen Funktionen wählen und sie in Form einer weiteren Komponente mit wenig Aufwand in das eigene Programm integrieren. Demnächst verfügbar ist die IP-Komponentensammlung von IP*Works von /n software. Hierbei handelt es sich um ein Package mit 22 Komponenten, die alle Anforderungen rund um das Internet Protokoll abdecken. Das Spektrum reicht vom FTP-Client über die E-Mail-Protokolle bis zum LDAP-Client. Der Vorteil an solchen Komponenten liegt darin, dass sie die umständliche Socket-Programmierung kapseln und den Zustand der Verbindung verwalten. Sobald Daten ankommen, die Verbindung abbricht oder ähnliches, meldet sich die Komponente per Ereignis bei der Anwendung. Laut Hersteller zeichnen sich die IP*Works-Komponenten neben dem geringen Ressourcenbedarf und der einfachen Benutzung gerade durch die konsequente Asynchronität aus. Somit kann meist auf die sonst nötige Programmierung mit mehreren Threads verzichtet werden. IP*Works ist ein kommerzielles Software-Paket und kann als Evaluationsversion auf http://www.nsoftware.com heruntergeladen werden. Nach den Angaben von /n software sollte die Kylix-Version zum Zeitpunkt des Erscheinens dieses Heftes ebenfalls als Demo erhältlich sein. Online-AktienkurseIm folgenden Beispiel-Programm namens StocksOnline werden diese beiden Packages eingesetzt, um eine einfache Anwendung zur Verwaltung von Aktienkursen zu erstellen. Die aktuellen Kurse werden per HTTP aus dem Internet abgefragt und in einer speicherresidenten Tabelle abgelegt. Der Inhalt dieser Tabelle kann dann mit weiteren Komponenten anzeigt, ausgewertet, gespeichert oder in eine Datenbank übertragen werden. Nachdem die Komponenten heruntergeladen und wie beschrieben installiert
wurden, erzeugt man mit dem Befehl New/Application eine neue Anwendung. Diese
besitzt auch gleich ein erstes Formular, auf der eine Instanz der
MtkMemData-Komponente positioniert wird. Die Tabelle soll die Spalten Symbol
(Kurzzeichen der Aktie), Last (letzter Kurs), Date, Time, Change
(Veränderung gegenüber dem Vortag), Open (Eröffnungskurs), High
(Tages-Höchststand), Low (Tages-Tiefststand) und Volumne (Umsatz)
enthalten. Dies kann über den Objekt-Inspektor und den Eigenschafts-Editor
der Komponente eingestellt werden. Um den Inhalt der Speicher-Tabelle anzuzeigen, kann man ein Datengitter verwenden. Es wird mit der Tabelle über eine weitere Komponente, die Datenquelle (DataSource), verbunden. Die Aufgabe der Datenquelle besteht darin, mehrere Daten-Kontrollelement wie das Datengitter oder ein Diagramm mit der selben Datenmenge, in diesem Fall der Tabelle, zu verbinden. Die Navigator-Komponente fügt der Anwendung die wichtigsten Befehle für das Datengitter hinzu. Dazu gehören das Rollen durch die Tabelle sowie Einfügen, Ändern und Löschen von Zeilen. Der Navigator ist im Bild als Reihe von Schaltern mit Pfeilen und anderen Symbolen zu sehen. Das Datengitter und der Navigator sind hervorragende Beispiele dafür, wie man durch die Verwendung einer Standard-Schnittstelle den Einsatz weiterer Komponenten ermöglicht. Diese beiden Komponenten sind Bestandteil der mit Kylix mitgelieferten CLX-Bibliothek und arbeiten problemlos mit der MorphTek-Komponente zusammen. An dieser Stelle kann man die Anwendung schon einmal übersetzen und starten. Im Datengitter können nun Einträge angelegt und editiert werden. Was man nicht sieht, ist, dass diese Daten in der speicherresidenten Tabelle abgelegt sind. Über die Methoden der Speicher-Tabelle könnte man nun auf einfache Weise weitere Funktionen hinzufügen, z.B. das Speichern und Laden der Aktienkurse in und aus einer Textdatei. Im Beispiel werden nun die Aktienkurse online aus dem Internet geholt. Yahoo
bietet einen Service an, der diese Kurse per HTTP-Abfrage zugänglich
macht. Wenn man dem Server die richtige URL mit den gewünschten
Aktien-Kurzzeichen schickt, antwortet er mit einer Textdatei, die alle Angaben
enthält. Diese Aufgabe übernimmt die HTTP-Komponente der IP*Works
Suite. Der Schalter mit der Aufschrift Update löst ein Ereignis aus, auf
das hin die URL zusammengestellt und über die HTTP-Komponente als GET
abgeschickt wird. Für die Aktien-Kurzzeichen wurde links im Formular noch
eine Listbox eingefügt, in die man die gewünschten Kurzzeichen in der
Entwicklungsumgebung sehr einfach eintragen kann. Diese Liste zur Laufzeit
abzuändern wäre eine nützliche und einfache Erweiterung für
dieses Programm. Der Quellcode für das Senden der HTTP-Anfrage ist im
Listing 1 zu sehen. Die URL wird aus den Listbox-Einträgen mit Pluszeichen
zusammengebaut. Der eigentliche Sendebefehl steckt in der Zuweisung
HTTP1.Action := httpGet. Bis die Antwort vom Yahoo-Server eintrifft, dauert es je nach Internet-Verbindung um die zehn Sekunden. Das Beispielprogramm wartet aber in dieser Zeit nicht aktiv, da hier konsequent auf Ereignisse gesetzt wird. D.h. die HTTP-Komponente meldet sich per Ereignis OnTransfer, wenn die Antwort eintrifft. Auf diese Event reagiert die Applikation, zerlegt die Textdatei in die einzelnen Bestandteile und trägt sie in die Speicher-Tabelle ein. Die Methode HTTP1Transfer wird aufgerufen, wenn ein Teil der Antwort eingetroffen ist. Sie hängt das Paket an den bisher noch nicht ausgewerteten Text in rPrevText und analysiert dann alle mit LF abgeschlossenen Zeilen. Die Standard-Schnittstelle von Datenmengen sieht für das Einfügen von neuen Zeilen den Ablauf Append, Setzen der neuen Werte und ein abschließendes Post vor. Der abschließende Aufruf von MemTable. Cancel ist nötig, weil in der Schleife hinter der letzten Zeile der Antwort noch eine weitere angefügt wird. procedure TForm1.HTTP1Transfer(Sender: TObject; Direction, BytesTransferred: Integer; Text: String); var s: string; i, lastI: Integer; begin s := rPrevText + Text; lastI := 1; MemTable.DisableControls; MemTable.Append; for i := 1 to Length(s) do begin if s[i] = ',' then begin MemTable.Fields[rCurrCol].AsString := Parse(s, lastI, i-1); lastI := i+1; Inc(rCurrCol); end else if s[i] = #10 then begin MemTable.Fields[rCurrCol].AsString := Parse(s, lastI, i-2); MemTable.Post; lastI := i+1; rCurrCol := 0; MemTable.Append; end; end; MemTable.Cancel; rPrevText := Copy(s, lastI, Length(s) - lastI + 1); MemTable.EnableControls; end; Damit ist die kleine Anwendung auch schon fertig. Der größte
Aufwand steckt dabei im Zusammenbauen der URL und im Zerlegen der Antwortdatei.
Für die Optik der Anwendung, das Browsen und Bearbeiten der
Speicher-Tabelle und die HTTP-Kommunikation sind keine bzw. nur einzelne
Quellcode-Zeilen nötig. Damit demonstriert dieses Beispiel recht gut,
warum das Komponenten-basierte Entwicklungs-Modell immer mehr begeisterte
Anhänger findet. Nun macht es sich dank Kylix daran, auch die Plattform
Linux zu erobern. Der Autor ist Diplom-Physiker und arbeitet seit über 15 Jahren als Coach, Software-Architekt und Verfasser von Fachartikeln. Er hat im Jahre 1998 die dataWeb GmbH gegründet, welche Software-Tools für Datenbankentwickler erstellt und vertreibt. Das aktuelle Projekt von dataWeb ist eine Multi-User-Datenbank-Komponente für Kylix. Der Autor freut sich über Anmerkung zu diesem Artikel an pohmann@dataweb.de.
|