Mi è sempre stato insegnato che avere effetti collaterali in una if
condizione è negativo. Ciò che voglio dire è;
if (conditionThenHandle()) {
// do effectively nothing
}
... al contrario di;
if (condition()) {
handle();
}
... e lo capisco, e i miei colleghi sono felici perché non lo faccio, e tutti andiamo a casa alle 17:00 di venerdì e tutti hanno un buon fine settimana.
Ora, ECMAScript5 ha introdotto metodi come every()
e some()
to Array
, e li trovo molto utili. Sono più puliti di quelli for (;;;)
, ti offrono un altro scopo e rendono l'elemento accessibile da una variabile.
Tuttavia, durante la convalida dell'input, il più delle volte mi trovo a utilizzare every
/ some
nella condizione per convalidare l'input, quindi uso every
/ di some
nuovo nel corpo per convertire l'input in un modello utilizzabile;
if (input.every(function (that) {
return typeof that === "number";
})) {
input.every(function (that) {
// Model.findById(that); etc
}
} else {
return;
}
... quando quello che voglio fare è;
if (!input.every(function (that) {
var res = typeof that === "number";
if (res) {
// Model.findById(that); etc.
}
return res;
})) {
return;
}
... che mi dà effetti collaterali in una if
condizione, che è male.
In confronto, questo è il codice che guarderebbe con un vecchio for (;;;)
;
for (var i=0;i<input.length;i++) {
var curr = input[i];
if (typeof curr === "number") {
return;
}
// Model.findById(curr); etc.
}
Le mie domande sono:
- È sicuramente una cattiva pratica?
- Sto usando (mis | ab)
some
eevery
( dovrei usare afor(;;;)
per questo?) - C'è un approccio migliore?
some
, voglio fare qualcosa con l'elemento, se uso every
, voglio fare qualcosa con tutti quegli elementi ... some
e every
non farmi accedere a tali informazioni, quindi neanche io usali, o devo aggiungere effetti collaterali.
some
nella mia if
condizione per determinare se un determinato elemento nella matrice presenta una certa proprietà, 9/10 devo operare su quell'elemento nel mio if
corpo; ora, poiché some
non mi dice quale degli elementi esponesse la proprietà (solo "uno ha fatto"), posso usare di some
nuovo nel corpo (O (2n)), oppure posso semplicemente eseguire l'operazione all'interno della condizione if ( che è male, perché è un effetto collaterale all'interno della testa).
every
, ovviamente.