Abstrakte Datentypen transformieren (cast)

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.


Anbieter: nmq​rstx-18­@yahoo.de, die Seite verwendet funktionsbedingt einen Session-Cookie und ist Bestandteil meines nach modernen Aspekten in Perl entwickelten Frameworks.