DEV Community

João Victor Santos
João Victor Santos

Posted on

E Se... As Condicionais Fossem Mais Simples? Transformando Código com Boas Práticas

Escrever código não é apenas fazê-lo funcionar; é sobre entender como nossas escolhas de estrutura afetam a legibilidade, manutenção e eficiência do código. O uso adequado de condicionais como if-else desempenha um papel crucial nesse processo.

Importância da escolha correta

Cada if e else representa um caminho que pode levar a diferentes resultados. Embora a solução mais rápida seja tentadora, ela pode se tornar insustentável ao longo do tempo.

Um código claro e conciso melhora a legibilidade, facilita futuras modificações e promove a colaboração entre desenvolvedores. Essa clareza começa com a escolha adequada das estruturas condicionais.

A simplicidade como abordagem

Aninhar condicionais pode criar uma cascata de if-else que, embora funcione, torna-se difícil de entender. Simplificar essas estruturas com early return pode ser a melhor abordagem:

Early return é o retorno imediato de uma função quando a condição é atendida, evitando o uso de else e reduzindo a complexidade.

public String determinePermission(String accessLevel) {
    if (accessLevel.equals("Administrator")) {
        return "Full access granted";
    }
    return "Limited access granted";
}
Enter fullscreen mode Exit fullscreen mode

Este exemplo demonstra como um retorno antecipado elimina a necessidade de else, tornando a intenção do código mais clara e fácil de compreender. Ao eliminar aninhamentos desnecessários, criamos um fluxo mais linear e menos propenso a erros.

Simplificando decisões

Em vez de utilizar uma série de if-else, mapear condições com lookup tables é uma maneira mais eficiente:

var vehicleTypes = map[string]string{
    "car":      "land",
    "boat":     "water",
    "airplane": "air",
}

func getTransportMedium(vehicle string) string {
    if medium, exists := vehicleTypes[vehicle]; exists {
        return medium
    }
    return "unknown medium"
}
Enter fullscreen mode Exit fullscreen mode

Aqui, utilizamos um mapa para relacionar tipos de veículos com seus meios de transporte, melhorando a clareza e facilitando a manutenção e escalabilidade do código.

Organizando a complexidade

Quando as condições são numerosas, o switch-case é uma solução ideal para organizar múltiplas condições de forma clara:

function getInstrumentSound(instrument) {
    switch (instrument) {
        case "guitar":
            return "strum";
        case "drum":
            return "beat";
        case "flute":
            return "whistle";
        default:
            return "unknown sound";
    }
}
Enter fullscreen mode Exit fullscreen mode

O switch-case lida com múltiplas condições de maneira elegante, tornando o código mais fácil de seguir e menos propenso a erros.

Usando estratégias a seu favor

Outro conceito importante é o short-circuit evaluation, onde as condições em uma expressão lógica são avaliadas até que o resultado seja conhecido. Isso significa priorizar condições mais prováveis, economizando tempo de execução.

  • Comece com a condição mais provável no OR ('||'):
if conditionLikelyTrue || otherCondition {
    // código executado se qualquer uma das condições for verdadeira
}
Enter fullscreen mode Exit fullscreen mode
  • Ou com a menos provável no AND ('&&'):
if unlikelyCondition && otherCondition {
    // código executado somente se ambas as condições forem verdadeiras
}
Enter fullscreen mode Exit fullscreen mode

Exemplo prático

Um exemplo em Kotlin:

val containerView = container.itemView as? ViewGroup ?: return

if (containerView.isEmpty()) return
Enter fullscreen mode Exit fullscreen mode

Aqui, o operador Elvis (?:) permite um retorno imediato caso container.itemView não seja um ViewGroup, evitando uma verificação explícita de nulidade. A verificação containerView.isEmpty() utiliza early return, mantendo o código mais linear.

O operador Elvis em Kotlin permite que você forneça um valor padrão se a expressão for null, tornando o código mais conciso.

Boas práticas

O uso de constantes e variáveis semânticas simplifica e clarifica o código:

  • Utilizar constantes para operações booleanas melhora a legibilidade:
final boolean isAdult = age >= 18;
final boolean hasPermission = permissionGranted;

if (isAdult && hasPermission) {
    // código executado se a pessoa for adulta e tiver permissão
}
Enter fullscreen mode Exit fullscreen mode
  • Crie constantes semânticas para cadeias de operações booleanas complexas:
final boolean isEligible = isAdult && hasPermission;
final boolean canProceed = isEligible && hasPaidFee;

if (canProceed) {
    // código executado se a pessoa for elegível e tiver pago a taxa
}
Enter fullscreen mode Exit fullscreen mode
  • O operador ternário deve ser utilizado com parcimônia, apenas quando a expressão é simples e clara, pois pode comprometer a legibilidade do código:
String status = isEligible ? "Approved" : "Denied";
Enter fullscreen mode Exit fullscreen mode
  • Utilize Guard Clauses no início da função para verificar condições e interromper a função, protegendo a execução indesejada:
if (!isValid) {
    return;
}
// Restante do código
Enter fullscreen mode Exit fullscreen mode

Guard Clauses são verificações no início de uma função que permitem sair da função caso uma condição específica não seja atendida, simplificando o fluxo de controle.

Conclusão

Cada if, else ou switch que escrevemos contribui para o resultado final. Investir tempo para entender e aplicar as melhores práticas no uso de condicionais não só cria um código mais eficiente, mas também nos prepara para desafios mais complexos no futuro. A capacidade de escolher e aplicar a estrutura condicional adequada define a qualidade e sustentabilidade do nosso trabalho. Enfrentar essas escolhas com atenção e cuidado é essencial para evoluirmos como desenvolvedores.

Top comments (0)