Uso di espressioni anziché di istruzioni

1

In javascript non è possibile utilizzare le istruzioni nelle espressioni. Per questo motivo si è costretti a utilizzare gli operatori logici e ternari in un'espressione quando si desidera utilizzare if o switch ecc. Poiché non volevo utilizzare gli operatori ternari ogni volta che eseguivo un controllo delle condizioni, ho scritto semplici funzioni per controlla le condizioni.

Usandoli scrivo un codice come questo:

this.getEvent('aFrame').on(() => _if(this.isInTextEditor()).true(() => _if(this.getConfig('typeFrame')).true(() => _switch(this.state, {
    resume: () => this.bufferStack.check(() => this.animation.nextFrame(this.bufferStack.pop()))
})).false(() => _switch(this.state, {
    resume: () => this.animation.nextFrame()
}))));

Migliore formattazione per capire:

this.getEvent('aFrame').on(() =>
    _if(this.isInclined()).true(() =>
        _if(this.getConfig('typeFrame')).true(() => _switch(this.state, {
            resume: () => {
                this.bufferStack.check(() => this.animation.nextFrame(this.bufferStack.pop()));
            }
        })).false(() => _switch(this.state, {
            resume: () => {
                this.animation.nextFrame();
            }
        }))
    )
);

Le funzioni _if e _switch sono:

const _switch = (a, obj) => {
    return obj[a] && obj[a]();
};

const _if = val => {
    return {
        true(fn) {
            val && fn();
            return this;
        },
        false(fn) {
            !val && fn();
            return this;
        }
    };
};

Tutto funziona perfettamente con questo codice. Ma voglio solo sapere se ci sono degli svantaggi usando questo invece di operatori logici o ternari:

this.getEvent('aFrame').on(() =>
    this.isInclined()
        && ((this.getConfig('typeFrame')
            ? (this.state === 'resume'
                && this.bufferStack.check(() => this.animation.nextFrame(this.bufferStack.pop())))
            : (this.state === 'resume'
                && this.animation.nextFrame()))
        )
);

O semplicemente usando le istruzioni:

this.getEvent('aFrame').on(() => {
    if (this.isInclined()) {
        if (this.getConfig('typeFrame')) {
            switch (this.state) {
                case 'resume':
                    this.bufferStack.check(() => this.animation.nextFrame(this.bufferStack.pop()));
                    break;
                default:
                    break;
            }
        } else {
            switch (this.state) {
                case 'resume':
                    this.animation.nextFrame();
                    break;
                default:
                    break;
            }
        }
    }
});

Nota: questa domanda è stata spostata da Review del codice di scambio dello stack .

    
posta MindlessRanger 11.06.2016 - 17:47
fonte

1 risposta

3

Il vantaggio di un'espressione if è il suo risultato può essere assegnato a una variabile, come:

var result = _if(...

O forse il suo risultato è direttamente usato in un'espressione. Questo non è il caso nel tuo esempio. Tutto il calcolo è fatto per effetto collaterale. Stai essenzialmente ignorando il risultato delle espressioni if, quindi possono anche essere dichiarazioni.

Sono tutti per i benefici di un'espressione if, ma se non utilizzi effettivamente il risultato, non è necessario il rumore visivo aggiuntivo che richiede.

Inoltre, se questo stile di JavaScript ti piace, devi sapere che esistono diverse librerie di programmazione funzionale come Ramda ciò può aiutarti a evitare di reinventare la ruota e offrirti esempi migliori di utilizzo idiomatico.

    
risposta data 11.06.2016 - 20:09
fonte

Leggi altre domande sui tag