In Perl sind beispielsweise Array oder Hash abstrakte Datentypen
Bei einem abstrakten Datentyp ist der wahlfreie Zugriff auf die Daten im Hauptspeicher speziell geregelt. Transformationen ändern nicht die Daten sondern nur die Art und Weise des Zugriff's auf die Daten.
Jeder Perl'er kennt Array und Hash. Auch ein Hash of Hashes ist ein abstrakter Datentyp (ADT), er ist nach dem Muster Entity-Attribute-Value, kurz EAV aufgebaut. In diesem kleinen Artikel wird gezeigt, wie ADT's gegeneinander transformiert werden können. So ist bereits der einfache Hash ein Array, in dem die Einzelwerte paarweise assoziieren als
Schlüssel => Wert
Der Cast in ein Array und umgekehrt sieht demensprechend recht einfach aus:
@array = %hash;
%hash = @_;
In Fakt entscheidet der Kontext. Ein bischen komplizierter ist es mit einen Hash-of-Hashes, Referenz-Beispiel:
$hoh = {
boos => {foo => 'bar'},
addr => {name => 'foo', vname => 'boo'},
};
Anders geschrieben sieht dieser Hash so aus:
$hoh->{boos}{foo} = 'bar';
$hoh->{addr}{name} = 'foo';
$hoh->{addr}{vname} = 'boo';
Womit der Cast bzw. die Transformation in ein Array bereits sichtbar wird: Gegenüber einem einfachen Hash gehören nunmehr als Array stets 3 Elemente zusammen. Die Gesamtzahl der Elemente in einem aus diesem Hash transformierten Array ist ohne Rest durch 3 teilbar.
Einfaches Beispiel für die Transformation:
# Hash of Hashes, EAV Muster
my $h = {
1 => { foo => 'bar' },
2 => { boo => 'bazz' }
};
my @res = ();
# Entity, Attribute, Value
foreach my $ent(keys %$h){
foreach my $att(keys %{$h->{$ent}}){
my $val = $h->{$ent}{$att};
push @res, $ent, $att, $val;
}
}
print Dumper \@res;
Das Resultat ist ein gewöhnliches Array
$VAR1 = [
'1',
'foo',
'bar',
'2',
'boo',
'bazz'
];
Derartige Transformationen haben beim Serialisieren eine große Bedeutung wenn es um die Entwicklung von Algorithmen geht. So ist es am Ende recht einfach, ein Array transportsicher, sprich als Datei oder Bytesequenz zu verpacken. Je einfacher der Algorithmus umso einfacher ist die Portierung in andere Programmiersprachen wenn es um einen plattformunabhängigen Datenaustausch geht, z.B. AJAX-JavaScript/Perl.
Der Artikel macht auch deutlich, dass der Aufbau einer Sequenz eben nichts über die Datenstruktur aussagt. Die Entwicklung einer Datenstruktur auf Sequenz-Ebene ist also genauso unsinnig wie der Versuch, eine bestimmte Datenstruktur in einer besimmten Sequenz abbilden zu wollen (CSV, XML...). Andererseits ermöglicht die Umwandlung abstrakter Datentypen, dass ggf. ein einziger Serialize-Algorithmus ausreichend ist, unterschiedliche Datenstrukturen einzufrieren. Konkret heißt das, dass auch ein Datentyp nach dem EAV-Muster beispielsweise in einer CSV-Datei gespeichert werden kann, egal ob mit oder ohne Zeilenumbrüchen.
Ziel einer Entwicklung von Abstrakten Datentypen ist nicht die beliebige tiefe Schachtelung sondern eine sinnvolle Schachtelung die bei jedem Eintrag gleichermaßen aufgebaut und tief ist, so dass sich eine zyklische Struktur ergibt. Den meisten Anforderungen bezüglich Persistenz oder Transport von Daten genügt das EAV-Muster, das lässt sich auch auf 3 Felder einer Tabelle abbilden.
Im Download/Demo-Bereich finden Sie einen einfachen Algorithmus implementiert in einer dedizierten Perl-Klasse. Selbstverständlich kann dieser Algorithmus auch nach anderen Programmiersprachen portiert werden.
Datenschutzerklärung: Diese Seite dient rein privaten Zwecken. Auf den für diese Domäne installierten Seiten werden grundsätzlich keine personenbezogenen Daten erhoben. Das Loggen der Zugriffe mit Ihrer Remote Adresse erfolgt beim Provider soweit das technisch erforderlich ist. sos@rolfrost.de.