Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 30-03-2008, 16:08   #1 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
Registriert seit: Mar 2006
Beiträge: 1.573
Problem mit Gültigkeitsbereich einer Funktion

Also die Struktur läßt sich recht einfach beschreiben:
Code:
std.datatypes
|
|- vector implements IIterator
    |- myNamespace function get_reference():Array

std.utils
|
|- iterator
|  |- public function get value():*
|
|- IIterator
Was ich damit anfangen möchte:
Der Iterator, der schließlich ein Zeiger ist, die es in Flash ja so nicht gibt, soll immer auf das aktuelle Element zeigen, was sich im Vektor, bspw.
befindet.

Wenn ich im Vektor was ändere, muss der Iterator auch auf das geänderte
Element zeigen, und nicht einen statischen Array auslesen!!
ActionScript:
  1. public function iterator( reference:Array )
  2. {
  3.     this.data = reference;
  4. }
Ist also nicht zu gerbauchen. Ich will aber den Iterator auch nicht in das Package: datatypes mit einbringen, nur weil ich dann internal nutzen kann. Denn ein Iterator ist kein eigener Datentyp in dem Sinne.

Also was tun? Eigene Namespaces ...
ActionScript:
  1. // vector
  2. myNamespace function get_reference():Array
  3. {
  4.     return ... // usw.
  5. }
  6.  
  7. // iterator
  8. public function get value():*
  9. {
  10.     use namespace myNamespace;
  11.  
  12.     // liest den aktuellen array aus
  13.     data = scope.get_reference();
  14. }
Problem:
Ich möchte, dass scope eigentlich nicht den typ bestimmt. Wieso? Weil ein Iterator nicht nur für Vektoren geschaffen ist

Also dachte ich: Ja nehmen wir doch IIterator dann ist es perfekt
gelöst ... aber Funktionen in Schnittstellen müssen ... richtig public sein -.-

Das einzigste was ich machen könnte: Eine abstrakte Klasse anstelle der Schnittstelle. Das klapt dann zwar alles, sieht aber unsauber aus. Die Lösung wär so perfekt OOP gewesen, wenn Schnittstellen mal nicht so zickig wären

internal wäre ja eigentlich perfekt, denn der Benutzer selber, sollte nicht auf diese Funktion zugreifen dürfen,
das mit Namespaces einzuschränken ist aber auch ok so, nur am besten wäre ein eigenes internal, dass ich so definieren
kann wie ich will, und in einem interface
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi

Geändert von _crypto_ (30-03-2008 um 16:13 Uhr)
_crypto_ ist offline   Mit Zitat antworten
Alt 30-03-2008, 16:15   #2 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.147
Sorry, aber was willst du machen? Ich verstehe das Problem nicht. Du willst einen simplen Iterator implementieren und was noch?
Omega Psi ist offline   Mit Zitat antworten
Alt 30-03-2008, 16:31   #3 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
Registriert seit: Mar 2006
Beiträge: 1.573
ich könnte ihn einfach in den ordner packen: datatypes
so dann hab ich eine methode die ich mit "internal" deklariere,
damit man von außen ncihts aufrufen kann:

was diese methode macht: sie holt sich den array, also die daten
der referenz, auf den der iterator zeigt.

der iterator muss immer die aktuellen daten haben, da es in flash
ja eben keine zeiger gibt, sonst könnt ich einfach auf die adresse
zeigen

deswegen versuch ich mir damit zu helfen. so wie es oben steht klapt es ja,
aber ich will den iterator eben nicht in das gleiche packet setzen.

anders geht es eben nicht, also soweit ich es kann, deswegen frag ich ja
weil ich es gerne mit ner schnittstelle und nem eigenen namespace machen möchte.

edit:
ach ja dann trat noch das problem auf mit der abstrakten klasse,
wenn ich anstelle des interfaces eine klasse nehme, kann ich die funktionen auch mit meinem eigenen namespace
verknüpfen, aber was sagt mir der compiler dann:

mit "override" gekenzeichnete methoden müssen ... bla bla bla
dabei stimmt alles ... aber nein wenn ich namespaces benutze kann ich NICHT andere wie public oder so zusätzlich verwenden
was is das denn alles für schrott
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi

Geändert von _crypto_ (30-03-2008 um 16:35 Uhr)
_crypto_ ist offline   Mit Zitat antworten
Alt 30-03-2008, 16:39   #4 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.147
Hm, verstehe ich immer noch nicht. Wenn du dem Iterator eine Refrenz mitgibst, ist doch alles in Butter? Damit zeigst du doch immer auf genau das Objekt, über das du den Iterator laufen lassen möchtest.

Die Referenz zeigt ja auf einen eindeutigen Adressbereich, nur hast du keine Arithmetik.

