Dienstag, 4. November

Ein Überblick über Visual FoxPro 8.0

Der unverwüstliche Jürgen Wondzinski, alias wOOdy, in seinem wahren Element: FoxPro in den höchsten Himmel zu loben.

Die neue Version 8.0 von Visual FoxPro ist sicherlich das umfangreichste Update, das jemals für Visual FoxPro gab. Wenn man ein Buch über die Verbesserung innerhalb VFP7 führen würde, gäbe es jetzt genug Material für ein neues Kapitel zu demselben Thema zu schreiben: eine erfolgreiche Fortsetzungsgeschichte! Der Umfang der Verbesserungen reicht von kleinen Spracherweiterungen, die jeder Entwickler schon jahrelang gerne gehabt hätte, bis zu komplett neuen Technologien, die man alle erst einmal kennen lernen muss, um sie zu verstehen.

Es gab einmal ein VFP-Update, das immerhin drei ganze Jahre brauchte, um zu erscheinen: VFP7. Dieses Update enthielt alle Entwicklungsanstrengungen, die gebraucht wurden für die Interoperabilität mit .NET, eine bessere Unterstützung von COM+, Unterstützung für Web Services, IntelliSense etc. Es gab wesentliche Verbesserungen verglichen mit Visual FoxPro 6.0 und die meisten dieser Verbesserungen waren raffiniert und nicht leicht verständlich für Außenseiter wie eure Chefs.

Aber dann kam anderthalb Jahre später Visual FoxPro 8.0 heraus. Es enthielt alles, was man beim letzten Update vermisst hatte. Die meisten Erweiterungen kamen von der Wunschliste, die von www.UniversalThread.com betrieben wird. Jeder kann dort eintragen was auch immer er/sie in Visual FoxPro haben möchte. Dieses Microsoftprodukt wird so eng wie möglich an dem bleiben, was die Entwickler haben möchten. Und die Wunschliste enthält genügend Ideen, um mindestens zwei weitere Versionen herauszubringen.

wOOdy zeigt uns also alle Verbesserungen und die neuen Funktionen von Visual FoxPro 8.0:

Track: Eine Einführung in Visual FoxPro (Teil 1/2)

Der Track startet mit drei Vorträgen von Michael Niethammer, dem Gesellschafter-Geschäftsführer und Miteigentümer von TMN Systemberatung GmbH mit Firmensitz in Ilsfeld (in der Nähe von Heilbronn in Süddeutschland gelegen). Dieser Track ist ein Versions-unabhängiger Workshop für Einsteiger bei Visual FoxPro oder für Entwickler, die nicht viel Erfahrung mit VFP haben. Bis vor zwei Jahren gab es eine Pre-Konferenz zu diesem Thema, aber dann beschloss Rainer, diese drei Vorträge in der Hauptkonferenz mit einzuschließen.

Die Idee dahinter ist, den Teilnehmern die Chance zu geben, nur jene Vorträge zu besuchen, die sie wirklich interessierten und sie nicht dazu zu zwingen, am gesamten Workshop teilzunehmen, wenn sie z.B. nur an den fortgeschrittenen Teilen teilnehmen wollen. Erstaunlicherweise ist dieser Track der meist Besuchteste in den letzen Jahren, was meiner Meinung nach zeigt, dass es immer noch viele Entwickler gibt (oder gab), die von älteren FoxPro Versionen oder von anderen Entwicklungswerkzeugen zu Visual FoxPro wechseln. Der Track besteht insgesamt aus acht Vorträgen und ist über die ersten zwei Tage der Konferenz verteilt.

Der erste Vortrag (Einführung in Visual FoxPro) gibt einen Überblick über die Möglichkeiten und Werkzeuge von Visual FoxPro. Michael erklärt die gesamte IDE einschließlich der Entwicklerwerkzeuge wie den Object Browser, Class Browser, Profiler, etc.. Danach gibt er einen kurzen Überblick über die Visual FoxPro Basisklassen.

Der zweite Vortrag heißt Die Visual FoxPro Datenbank Engine1’. Michael handelt alle wichtige Themen ab wie Tabellen anlegen einschließlich einer Erklärung der Feldtypen und der verschiedenen, verfügbaren Index Typen. Er erklärt alles, was man bezüglich der Datenbankcontainer, gespeicherten Prozeduren und der referentiellen Integrität benötigt.

