Mi è sempre stato insegnato che avere effetti collaterali in una ifcondizione è 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/ somenella 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 ifcondizione, 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)
someeevery( 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 ... somee everynon farmi accedere a tali informazioni, quindi neanche io usali, o devo aggiungere effetti collaterali.
somenella mia ifcondizione per determinare se un determinato elemento nella matrice presenta una certa proprietà, 9/10 devo operare su quell'elemento nel mio ifcorpo; ora, poiché somenon 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.