Eu sempre fui ensinado que ter efeitos colaterais em uma if
condição é ruim. O que eu quero dizer é;
if (conditionThenHandle()) {
// do effectively nothing
}
... em oposição a;
if (condition()) {
handle();
}
... e eu entendo isso, e meus colegas estão felizes porque eu não faço, e todos nós voltamos para casa às 17:00 na sexta-feira e todo mundo tem um fim de semana feliz.
Agora, o ECMAScript5 introduziu métodos como every()
e some()
para Array
, e eu os acho muito úteis. Eles são mais limpos que for (;;;)
os outros, oferecem outro escopo e tornam o elemento acessível por uma variável.
No entanto, ao validar a entrada, eu geralmente me encontro usando every
/ some
na condição de validar a entrada e depois uso every
/ some
novamente no corpo para converter a entrada em um modelo utilizável;
if (input.every(function (that) {
return typeof that === "number";
})) {
input.every(function (that) {
// Model.findById(that); etc
}
} else {
return;
}
... quando o que eu quero fazer é;
if (!input.every(function (that) {
var res = typeof that === "number";
if (res) {
// Model.findById(that); etc.
}
return res;
})) {
return;
}
... o que me causa efeitos colaterais em uma if
condição ruim.
Em comparação, esse é o código com o qual seria antigo for (;;;)
;
for (var i=0;i<input.length;i++) {
var curr = input[i];
if (typeof curr === "number") {
return;
}
// Model.findById(curr); etc.
}
Minhas perguntas são:
- Definitivamente, é uma prática ruim?
- Estou (mis | ab) usando
some
eevery
( devo usar umfor(;;;)
para isso?) - Existe uma abordagem melhor?
some
, quero fazer algo com o elemento, se eu usar every
, quero fazer algo com todos esses elementos ... some
e every
não me permita acessar essas informações, para que não possa usá-los, ou eu tenho que adicionar efeitos colaterais.
some
na minha if
condição para determinar se um determinado elemento da matriz exibe uma determinada propriedade, 9/10 eu preciso operar com esse elemento no meu if
corpo; agora, como some
não me diz qual dos elementos exibia a propriedade (apenas "um fez"), posso usar some
novamente no corpo (O (2n)) ou executar a operação dentro da condição if ( o que é ruim, porque é um efeito colateral na cabeça).
every
também, é claro.