On m'a toujours appris qu'avoir des effets secondaires dans une if
condition était mauvais. Ce que je veux dire est;
if (conditionThenHandle()) {
// do effectively nothing
}
... par opposition à;
if (condition()) {
handle();
}
... et je comprends cela, et mes collègues sont heureux parce que je ne le fais pas, et nous rentrons tous chez nous à 17h00 un vendredi et tout le monde a un joyeux week-end.
Maintenant, ECMAScript5 a introduit des méthodes comme every()
et some()
à Array
, et je les trouve très utiles. Ils sont plus propres que for (;;;)
les autres, vous donnent une autre portée et rendent l'élément accessible par une variable.
Cependant, lors de la validation de l'entrée, je me retrouve le plus souvent à utiliser every
/ some
dans la condition pour valider l'entrée, puis à utiliser every
/ à some
nouveau dans le corps pour convertir l'entrée en un modèle utilisable;
if (input.every(function (that) {
return typeof that === "number";
})) {
input.every(function (that) {
// Model.findById(that); etc
}
} else {
return;
}
... quand ce que je veux faire, c'est;
if (!input.every(function (that) {
var res = typeof that === "number";
if (res) {
// Model.findById(that); etc.
}
return res;
})) {
return;
}
... ce qui me donne des effets secondaires dans un if
état, ce qui est mauvais.
En comparaison, c'est le code qui ressemblerait à un ancien for (;;;)
;
for (var i=0;i<input.length;i++) {
var curr = input[i];
if (typeof curr === "number") {
return;
}
// Model.findById(curr); etc.
}
Mes questions sont:
- Est-ce définitivement une mauvaise pratique?
- Suis-je (mis | ab) en utilisant
some
etevery
( devrais- je utiliser unfor(;;;)
pour cela?) - Est-ce qu'il y a une meilleure approche?
some
, je veux faire quelque chose avec l'élément, si j'utilise every
, je veux faire quelque chose avec tous ces éléments ... some
et every
ne me laisse pas accéder à cette information, donc soit je ne peux pas les utiliser, ou je dois ajouter des effets secondaires.
some
dans mon if
état pour déterminer si un certain élément du tableau présente une propriété, 9/10 je dois fonctionner sur cet élément dans mon if
corps; maintenant, comme some
ne me dites pas que des éléments exposés la propriété (juste « un fait »), je peux soit utiliser à some
nouveau dans le corps (O (2n)), ou je peux effectuer l'opération à l' intérieur du si la condition ( ce qui est mauvais, car c'est un effet secondaire dans la tête).
every
même, bien sûr.