Mit den Kenntnissen des zweiten Vortrages im Hintergrund werden im folgenden Vortrag Die Visual FoxPro Datenbank Engine 2’ fortgeschrittene Datenbank-bezogene Themen behandelt. Die Hauptthemen sind Arbeiten mit lokalen, entfernten und Offline Sichten und Datenbankereignisse. Michael gibt ebenfalls eine Einführung in SQL-Befehle von VFP und SQL PassThrough.

Echte Windows Server-Services mit VFP

Nun kommen wir zu den Vorträgen meines Mitreporters Armin Neudert. Er erklärt zunächst, was Services/Dienste sind, wofür sie gut sind und gibt dann einen Überblick über die gesamte Service Technologie von Windows NT, Windows 2000, XP (Home und Professional) und den neueren Versionen. Er stellt heraus, dass Windows 95, 98 und ME lediglich eine sehr kleine Anzahl dessen, was er erklärt, unterstützten.
Armin erzählt, warum eine Visual FoxPro Anwendung nicht als Service ohne die Hilfe von anderen Werkzeugen laufen kann. Er erklärt uns, warum Werkzeuge wie srvany.exe, Firedeamon oder andere Wrapperanwendungen nicht die besten Lösungen sind, um eine VFP-Anwendung wie Windows Service auszuführen. Sie unterstützen nicht alle Ereignisse, die ein Service unterstützen kann und sie haben vor allem Probleme, wenn die Wrapperanwendung angehalten wird.

Er präsentiert eine Lösung, die Visual Basic 6.0 und ein freies ActiveX -Steuerelement benutzt, um bessere Wrapperanwendungen zu bauen, die mit VFPCOM DLL sprechen können. Diese Lösung unterstützt alle Ereignisse wie Start, Anhalten, Unterbrechen, Fortsetzen und Herunterfahren von Windows. Die VB6 Anwendung enthält ein Timerobjekt, das regelmäßig eine Methode des Com-Server aufruft, damit die VFP-Anwendung arbeiten kann. Das Timer-Objekt ist in der Wrapper.exe gelegen, weil VFP keine Timer in Inprocess-Servern unterstützt. Armin zeigt uns auch, dass die VB-Anwendung beim COM-Server nach einer Nachricht fragt, um sie im Windows-Ereignisprotokoll abzulegen, nachdem der VFP-Code ausgeführt hat, was vom Timer ausgelöst wurde.

Nach einem Überblick über Themen wie wie kontrolliere ich eine Service-Anwendung’, was muss man über die Kommunikation mit Anwendern wissen’ und Fehlerbehandlung in einer Serviceanwendung’ erklärt er uns, was man über die Installation eines Servers wissen muss. Er demonstriert, wie einfach das Setup seiner Lösung ist. Er baut einen neuen COM DLL, kopiert einfach die Wrapper-Anwendung in ein anderes Verzeichnis und benennt es um. Danach wird der Name der vom VB6 Teil erzeugten COM-Klasse in der INI Datei des Wrappers geändert – dort, wo man auch die Zeitsteuerung konfiguriert. Er führt die Wrapper.exe mit einem Befehlszeilenparameter (Line Switch) aus, um sie als ein Service registriert zu bekommen. Dann wechselt er zur Management Konsole und startet den Service, der sofort wie erwartet ausgeführt wird.

Glücklich darüber, dass alles gut ging und das Publikum seine Vorlesung schätzte, nimmt Armin seinen Job als UT Reporter wieder auf....

Softwarearchitektur und Architekturmuster

Nathalie Mengel führt Entwurfsmuster und die Prinzipien der Softwarearchitektur beim Publikum ein. Wie sie umreißt, kann ein instinktiv entwickeltes Anwendungsdesign zwar hier und da erfolgreich sein. Im Gegenzug dazu ist ein gut strukturiertes Design, das auf dem korrekten Gebrauch eines Entwurfsmusters basiert, schwieriger zu erstellen, aber erfolgreicher auf lange Sicht. Das Entwurfsmuster zu kennen und erfolgreich anzuwenden ist allerdings erst die Hälfte der Geschichte. Anti-Patterns zu vermeiden ist die andere Hälfte. Kenntnisse von Anti-Pattern sind deshalb grundlegend für einen Entwickler oder einen Systemdesigner, wenn er erfolgreich sein will. Daher präsentiert Nathalie beides in ihrem Vortrag.

