Domanda della convenzione di codifica sulla definizione della variabile duplicata AS3

1

AS3 ha alcune regole imbarazzanti sull'ambito della variabile, a causa del suo uso del sollevamento. Non mi piace inutilmente lasciare in giro una serie di avvertenze sul compilatore, ma è più importante per me che il mio codice sia leggibile e scritto correttamente, a prescindere. Questo produce un paio di avvertimenti duplicati di definizione delle variabili:

    private function arrangeElementsLine(pElementSize:Dimensions):void
    {
        if (m_eOrientation == HORIZONTAL)
        {
            for (var i:uint = 0; i < target.numElements; i++)
            {
                var layoutElement:ILayoutElement = target.getElementAt(i);
                layoutElement.setLayoutBoundsSize(pElementSize.x, pElementSize.y);
                layoutElement.setLayoutBoundsPosition(pElementSize.x * i, 0);
            }
        }
        else
        {
            for (var i:uint = 0; i < target.numElements; i++)
            {
                var layoutElement:ILayoutElement = target.getElementAt(i);
                layoutElement.setLayoutBoundsSize(pElementSize.x, pElementSize.y);
                layoutElement.setLayoutBoundsPosition(0, pElementSize.y * i);
            }
        }
    }

È generalmente considerato migliore e più convenzionale rimuovere la sintassi ridondante var e :<type> per i e layoutElement nel secondo ciclo for , o è più corretto lasciarli semplicemente in là (a causa del modo in cui il loro utilizzo è isolato da quei due cicli for )? Grazie!

Modifica

Questo è stato chiesto qualche tempo fa, ma quando ho chiesto questo, parte di ciò a cui stavo lavorando stava facendo funzionare qualcosa in modo più efficiente; quindi ho messo if al di fuori di qualsiasi istruzione for e ho evitato chiamate di metodo all'interno delle istruzioni for .

    
posta Panzercrisis 07.10.2013 - 17:43
fonte

3 risposte

2

Invece di usare la stessa variabile, rendili unici inserendo più dei loro scopi nei loro nomi:

var horizontalLayoutElement:ILayoutElement = target.getElementAt(i);
...
var verticalLayoutElement:ILayoutElement = target.getElementAt(i);

o se non ti piacciono i nomi di variabili così lunghe:

var hLayoutElement:ILayoutElement = target.getElementAt(i);
...
var vLayoutElement:ILayoutElement = target.getElementAt(i);

Puoi anche emulare il sollevamento inserendo tutte le dichiarazioni delle variabili nella parte superiore delle tue funzioni, ma poiché questo rende il codice molto più difficile da leggere a causa della distanza nel codice tra dichiarazione e utilizzo, lo eviterei.

    
risposta data 07.10.2013 - 19:07
fonte
1

Hai un sacco di codice duplicato qui, che sconfigge il principio ASCIUTTO. Questo sarebbe meglio:

private function arrangeElementsLine(pElementSize:Dimensions):void {
    for (var i:uint = 0; i < target.numElements; i++) {
        var layoutElement:ILayoutElement = target.getElementAt(i);
        layoutElement.setLayoutBoundsSize(pElementSize.x, pElementSize.y);

        if (m_eOrientation == HORIZONTAL) {
            layoutElement.setLayoutBoundsPosition(pElementSize.x * i, 0);
        } else {
            layoutElement.setLayoutBoundsPosition(0, pElementSize.y * i);
        }
    }
}

Questo risolve anche i tuoi problemi con la duplicazione variabile.

    
risposta data 22.12.2014 - 11:45
fonte
0

Personalmente, preferisco riutilizzare le variabili sames quando sono esattamente le stesse. Poiché il contenuto è uguale e il loop diverso non si blocca a vicenda sostituendo le variabili, il riutilizzo delle variabili risolverà il problema di avviso senza rendere il codice meno leggibile e, in caso di ottimizzazione pura, richiederà meno memoria (anche se 4 byte non è nulla, è comunque 4 volte più leggero). Quindi, personalmente, preferisco usare una funzione del genere:

private function arrangeElementsLine(pElementSize:Dimensions):void
{
    var i:uint;
    var layoutElement:ILayoutElement;

    if (m_eOrientation == HORIZONTAL)
    {
        for (i = 0; i < target.numElements; i++)
        {
            layoutElement = target.getElementAt(i);
            layoutElement.setLayoutBoundsSize(pElementSize.x, pElementSize.y);
            layoutElement.setLayoutBoundsPosition(pElementSize.x * i, 0);
        }
    }
    else
    {
        for (i = 0; i < target.numElements; i++)
        {
            layoutElement = target.getElementAt(i);
            layoutElement.setLayoutBoundsSize(pElementSize.x, pElementSize.y);
            layoutElement.setLayoutBoundsPosition(0, pElementSize.y * i);
        }
    }
}
    
risposta data 13.01.2014 - 21:00
fonte