Mein Tipp: ein Interface IIterator, eine Factory, die einen konkreten Iterator erzeugt und eine konkrete Klasse, die das Interface implementiert und über das Array iteriert. Die Implementiertung kriegt eine Refrenz auf das Array und alles ist gut.
Omega Psi ist offline   Mit Zitat antworten
Alt 30-03-2008, 17:13   #5 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
Registriert seit: Mar 2006
Beiträge: 1.573
nene so gehts ja nicht ^^
wenn ich dem iterator einen array übergebe dann passiert ja das:
Code:
function doSomething( reference:Array ):void
{
	reference = [];
	trace( reference );
}

var arr:Array = [0,0,0,1,1,1,1];
doSoemthing( arr ); // gibt leer aus
trace( arr ); // 0,0,0,1,1,1,1
das is ja eben das was man mit zeigrn umgeht, bzw anders macht,
man kann damit ja das original ändern und flash kopiert immer nur.

deswegen wollte ich dem iterator eine referenz zu seiner klasse, die er durchiteriert geben und damit kann er sich den Array krallen über eine methode.

nur das einzigste problem, diese methode sollte geschützt sein, das nur der iterator dadrauf zugreifen kann. muss ja so sein wenn ich die funktion von zeigern nachbauen möchte.
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi
_crypto_ ist offline   Mit Zitat antworten
Alt 30-03-2008, 17:22   #6 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.147
Das ist ja auch falsch:
ActionScript:
  1. package {
  2.   public class Iterator implements IIterator {
  3.  
  4.     private var _array:Array;
  5.     private var _index:int;
  6.  
  7.     public function Iterator(array:Array) {
  8.       if (array == null) {
  9.         throw new ArgumentError("Param must not be null")
  10.       }
  11.       this._array = array;
  12.       this._index = 0;
  13.     }
  14.  
  15.     public function hasNext():Boolean {
  16.       returun (this._index < this._array.length-1)
  17.     }
  18.    
  19.     public function next():Object {
  20.       return this._array[this._index++];
  21.     }
  22.   }
  23. }
Omega Psi ist offline   Mit Zitat antworten
Alt 30-03-2008, 17:28   #7 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
Registriert seit: Mar 2006
Beiträge: 1.573
ja das ist es doch!

ein iterator MUSS ein zeiger sein, es gibt sie aber nicht in flash und
deswegen will ich das der iterator so aussieht:
ActionScript:
  1. package
  2. {
  3.     public interface IIterator
  4.     {
  5.         function get_data():Array;
  6.         function begin():Iterator
  7.         function end():ReverseIterator;
  8.     }
  9. }
  10.  
  11. package
  12. {
  13.     public class Iterator
  14.     {
  15.         private var _scope:IIterator;
  16.         private var _index:int;
  17.  
  18.         public function Iterator( SCOPE:IIterator )
  19.         {
  20.             if ( SCOPE == null ) {
  21.                throw new ArgumentError("Param must not be null")
  22.             }
  23.             this._scope = SCOPE;
  24.             this._index = 0;
  25.         }
  26.  
  27.         public function hasNext():Boolean {
  28.             returun (this._index < this._array.length-1)
  29.         }
  30.    
  31.         public function next():Object {
  32.            var data:Array = this._scope.get_data();
  33.            return data[this._index++];
  34.        }
  35.    }
  36. }
denn wenn ich doch zur laufzeit den speicher meines vektors als
beispiel ändere, dann bleibt doch die adresse dahin gleich, und wenn
ich das dann anders implementiere ist der iterator doch fürn arsch

so wie oben solls, bzw. siehts aus, nur dieses "get_data()"
das wollte ich möglichst nur aufrufbar für den iterator halten.

999 beiträge
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi

Geändert von _crypto_ (30-03-2008 um 17:30 Uhr)
_crypto_ ist offline   Mit Zitat antworten
Alt 30-03-2008, 17:32   #8 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.147
Wofür willst du denn den Iterator nutzen? Den holt man sich doch nur mal eben in Schleifen. Soll das eine Datenstruktur sein, die du komplett drurch die Applikation schleifst? Das für sich genommen ist nicht klug.
Omega Psi ist offline   Mit Zitat antworten
Alt 30-03-2008, 17:44   #9 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
Registriert seit: Mar 2006
Beiträge: 1.573
ich glaube dann hast du vllt nicht genau verstanden warum es
iteratoren gibt (vorsichtig ausgedrückt)