Sie zeigt, dass Software Systeme einen immer größeren Einfluss in unserem täglichen Leben haben werden. Wenn man die übliche Investitionsstruktur analysiert, stellt sich heraus, dass das meiste Geld für Wartung und nicht für Entwicklung ausgegeben wird. Der Hauptgrund für diese Betriebskosten ist das Design der Software. Gut designte (und dokumentierte) Software wird für einen Bruchteil der Kosten gepflegt, die entstehen, wenn das Design katastrophal schlampig ist. Ein schlampiges Design ist auf mangelndes Verständnis bezüglich des zu lösenden Problems, nachlässige Analyse von äußeren Einflüssen, mangelnde Bestimmung der Parameter u. v. a. zurückzuführen. Wenn diese Grundlagen nicht sorgfältig herausgearbeitet werden, kann das beste Design nicht helfen. Normalerweise wird eine sorglose Projektvorbereitung von dem mangelnden Verständnis begleitet, wie man ein System gut entwirft. Dann gibt es praktisch nichts mehr, dass die üblichen Katastrophen verhindert. Aktuelles Beispiel aus Deutschland: die peinliche Verspätung bei der Einführung des Mautkontrollsystems für LKWs.

Es gibt zwar kein Allheilmittel, aber das sorgfältige und gründliche Strukturieren des Softwaresystems ist wesentlich, um die meisten dieser Probleme zu vermeiden. Eine sorgfältige und gründliche Strukturierung wird Softwarearchitektur genannt. Sie teilt ein System in verschiedene Einheiten – Bestandteile und Untersysteme - mit vorbestimmten Verantwortlichkeiten und Wechselwirkungen auf.

Gut entworfene Softwarekomponenten sind gekapselt. Jeder Bestandteil ist fähig, die Aufgaben oder Pflichten zu erfüllen, für die er entworfen wurde. Er hat auch ein gut-definiertes Interface, durch das er mit anderen Komponenten kommunizieren kann. Die Kombination dieser Komponenten und ihre Interaktionen bilden das Anwendersystem.

Nathalie stellt heraus, dass diese Komponenten Objekte genannt werden. Jedes wird erst zur Laufzeit von dem Basis-Design erzeugt, das auf einem Entwurfsmuster oder einer Variante davon basiert. Das Design bestimmt ebenfalls die Interaktion dieser Komponenten miteinander und mit der Umgebung.

Je unabhängiger diese Komponenten voneinander sind, desto weniger wird das Auswechseln einer Komponente seine Beziehung zu den anderen oder die Beziehung der anderen Komponenten untereinander beeinflussen. Je größer diese Unabhängigkeit durch ein passendes Design gemacht werden kann, desto stabiler ist die Softwarearchitektur.

Stabilität ist eine der nicht-funktionalen Charakteristiken einer Software, die unter keinen Umständen vernachlässigt werden darf. Nathalie erklärt, dass die funktionalen Charakteristiken im Mittelpunkt des Interesses stehen, weil die Spezifikationen oft nur beschreiben, welche Art von Funktionalität der Anwender erwartet. Nicht-funktionelle Charakteristiken werden in den Spezifikationen normalerweise ausgelassen. Sie sind gemäß den Ausführungen von Nathalie für den Erfolg und den Wert einer Software grundlegend. Neben der Stabilität beinhalten andere nicht funktionelle Charakteristiken wie Wartbarkeit, Erweiterbarkeit, Wiederverwendbarkeit und Testbarkeit.

Um ein Anwendungssystem effektiv entwickeln zu können, muss seine Architektur von Anfang an mit großer Sorgfalt bezüglich dieser nicht-funktionalen Charakteristiken entworfen werden. Wenn ein Softwaresystem einmal eingesetzt wird, gewinnen von da an nicht-funktional Charakteristiken wie Zuverlässigkeit oder Effizienz immer mehr an Bedeutung.

Nathalie erklärt daraufhin sorgfältig die Basistechniken der Softwarearchitektur wie

