tentar lidar primeiro com a entrada considerada "errada" ou um erro, para depois lidar com a entrada que você realmente "quer" para dar continuidade no código
Isso é conhecido como early return, a ideia é que vc teste os casos inválidos primeiro, e já retorne o respectivo erro. E só depois que já tem certeza que não há erros, aí vc vai pro trabalho propriamente dito. Ex:
function fazAlgo(nome, idade) {
if (nome === null || nome === '') {
return NOME_INVALIDO; // retorna algum código de erro específico
}
if (idade < 18) {
return SOMENTE_MAIORES_DE_18; // retorna outro código de erro específico
}
// aqui eu já sei que o nome e idade são válidos, e posso continuar
// ... código que faz algo com o nome e idade
}
Quanto a "evitar muitos if
/else
", depende. Quanto é "muitos"? Se vc tem vários casos diferentes pra testar, e precisa verificar um a um, pode ser que não tenha outro jeito a não ser fazer um if
pra cada. Cada caso é um caso.
O que eu vejo de exemplos ruins é o fato de muitos não entenderem que, uma vez que o código não entra em um if
, vc não precisa testar de novo a mesma condição nos demais if
's. Um exemplo clássico é:
// redundante, os mesmos valores aparecem mais de uma vez
function verificaIdade(idade) {
if (idade < 0) {
console.log('idade inválida');
} else if (idade >= 0 && idade < 18) {
console.log('menor de idade');
} else if (idade >= 18 && idade < 60) {
console.log('adulto');
} else if (idade >= 60) {
console.log('idoso');
}
}
Repare que os valores 0, 18 e 60 são usados duas vezes cada. Mas na verdade não precisa disso, pois o código pode ser apenas:
// sem redundância
function verificaIdade(idade) {
if (idade < 0) {
console.log('idade inválida');
} else if (idade < 18) {
console.log('menor de idade');
} else if (idade < 60) {
console.log('adulto');
} else {
console.log('idoso');
}
}
Pois se a idade não for menor que zero, ela não entra no primeiro if
. Ou seja, se chegou no primeiro else
é porque com certeza é maior ou igual a zero, então não preciso testar isso de novo (se não fosse maior ou igual a zero, teria entrado no primeiro if
). Eu só preciso testar a nova condição, que é se a idade é menor que 18.
Da mesma forma, se não entrou no segundo if
, é porque não é menor que 18, então se chegou no segundo else
é porque com certeza é maior ou igual a 18, e não precisa testar isso de novo.
Por fim, se não entrar em nenhum if
, é porque com certeza é maior ou igual a 60, então no último else
não preciso de um if
.
Assim fica não só mais claro e sucinto, como também facilita na hora de mudar as faixas de valores. Por exemplo, se quiser incluir uma faixa entre 18 e 21 e outra entre 22 e 60, a alteração fica mais simples no segundo código.
Isso vale como regra geral: se algo já foi testado antes, não precisa repetir novamente. Um bom conhecimento de álgebra booleana ajuda bastante nesse sentido.
Aproveitando, acabei de ver em outro site um exemplo de if
ruim (em PHP):
$dias = array("Segunda-feira", "Terça-feira", "Quarta-feira", "Quinta-feira", "Sexta-feira", "Sábado");
$falta = "Quinta-feira";
if ($falta == "Segunda-feira") {
echo "$dias[1] $dias[2] $dias[3] $dias[4] $dias[5]";
} elseif ($falta == "Terça-feira") {
echo "$dias[0] $dias[2] $dias[3] $dias[4] $dias[5]";
} elseif ($falta == "Quarta-feira") {
echo "$dias[0] $dias[1] $dias[3] $dias[4] $dias[5]";
} elseif ($falta == "Quinta-feira") {
echo "$dias[0] $dias[1] $dias[2] $dias[4] $dias[5]";
} elseif ($falta == "Sexta-feira") {
echo "$dias[0] $dias[1] $dias[2] $dias[3] $dias[5]";
} elseif ($falta == "Sábado") {
echo "$dias[0] $dias[1] $dias[2] $dias[3] $dias[4]";
}
A ideia é imprimir todos os dias, exceto o que estiver setado em $falta
. Este é um caso que até "funciona", mas o if
/else
não é o mais adequado. O mais simples é fazer um loop pelo array, e só imprimir os dias que são diferentes de $falta
:
foreach ($dias as $dia) {
if ($dia != $falta) {
echo "$dia ";
}
}
Ainda tem um if
, mas agora é um só. E ao contrário do outro código, funciona para arrays de qualquer tamanho. Além de, é claro, ser mais simples, sucinto, fácil de entender e manter.
Mas isso não quer dizer que uma sequência de if
/else
sempre é ruim. Cada caso é um caso.