wenn man ihn nur für schleifen nutzt dann könnte man ihn gleich weg
lassen
Code:
Iteratoren sind eine Art intelligente Zeiger, mit deren Hilfe über die Elemente eines Containers iteriert sowie auf einzelne Elemente des Containers zugegriffen werden kann.
das wäre wenn man ihn einfach so implementiert wir du meintest.
Code:
Die Iteratoren bilden ein zentrales und wichtiges Konzept für die Container. Bezogen auf ihre Aufgabe sind die Iteratoren reine Zugriffsobjekte. Sie entkoppeln die Algorithmen von den Containern, so dass diese typenunabhängig werden.
das ist punkt 2. und da ich grad an ner menge von algorithmen arbeite ist das ein riesen vorteil.
überleg doch mal du möchtest alle elemente inerhalb eines containers in einen anderen kopieren, aber! und das ist wichtig der tyxp der container soll uns nicht interessieren. Anstatt für jede art von container eine funktion zu haben gibst du einfach an:
Code:
function accumulate( start:Iterator, end:ReverseIterator, dest:IIterator ):Iterator
{
    for( start; Iterator.notEqual( start, end ); )
    {
        dest.erase( start.position );
        dest.insert( start.position, 1, start.next() );
    }	
    return dest.begin();
}
das ist es ja was ihn so nützlich macht
und da ich genau nach dem schema aufbaue brauch ich auch eigentlich
einen zeiger, da es die nicht gibt muss ich halt dem iterator immer die neuen daten geben damit das geht.

ansonsten ich habs jetz ersmal hinbekommen mit dem namespace.
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi
_crypto_ ist offline   Mit Zitat antworten
Alt 30-03-2008, 17:51   #10 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.147
Ich kenne Iteratoren in der Tat nur als Möglichkeit über Collections zu iterieren. ich habe bis jetzt um beispiel auch noch nie eine insert() Methode bei einem Iterator gesehen.
Omega Psi ist offline   Mit Zitat antworten
Alt 30-03-2008, 17:53   #11 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
Registriert seit: Mar 2006
Beiträge: 1.573
ne sry das interace sollte eigentlich anders sein
denk dirf das als IContainer oder AbstractContainer,

aber du verstehst den sinn? das man mit ihnen typenunabhängige
algorithmen schreiben kann, ein klarer vorteil da es in Flash keine
templates und überladene funktionen gibt
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi
_crypto_ ist offline   Mit Zitat antworten
Alt 30-03-2008, 17:57   #12 (permalink)
voidboy
 
Benutzerbild von rendner[i]
 
Registriert seit: Sep 2004
Ort: München
Beiträge: 5.588
Normalerweise holt man sich diesen immer wieder aktuell wenn man über die Struktur läuft und nicht einmal initial, wie du es anscheinend gerne hättest.
Zumindest würde ich dies so handhaben.

Dein eigentliches Problem verstehe ich aber ehrlich gesagt auch nicht.
__________________
ERROR: Signature is too large
rendner[i] ist offline   Mit Zitat antworten
Alt 30-03-2008, 17:57   #13 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.147
Ja, aber ich sehe nicht den Sinn in typunabhängigen Algorithmen, denn du bekommst ja nur Objects -> das heisst du weisst gar nicht, was im iterator steckt, was ja auch Sinn der Sache ist.
Omega Psi ist offline   Mit Zitat antworten
Alt 30-03-2008, 18:01   #14 (permalink)
voidboy
 
Benutzerbild von rendner[i]
 
Registriert seit: Sep 2004
Ort: München
Beiträge: 5.588
@_crypto_:

Vielleicht kannst du hier mal gucken, ob dich das befriedigt: http://lab.polygonal.de/ds/
__________________
ERROR: Signature is too large
rendner[i] ist offline   Mit Zitat antworten
Alt 30-03-2008, 18:11   #15 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
Registriert seit: Mar 2006
Beiträge: 1.573
doch es macht z.b. sinn. man benutzt es z.b. bei der for_each schleife
im engeren sinne:
ActionScript:
  1. // neuen vektor vom typ int
  2. var v1:vector = new vector( int );
  3. for( var i:int = 0; i < 5; i++ ) {
  4.     v1.push_back(i);
  5. }
  6. // v1: 0,1,2,3,4
  7.  
  8. // neuer vektor vom typ String mit der Länge 5,
  9. // jedes Elment ist "C"
  10. var v2:vector = new vector( String, 5, "C" );
  11. var itr:iterator = v1.begin();
  12.  
  13. // mehr speicherplatz reservieren
  14. v2.rserve( 5 );
  15. while( itr.hasNext() ) {
  16.     // v1 in v2 hinzufügen
  17.     v2.push_back( itr.next() );
  18. }
  19.  
  20. itr = for_each( v2.begin(), v2.end() );
  21. while( itr.hasNext() ) {
  22.     trace( itr.next() );
  23.     // C,C,C,C,C,0,1,2,3,4
  24. }
also flasgh bietet sowas schon an aber hir zeigt sich das,
anstatt mehrere funktionen wie for_each für einen Array
dann für ein Objekt und dann noch für nen String zu machen,
dient der iterator dafür einfach jede art von "container" durchzuiterieren
und man brauch nur 1 funktion, denn alle besitzen einen iterator und
damit erspart man sich doch einiges
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi
_crypto_ ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 15:40 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele