Klassenauflistungen mit dem Dictionary-Objekt
Geschrieben von: Marc Teufel Mit Klassenauflistungen hat jeder ernsthafte Visual Basic-Programmierer irgendwann einmal zu tun. Ob freiwillig oder unfreiwillig sei mal dahingestellt, klar ist aber, wer sie einmal kennen- und liebengelernt hat will nicht mehr ohne sie auskommen. Um so schlimmer also, daß gerade diese beliebte Technologie nicht in VBScript und ASP zur Verfügung steht. Was also tun? Dieser Artikel zeigt einen kleinen Trick mit dem Klassenauflistungen sehr einfach aufgebaut und verwendet werden können. Wie ging das nochmal in Visual Basic?Klassenauflistungen in Visual Basic sind relativ einfach zu handhaben, da ja dort ein Klassengenerator zur Verfügung steht der die meiste Programmierarbeit abnimmt. Diesem Artikel liegt zu Demonstrationszwecken ein kleines VB-Beispiel bei, in dem eine Klassenauflistung zum Einsatz kommt. Hier ist der VB-Klassengenerator zu sehen, in dem ich eine kleine Klassenauflistung (colAdressen) zur Speicherung von Adressen (clsAdresse) angelegt habe. clsAdresse stellt hierbei den Container dar der immer wieder neu instanziert und mit Daten gefüllt in die Klassenauflistung colAdressen gespeichert wird. Hat man die Klasse im VB-Klassengenerator definiert und man schließt denselbigen, wird die erstellte Klassenauflistung in das Projekt übernommen: In diesem Beispiel hat der Klassengenerator die in der Abbildung (siehe oben) aufgeführten Klassen erstellt. Im Normalfall muß an den Klassen clsAdresse und colAdresse jetzt nichts mehr geändert werden, der Klassengenerator hat den Code selbständig angelegt, sodaß sich der Programmierer um wichtigere Aufgaben kümmern kann. Der automatisch erzeugte Code für die Klasse clsAdresse sieht wie folgt aus: Private mvarNachname As String Private mvarVorname As String Public Property Let Vorname(ByVal vData As String) mvarVorname = vData End Property Public Property Get Vorname() As String Vorname = mvarVorname End Property Public Property Let Nachname(ByVal vData As String) mvarNachname = vData End Property Public Property Get Nachname() As String Nachname = mvarNachname End Property Die Klasse clsAdresse ist dazu gedacht um immer wieder neu instanziert und mit Daten gefüllt in eine Collection gepackt zu werden, die wiederrum von der Klasse colAdressen verwaltet wird. Der automatisch generierte Code von colAdressen enthält Routinen zum Anlegen, Entfernen und Zugreifen auf Elemente der Auflistung. Wie man in VB mit den Klassen umgeht zeigt folgendes kleines Snippet: Dim lCounter As Long Dim EinzelneAdresse As clsAdresse ' Daten in die Klassenauflistung aufnehmen ' ohne Schlüssel Adressen.Add "Stoiber", "Edmund" Adressen.Add "Merkel", "Angela" ' mit Schlüssel Adressen.Add "Schröder", "Gerhard", "Bundeskanzler" MsgBox "Im folgenden wird der Inhalt der kompletten Klassenauflistung ausgegeben:" For lCounter = 1 To Adressen.Count Set EinzelneAdresse = Adressen.Item(lCounter) MsgBox "Vorname: " & EinzelneAdresse.Vorname & vbCrLf & _ "Nachname: " & EinzelneAdresse.Nachname Next lCounter MsgBox "Im folgenden wird über einen Key nur der Bundeskanzler ausgelesen und ausgegeben:" Set EinzelneAdresse = Adressen.Item("Bundeskanzler") MsgBox "Vorname: " & EinzelneAdresse.Vorname & vbCrLf & _ "Nachname: " & EinzelneAdresse.Nachname Dieses VB-Beispiel ist natürlich auch in den Sourcen enthalten, die zu diesem Artikel heruntergeladen werden können. Die Umsetzung in ASP mit VBScriptVBScript kennt keine Collections und auch das Klassenkonzept so wie man es von VB her gewöhnt ist, gibt es in VBScript in dieser Form nicht. Ab Version 5.0 bietet VBScript Klassen an (die wir im Verlaufe dieses Artikels noch noch benutzen), diese werden im Gegensatz zu Visual Basic jedoch nicht in eigenen Klassenmodulen (.cls) definiert sondern mit den Schlüsselwörten Class und End Class direkt in den Quelltext geschrieben (siehe dazu auch den Artikel Klassen mit VBScript). Wie also Klassenauflistungen in ASP nachbilden? Nun, da gibt es mehrere Möglichkeiten auf die ich an dieser Stelle etwas näher eingehen möchte:
Mehrdimensionale Arrays haben den Nachteil, daß der Zugriff auf einzelne Elemente über Indizes erfolgt, was mitunter sehr kryptisch werden kann, wenn man z.B. eine komplette Kundenadresse abbildet (an welcher Stelle war nochmal die PLZ gespeichert?). Ferner hat man bei einem Array immer das Problem, daß einzelne Elemente nicht, wie beim Dictionary-Objekt, über einen Key adressierbar sind. Verbindungslose ADO-Recordsets sind eine weitere elegante Methode um Daten im Speicher zu halten, da dieses jederzeit per AddNew erweitert werden kann. Auch das Durchlaufen eines verbindungslosen ADO-Recordsets ist ohne Probleme möglich. Einen Nachteil sehe ich hier allerdings beim Speicherverbrauch. Das Recordset muß ja schließlich auch verwaltet werden und das ist speicherlastig. Bleiben nur noch VBScript-Klassen und das Dictionary-Objekt. Und tatsächlich, wenn man diese beiden Techniken miteinander verknüpft kann man Klassenauflistungen annähernd wie in VB nachbilden. Das Dictionary-Objekt ist in diesem Zusammenhang zwar auch speicherlastig, aber nicht so sehr wie ein ADO-Recordset. Hinweis: Da VBScript Objekte sowieso nicht in Application- oder Session State gespeichert werden können, entfällt auch die Problematik des Dictionary Objekts, siehe dazu den Artikel Das Dictionary Objekt - Dein Feind und Helfer. Klassen in VBScript mit Class ... End ClassDen Grundstein für eine Klassenauflistung in VBScript legt man indem man eine Klasse definiert in der alle Felder die später gespeichert werden sollen enthalten sind. Setzt man das VB-Beispiel von oben in VBScript und ASP um, sähe der Sourcecode der Klasse so aus: <% Class Adresse dim sVorname dim sNachname Public Property Get Vorname Vorname = sVorname End Property Public Property Let Vorname(newVorname) sVorname = newVorname End Property Public Property Let Nachname(newNachname) sNachname = newNachname End Property Public Property Get Nachname Nachname = sNachname End Property End Class %> Die Programmierung der Properties erfolgt hier ähnlich wie in VB, nur daß man sie hier selbst codieren muß (diese Arbeit kann man in VB vom Klassengenerator erledigen lassen). Der einzige Unterschied zu VB-Klassen besteht darin, daß in VB eine Klasse immer eine Datei mit der Dateinamenserweiterung .cls ist und in VBScript eine Klasse mit den Schlüsselwort Class eingeleitet und End Class abgeschloßen wird. Der TrickJetzt kommt der eigentliche Trick mit dem die Klassenauflistung gefüllt wird: Man nimmt sich zunächst ein Dictionary, danach erstellt man eine Instanz einer Klasse (z.B. die oben abgebildete Klasse Adresse), füllt sie mit Daten und packt dieses Objekt in das Dictionary. Eigentlich gar nicht so schwer, aber sehr effizient da in einem Dictionary zu jedem Element ein eindeutiger Key mitgegeben werden muß, mit dem man sofortigen Zugriff auf alle Elemente des Dictionarys bekommt. Das Dictionary muß also nicht sequentiell bis zu dem Element durchlaufen werden, das gesucht wird. Folgender Code speichert zwei Adressen in die Klassenauflistung: <% dim dicKlassenauflistung dim cAdresse ' Dictionary definieren set dicKlassenauflistung = CreateObject("Scripting.Dictionary") ' 1. Adresse in die Klassenauflistung speichern set cAdresse = new Adresse with cAdresse .Vorname = "Edmund" .Nachname = "Stoiber" end with dicKlassenauflistung.Add "CSU-Vorsitzender", cAdresse ' 2. Adresse in die Klassenauflistung speichern set cAdresse = new Adresse with cAdresse .Vorname = "Gerhard" .Nachname = "Schröder" end with dicKlassenauflistung.Add "Bundeskanzler", cAdresse %> Irgendwann will man die Daten auch wieder aus der Klassenauflistung auslesen, auch das schafft man mit einfachen Mitteln: <% Dim cEinzelneAdresse Set cEinzelneAdresse = dicKlassenauflistung.Item("Bundeskanzler") Response.write " Vorname: " & cEinzelneAdresse.Vorname Response.write " Nachname: " & cEinzelneAdresse.Nachname %> SchlußbemerkungMit dem oben beschriebenen Trick kann man also sehr effizient Klassenauflistungen bauen und damit auch kompliziertere Datenstrukturen in ASP verarbeiten. Einziges Manko an dieser Technik ist, daß diese Klassenauflistungen nicht über Session- oder Applicationvariablen weitergegeben werden können. Dieser Artikel wird übrigens fortgesetzt - in der Fortsetzung wird ein Klassengenerator vorgestellt, der selbst in ASP geschrieben, ähnlich funktioniert wie der VB-Klassengenerator und automatisch VBScript-Klassen erstellen kann. Download des CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
Das Dictionary Objekt - Dein Feind und Helfer Wenn Sie jetzt Fragen haben...Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten. Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.
Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.
©2000-2006 AspHeute.com |