Anschließend erklärt sie, was Muster sind und welche Rolle sie in der Softwarearchitektur spielen. Muster bewirken mehr als das, was die oben stehenden Prinzipien ausdrücken. Sie bieten nicht nur Hilfe oder Führung, sondern auch Lösungen, die sofort benutzt werden können.

Während die oben stehenden Prinzipien auf Abstraktionen beruhen, stammen die Muster, die heutzutage in der Softwarearchitektur verwendet werden, aus der Analyse der täglichen Praxis und Verfahrensweise. Muster bieten nicht nur lediglich eine Lösung für eine gegebene Aufgabe an und wie sie eingesetzt wird, sondern sie können ebenfalls beschreiben, ob es konkurrierende Muster gibt, die Lösungen für ähnliche Aufgaben anbieten und auf welche Umwelteinflüsse man aufpassen muss, wenn ein in Frage kommendes Muster eingesetzt wird.

Ein weiterer wichtiger Vorteil von Mustern besteht darin, dass sie nicht nur eine Lösung anbieten, sondern eine komplette Liste der Regeln, wie man das System analysieren kann, um sie einzusetzen. Komplexe Umstände können viel besser verstanden werden, wenn man nicht eine separate Methode oder Lösung für jede Aufgabe finden oder erfinden muss. Muster werden mit vordefinierten Eigenschaften bereitgestellt und bieten alle notwendigen Informationen bezüglich ihres Einsatzes an. Sie bieten sozusagen ein vordefiniertes Modulset mit bekannten Charakteristiken an, welche leicht bei der Erstellung einer Lösung eingebunden und kombiniert werden können. Diskussionen zwischen Entwicklern werden grundlegend vereinfacht, weil jeder weiß und akzeptiert, wofür ein bestimmtes Muster steht.
Um dies verständlicher zu machen, erklärt Nathalie die Natur von zwei gut bekannten Mustern. Sie erklärte ebenfalls, warum Schichten nicht als Muster angesehen werden können. Allerdings können Muster allein auf lange Sicht nicht weiterhelfen. Es erfordert eine strenge Disziplin von jedem Entwickler und allen Mitgliedern der Gruppe, in Mustern zu denken. Deswegen wurden die Anti-Muster entwickelt.

Anmerkung des Reporters: Während Antimaterie das Gegenteil von Materie ist, bedeutet Anti-Muster nicht das Gegenteil von Muster. Anti-Muster sind die hässlichen Brüder von gut entworfenen Mustern.

Nathalie zeichnet auf, dass Anti-Muster aufgrund von schlampigen Lösungen für eine Situation oder aufgrund einer eigentlich guten Lösung, die schlecht eingesetzt wurde, entstehen. Um die Fallen von Anti-Mustern zu vermeiden, muss man sie kennen. Es lohnt sich auch, die Verhaltensweisen zu kennen, die zu diesen Anti-Pattern führen. Nathalie verbringt eine beachtliche Zeit damit, diese typischen Benehmensstrukturen herauszuarbeiten. Unter diesen Hauptübeln der Softwareentwicklung befinden sich

Anhand eines Copy&Paste Programmes erklärt Nathalie uns, dass sogar ein guter Entwickler in die Falle der Anti-Muster geraten kann, wenn sie/er die geistige Disziplin vergisst, die jeder Entwickler einsetzen muss, wenn er/sie auf lange Sicht erfolgreich sein will.

Businessobjekte –Entwicklungsstrategie mit Zukunft

Während der Einführung in die Methodik der Geschäftsobjekte erklärt Marcus Alt warum sie etwas sind, was ein Entwickler benutzen sollte. Der Hauptgrund, den er erwähnt, ist die Tatsache, dass Geschäftsobjekte die Lösung für das Wo ist der Code?’ Problem sind. Wir wissen dann immer, wo der Code für eine bestimmte Aufgabe ist oder zumindest wo er sein sollte. Das bedeutet einfacherer Wartung, Planung, Wirksamkeit, was wiederum bedeutet, dass man einen viel besseres und klareres Design aufgrund der Normalisierung der Anwendungslogik hat. Markus stellt heraus, das auch das Testen einfacher wird, da man Änderungen nur noch an einem und nicht an mehreren Orten hat. Dadurch kann man kleine, gekapselte Komponenten der Anwendung für den Datenzugriff testen.

