Executando verificação de segurança...
3

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.

Carregando publicação patrocinada...
1

Cara o @filipedeschamps fez um If' delicinha no canal dele, usando javascript, acredito que funciona com PHP também. consiste em ter um array e o $falta seria chave do array.
https://www.youtube.com/watch?v=Lf3ZV0UsnEo

sobre o quanto é muito If's realmente é um grande DEPENDE.
Mas tem uma trilha do alberto sobre complexidade cognitiva que gosto bastante.
https://www.youtube.com/watch?v=rqw_Jnv6ZX4
ele tem bastante conteudo sobre isso, e inclusive tem um plugin pro VSCode que faz a analise estatica no código de acordo com suas preferencias.

1

Nesse caso específico, não vejo vantagem em deixar a $falta como chave. Porque no exemplo que coloquei, ela indica o valor que não é pra imprimir, então o for me parece mais simples.

Mas claro que cada caso é um caso. Tem vezes que compensa ter uma estrutura diferente, e as soluções variam conforme o problema. Tudo depende.