Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Klassenauflistungen mit dem Dictionary-Objekt

Geschrieben von: Marc Teufel
Kategorie: ASP Tricks

This printed page brought to you by AlphaSierraPapa

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 VBScript

VBScript 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 Class

Den 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 Trick

Jetzt 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ßbemerkung

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

This printed page brought to you by AlphaSierraPapa

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20020408.zip

Verwandte Artikel

Das Dictionary Objekt - Dein Feind und Helfer
http:/www.aspheute.com/artikel/19990806.htm
Der Object Construct String
http:/www.aspheute.com/artikel/20020205.htm
Große Datenmengen in Formularfeldern erfolgreich auslesen
http:/www.aspheute.com/artikel/20020430.htm
In VB Komponenten auf ASP Objekte zugreifen (Variante 1)
http:/www.aspheute.com/artikel/20010320.htm
In VB Komponenten auf ASP Objekte zugreifen (Variante 2)
http:/www.aspheute.com/artikel/20010322.htm
Klassen in VBScript
http:/www.aspheute.com/artikel/20000526.htm

 

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.