Entwurfsproblem

p-flash

Erfahrenes Mitglied
Hi,

ich möchte mit Hilfe einer XML-Datei die Ansicht generieren. Ich hatte mir überlegt die XML-Datei so aufzubauen:

HTML:
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<elements>
    <modifiableElement id="1" attachId="dasMc_mc" class="ModifiableElement" sectionId="2">
        <attributes scaleable="1" hideable="1" moveable="1" editable="0" posFixed="0" hidden="0" />
        <container  depth="4">_x:10;_y:50;_xscale:150;_yscale:150;...</container>
    </modifiableElement>
       .
    .
    .
</elements>

Die Klassen-Methode createView(xmlStr : String) der Klasse ModifiableElement sorgt dann für die Generierung der Seite:

Code:
ModifiableElement.createView(xmlStr);

Dabei arbeitet die Methode ungefähr so:

Code:
var nodes : Array = xmlStr.firstChild.childNodes;

for (var i = 0; i < nodes.length; i++)
{
    var modElem : ModifiableElement = new ModifiableElement();
    modElem.create(nodes[i]);
}

Das klappt alles ganz gut. Das Problem ist, wenn ich ModifiableElement erweitern möchte. Also ExtendedModElem extends ModifiableElement. Und in der XML nun auch solche Elemente speichere:

HTML:
.
.
<modifiableElement id="1" attachId="dasMc_mc" class="ExtendedModElem" sectionId="2">
        <attributes scaleable="1" hideable="1" moveable="1" editable="0" posFixed="0" hidden="0" />
        <container  depth="4">_x:10;_y:50;_xscale:150;_yscale:150;...</container>
    </modifiableElement>
.
.

Die Änderung ist bei class="ExtendedModElem"
D.h. dass createView(); jetzt unterscheiden muss ob ein ModifiableElement- oder ein ExtendedModElem-Objekt erstellt werden soll. Das würde so klappen:

Code:
// __class = der Wert in class="dieKlasse"
if (__class == "ModifiableElement") new ModifiableElement();
else if (__class == "ExtendedModElem") new ExtendedModElem();

Das Problem ist, dass bei jeder Klasse die dazu kommt, ModifiableElement.createView() angepasst werden müsste. (Außer weiß ich auch nicht ob es guter Stil ist in der Oberklasse explizit Unterklassen anzusprechen) Vor allem dauert die Berechnung natürlich ziemlich lange, wenn es mehrere dieser Klassen gibt (alle dieser Klassen sind (indirekte) Unterklassen von ModifiableElement).

Meine Frage ist, ob ihr vielleicht eine gute Idee habt, wie die XML-Struktur sein könnte um das Problem zu lösen. Oder ob die Klassenstruktur irgendwie so geändert werden sollte, dass das Problem gut gelöst werden kann.

Bin dankbar für jeden Tip.

p-flash
 
Hi,

Der Ansatz, in der Oberklasse die abgeleiteten Klassen anzusprechen, ist meiner Meinung nach in der Tat ungünstig, da er der Philosophie des OOP widerspricht.

Da ich den konkreten Einsatzzweck dieses Konstrukts nicht kenne, fällt es mir schwer, Alternativen für die Struktur zu nennen - vielleicht wäre hier ein völlig anderer Ansatz günstiger.

Wenn Du mit Flash 8 (sprich: noch nicht mit dem Flash9-Kompiler) arbeitest, würde ich wahrscheinlich MovieClips mit zugeordneten Klassen verwenden, die aufgrund des Bezeichners in der XML-Datei einfach instanziert werden:
Code:
<modifiableElement id="1" attachId="MovieClip1" sectionId="2">
, wobei der MC mit dem Verknüpfungsbezeichner direkt mit seiner (Ober- oder abgeleiteten) Klasse verknüpft ist. Dadurch umgehst Du die Instanzierung per new Klassenname(), die ja keine Variablen erlaubt. Hier würde dann einfach per
Code:
attachMovie(derKnoten.attributes.attachId);
der Clip auf die Bühne geholt werden - und damit auch seine Klasse, die ja direkt verknüpft ist.

Gruß

P.S.: das Tag für Actionscript-Code lautet [actionscript], nicht [as] - ich habe das mal für Dich geändert.
 
Hi,

wollte das mit dem zuweisen der Bibliothekselementen verhindern, da alle Klassen von MovieClip erben müssten und dem Konstruktor keine Parameter übergeben werden können.

Also konkret habe ich folgendes vor: Es gibt Element auf der Bühne die verändert werden können (skaliert, verschoben, (un)sichtbar etc) Drückt man auf speichern, soll eine xml-Datei erstellt werden, mit den eigenschaften dieser Elemente. Die Elemente werden in einem Array verwaltet, so dass die Generierung der XML mit beliebig vielen Elementen klappt. Wenn zu einem späteren Zeitpunkt (in einer leeren Bühne) die XML geladen wird, sollen automatisch der Zustand wieder hergestellt werden.

p-flash
 
Hmm - im Moment fällt mir auch nichts sinnvolles dazu ein (vielleicht hat Luke eine elegante Idee). Ich würde vielleicht die Methode "createView" nicht als statische Methode der Klasse "ModifiableElement" implementieren, sondern eine eigene Klasse "ElementHandler" dafür entwerfen, die die Instanzierungen übernimmt. Du wirst m.E. nicht umhinkommen, die Namen der verfügbaren Klassen zumindest dort hartzukodieren.

Vielleicht lohnt sich auch ein Blick ins Java-Forum, da sich dort sicher mehr Leute tummeln, die Erfahrungen mit Pattern haben.

Gruß
.
 
Zurück