Er stellt heraus, dass man sich bewusst sein sollte, dass die Anzahl von Business- und Geschäftsobjekten schnell ansteigen kann, wenn man an einem größeren Projekt arbeitet. Er meint, man sollte das nicht als Nachteil betrachten. Man wird eine Vielzahl Klassen haben, aber immer wissen, welche man benutzen muss und wo man ändern muss.

Mit einer detaillierten und ausführlichen Muster/Beispielausführung, die TMN (die Firma, deren Miteigentümer Marcus ist) für Multi-Tier-Architektur mit Visual FoxPro-Trainingsklassen benutzt, zeigte er dann, wie Geschäftsobjekte mit VFP gebaut werden und wie gut ein Design der Ausführung von Objekten für Geschäftsregeln aussehen kann. Die Beispielausführung ist auf der Konferenz CD und bestimmt ein guter Start für Leute, die neu bei diesem Thema sind und in die richtige Richtung starten wollen.

Erzeugen von hierarchischen XML mit VFP

Dies ist der erste Vortrag, den Venelina Jordanova jemals in Englisch in Frankfurt hält. Sie ist die Inhaberin einer Softwarefirma in Varna in Bulgarien (Osteuropa). Diese Firma programmiert einige der Verbesserung für das Visual Extend Framework, das die deutschsprachige FoxPro User Group herausgibt und weiterentwickelt.

Das Hauptziel dieses Vortrages ist es, zu zeigen, wie man mit hierarchischem XML umgeht, besonders der Gebrauch einer der großartigen neuen Funktionen in Visual FoxPro 8.0. die XML-Adapterklasse. Viele haben bereits mit den XML-Funktionen gearbeitet, die in Visual FoxPro 7.0 eingeführt wurden, aber die Möglichkeiten, die der XML-Adapter uns bringt, sind viel besser, wie Venelina uns zeigte.

Sie beginnt mit einer kurzen allgemeinen Einführung zu XML und führt aus, was ein gut gestaltetes und gültiges XML-Dokument kennzeichnet. Daraufhin erklärt sie die Basiskenntnisse, die man bezüglich des XML-Adapters und ihrer Mitglieder XMLTable und XMLField haben muss. Sie erläutert, dass der XML-Adapter ein bidirektionales Werkzeug ist, das nicht nur die Möglichkeit bereitstellt, hierarchisches XML zu laden, sondern auch Funktionalität anbietet, mit der man manipulieren und diese Arten von Dokumente speichern kann.

Sie führt vor, wie man auf den Inhalt zugreifen kann und wie man VFP-Cursor erzeugen und aus der in XML enthaltenen Tabelle mit der Methode TOCursor() generieren kann.
Danach werden DiffGrams erzeugt. Ein DiffGram ist eine spezielle Art eines XML-Dokumentes, das erzeugt wird, um die in den Daten gemachten Änderungen zu beschreiben. Venelina stellt heraus, dass man auf SET MULTLOCKS ON aufpassen muß und das TableBuffering einschalten soll, um DiffGrams zu erzeugen, egal ob man die XMLUODATEGRAM()-Funktion oder den XML-ADApter für diese Aufgabe verwendet.

Der interessanteste Teil des Vortrages beginnt: Wie erzeuge ich hierarchisches XML mit VFP. Leider bietet die XML-Adapterklasse bisher keine Möglichkeit, diese Aufgabe zu meistern. Venelina zeigt uns eine Möglichkeit, diese Begrenzung zu umgehen. Man verwendet einfach eine zweite XML-Adapterklasse, mit welcher man die Childdaten als XML in ein Memofeld des ParentCursors speichert. Man muss noch mehr tricksen, bis endlich der von uns benötigte Child XML Datensatz so formatiert ist, wie wir es benötigen. Am Ende präsentiert Venelina ein gültiges und korrekt formatiertes hierarchisches XML-Dokument, das mit dem XMLAdapter und angepasstem Code erzeugt wurde.

Als Funktionsnachweis lädt Venelina schließlich das Dokument von einer ASP.NET-Seite, die alle Daten korrekt anzeigt.