Qual è il modo più leggibile per passare argomenti alla funzione? [chiuso]

1

Sto usando JavaScript ma la domanda può essere generalizzata a tutte le lingue.

In poche parole: sto verificando se un browser che si collega al mio sito è un forno a microonde e provvede in tal senso.

Quale sarebbe il modo migliore per strutturare il mio codice?

Il modo migliore è in "più leggibile", "più mantenibile" (inserisci qui la tua metrica) ...

Opzione 1.0

var iammicrowave = /(microwave)/.test(navigator.userAgent);
if (iammicrowave) {
    var settings = { blah : 42 };
    magicFunction(settings);
} else {
    magicFunction();
}

Opzione 1.1

var iammicrowave = /(microwave)/.test(navigator.userAgent);
if (iammicrowave) {
    magicFunction({ blah : 42 });
} else {
    magicFunction();
}

Opzione 2.0

var iammicrowave = /(microwave)/.test(navigator.userAgent);
var settings;
if (iammicrowave) {
    settings = { blah : 42 };
}
magicFunction(settings);

Opzione 2.1

var iammicrowave = /(microwave)/.test(navigator.userAgent);
var settings = imamicrowave ? { blah : 42 } : undefined;
magicFunction(settings);

Opzione 2.1.1

var iammicrowave = /(microwave)/.test(navigator.userAgent);
var settings = imamicrowave ? { blah : 42 } : {};
magicFunction(settings);

Opzione 2.2

var iammicrowave = /(microwave)/.test(navigator.userAgent);
magicFunction(imamicrowave ? { blah : 42 } : {});

Opzione 2.3

magicFunction(/(microwave)/.test(navigator.userAgent) ? { blah : 42 } : {});

Grazie mille!

    
posta Michal Stefanow 15.10.2015 - 12:13
fonte

3 risposte

3

Per qualcosa di simile in cui non c'è molta carne al codice, il modo più leggibile è il modo più coerente con gli idiomi della tua lingua e coerente con la tua base di codice (probabilmente in quella priorità). I bug arriveranno quando le persone leggeranno il codice assumendo che faccia una cosa, ma il tuo codice è diverso. I problemi di leggibilità arrivano quando le persone leggono il codice presumendo che sia una cosa, ma il tuo codice è diverso.

Nel vuoto, non mi piace nessuno di questi. Invece:

if(/(microwave)/.test(navigator.userAgent)) {
  magicFunction({blah: 42});
} else {
  magicFunction();
}

Ti permette di rompere il condizionale. Non produce vars locali che rendono il lettore preoccupato che il valore venga usato in seguito. Rende esplicito ogni ramo, il che rende più facile il cambiamento in futuro.

Per condizionali meno chiari, li dividerei nella loro funzione ben denominata piuttosto che utilizzare una variabile locale per questo poiché una logica meno chiara tende a richiedere il riutilizzo e / o il test in isolamento.

    
risposta data 15.10.2015 - 15:16
fonte
1

Non dovresti ripetere la chiamata alla funzione poiché è sempre eseguita comunque. Quindi 1.0 e 1.1 sono fuori.

La distinzione tra 2.1 e 2.1.1 è in realtà una questione del contratto della funzione chiamata. La funzione potrebbe interpretare undefined e {} in modo diverso, e non possiamo dire cosa è corretto senza conoscere il contratto della funzione. Trovo l'opzione 2.1.1 più chiara dell'opzione 2.0 e 2.1, ma è anche semanticamente diversa così difficile da dire che cosa è corretto.

Dovresti avere settings e iammicrowave come variabili o avere solo le espressioni in linea come in 2.3? Trovo il 2.3 quasi illeggibile, quindi direi che dovresti. Soprattutto il nome della variabile iammicrowave rende molto più chiaro cosa sta succedendo.

    
risposta data 15.10.2015 - 12:51
fonte
1

Penso che dare a magicFunction() un nome migliore possa essere di maggiore aiuto per la leggibilità rispetto a qualsiasi altra opzione che si presenta. Oppure crea una funzione wrapper con un nome ben definito che costruisca la mappa delle impostazioni e la passi a magicFunction() . Non penso che la variabile iammmicrowave sia strettamente necessaria o aggiunga così tanto alla leggibilità.

In una lingua con tipi puoi anche dare un nome al tipo di dati settings , formalizzare le sue chiavi consentite e scrivere una descrizione di esso nei commenti dove è definito. Potrebbe essere d'aiuto, ma penso ancora che un nome di funzione più descrittivo sarebbe di grande aiuto.

    
risposta data 15.10.2015 - 16:13
fonte