Very short snippet: estendere un array Actionscript con il metodo shuffle()

Avevo parlato già di come realizzare il metodo shuffle() in Javascript e Actionscript. Mi sono accorto, tuttaavia, di non aver sottolineato che anche Actionscript è in grado di estendere, nel medesimo modo di Javascript, il proprio oggetto Array:

1
2
3
Array.prototype.shuffle = function() {
    for(var j:uint, x:*, i:uint = this.length; i; j = Math.floor(Math.random() * i), x = this[--i], this[i] = this[j], this[j] = x);
}

Questo codice può essere inserito anche all’interno di una classe, ad esempio nel costruttore:

1
2
3
4
5
6
7
8
9
package {
    public class Hello extends MovieClip {
        public function Hello() {
            Array.prototype.shuffle = function() {
                for(var j:uint, x:*, i:uint = this.length; i; j = Math.floor(Math.random() * i), x = this[--i], this[i] = this[j], this[j] = x);
            }
        }
    }
}

Per usare poi tale “estensione” è sufficiente chiamare il meotodo shuffle() da qualsiasi istanza di un array:

1
2
var a:Array = ["ciao","come","va"];
a.shuffle();

2 commenti a: “ ”

  1. 27 apr, 2009 Carlo:

    Ciao, è da un po che leggo il tuo blog, che è molto ben curato e presenta un sacco di tips e idee non male. Devo chiederti una cosa su questo post, una cosa che non mi è chiara: che vantaggio c’è nell’estendere una classe tramite il parametro prototype?
    Io in genere uso una classe "MyArray extends Array", che implementa i metodi aggiuntivi che mi servono, e nei miei progetti istanzio quella. (Tanto grazie al polimorfismo le funzioni che vogliono un oggetto Array la vedono come un Array)
    Utilizzando prototype mi sembra di ‘sporcare’ il mio design a oggetti (e, a parte, dove andrebbe inserito per essere più elegante possibile? Nel costruttore della Document Class? )

    ti saluto, e ti ringrazio per le info :-)

  2. 27 apr, 2009 Giovambattista Fazioli:

    @Carlo:

    che vantaggio c’è nell’estendere una classe tramite il parametro prototype?

    Ciao Carlo, ottima osservazione! L’uso di prototype risale ai tempi in cui Actionscript non era ancora un linguaggio ad oggetti “maturo” come lo è la versione 3.0. Tuttavia, ancora oggi, l’uso di prototype si differenzia dall’uso di extends per creare una nuova classe Array personalizzata come hai indicato tu. Il vantaggio, infatti, risiede nella possibilità di estendere indistintamente tutti gli array, senza dover specificare il tipo di classe. Nel metodo che hai usato tu, che va benissimo ed è corretto, l’uso di particolari metodi o proprietà rimane vincolato all’interno della tua classe (la MyArray per intenderci). Con l’uso di prototype, invece, vengono estesi tutti gli array, anche quelli creati come:

    1
    var prova:Array = new Array()

    invece di scrivere

    1
    var prova:Array = new MyArray()

    il vantaggio nell’uso o meno di proptotype dipende dalla situazione, tuttavia in generale ci sono due motivi per preferire proptotype all’uso di classi estese:
    - proptotype meno codice da scrivere; basta la definizione
    - codice già scritto ottiene l’estensione senza doverlo modificare
    Il secondo punto, a mio avviso, è il più interessante. Infatti permette di estendere gli oggetti base di Actionscriopt (come MovieClip o Array) su codice già scritto, senza doverlo modificare.
    Per quanto riguarda l’inserimento del codice, io uso un semplice file (tipo array_ext.as) che includo nel costruttore del Document Class o nel frame 0 a seconda del tipo di progetto.
    Spero di aver risposto ai tuoi quesiti… se hai altre domande non esitare a conttatarmi.

Lascia un commento

TAG XHTML PERMESSI: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> INSERIMENTO CODICE:
<pre></pre> // blocco generico
                   <code></code> // blocco generico
                   [cc_actionscript][/cc_actionscript] // Actionscript
                   [cc_actionscript3][/cc_actionscript3] // Actionscript 3
                   [cc_css][/cc_css] // CSS Style Sheet
                   [cc_html][/cc_html] // HTML
                   [cc_js][/cc_js] // Javascript
                   [cc_objc][/cc_objc] // Objective-C
                   [cc_php][/cc_objc] // PHP
                   [cc_sql][/cc_sql] // SQL