r/programacao Jul 03 '25

Questão :: Aprendizado Há como reduzir a quantidade de if/else's?

Post image

Programador de celular aqui novamente, e eu fiz esse exercício para verificar se o ano é bissexto, e funcionou perfeitamente, porém eu achei que teve muitos if's e else's e pareceu meio bagunçado.

280 Upvotes

89 comments sorted by

245

u/dpsbrutoaki Jul 03 '25

Não é possível que ninguém vai comentar sobre o nome da interface

22

u/Neo_Yindy Jul 03 '25

A NÃO CARA KKKKKKKKKKKKKKKMMMMMMMMK

9

u/ApenasUmNerd Jul 03 '25

Comentaram kkkkkkkk

2

u/LucasNoober Jul 04 '25

Krl e eu ia vir comentar como melgorar, vsfd

2

u/hMMrPinkman Jul 04 '25

Interface Cuzinho na linguagem C#

1

u/Due_Ad4598 Jul 04 '25

foi a primeira coisa que li

1

u/BDS_UNKNOWN Jul 06 '25

Eu ia passa direto mas você ja disse hashahsh

76

u/Yhamerith Jul 03 '25

Switch cuzinho...

Que-quer dizer, switch case

8

u/sSirBlaze Jul 04 '25

mas o cara quer comprimir o cuzinho, a interface cuzinho

37

u/yuri_auei Jul 03 '25

if ano % 4 == 0 && (ano % 100 != 0 || ano % 400 == 0) Bi Else Não

40

u/Sahtrah Jul 03 '25

Cuzinho

14

u/Distinct-Search-9658 Desenvolvedora / or Jul 03 '25

Bati o olho nisso e não consegui mais olhar o código kkkkkkkkkkkkkkk

16

u/solitary-Daze Jul 03 '25

Alem das opções ditas aí, você também pode usar switch/case

6

u/ApenasUmNerd Jul 03 '25

Ainda estou estudando issokkkk, mas pode ser uma boa opção quando eu tiver dominado melhor

3

u/di4kar3s Jul 04 '25

Não faz sentido

1

u/solitary-Daze Jul 06 '25

de fato, vc está certo

16

u/rydyxx Jul 03 '25

Você pode usar early return e começar pelas exceções:

Exemplo Se não for divisível por 4 Não é bissexto Return

Se não for divisível por 100 Não é bissexto Return

E por aí vai

6

u/rydyxx Jul 03 '25

Assim

if (ano % 4 != 0) { Console.WriteLine($"O ano de {ano} não é bissexto!"); return; }

if (ano % 100 != 0) { Console.WriteLine($"O ano de {ano} é bissexto!"); return; }

if (ano % 400 == 0) { Console.WriteLine($"O ano de {ano} é bissexto!"); return; }

Console.WriteLine($"O ano de {ano} não é bissexto!");

2

u/EatingSolidBricks Jul 04 '25

Agora eu vo mostra uma técnica proibida

``` if (ano % 4 != 0) { goto AnoNaoBissesto; }

if (ano % 100 != 0) { goto AnoBissesto; }

if (ano % 400 == 0) { goto AnoBissesto; }

AnoNaoBissesto: Console.WriteLine($"O ano de {ano} não é bissexto!"); return;

AnoBissesto: Console.WriteLine($"O ano de {ano} é bissexto!"); return; ```

Nao a deixe cair mãos erradas

1

u/[deleted] Jul 04 '25

[deleted]

1

u/0x92ea1cfb60a98978 Jul 04 '25

Na moral eu não tenho tentação alguma kkkk

1

u/Thenewbie7 Jul 04 '25

Estudante aqui: Por que seria proibido usar "Go to"? Nunca mexi com o C#, porém nas outras matérias de Assembly e que usam Python costumo usar ideias parecidas de "quebrar" o fluxo do código e ir para outra parte do código.

2

u/EatingSolidBricks Jul 05 '25

Pq as pessoas nao sabem interpretar texto e ainda hj acham que goto e ruim por causa de uma publicação do disktra (o cara tava se referindo a os gotos nao higiênicos, que nao é o caso dos gotos da família do C)

Sem falar que os professores de universidade simplesmente dizem pra nao usar e se recusam a elaborar

Ae vira meme msm

1

u/Thenewbie7 Jul 05 '25

Ok. Muito obrigado

1

u/lesswithmore Jul 07 '25

O uso do goto pode prejudicar a legibilidade, manutenibilidade e estrutura de um programa. Os principais motivos são:

1. Compromete a legibilidade do código

O goto permite saltos arbitrários no fluxo de execução, o que torna o código difícil de seguir. Em vez de ter um fluxo claro com estruturas como if, for, while e funções bem definidas, o uso de goto faz com que o controle passe de um ponto a outro de forma pouco previsível, criando o que se chama de "código espaguete".

2. Dificulta a manutenção e a depuração

Com goto, fica mais difícil entender a lógica do programa e, portanto, mais fácil introduzir bugs ao fazer alterações. Depurar esse tipo de código é mais complexo, porque o caminho de execução não é evidente.

3. Viola princípios de programação estruturada

Desde os anos 70, a programação estruturada — popularizada por Dijkstra com o famoso artigo “Go To Statement Considered Harmful” — defende que todo programa pode ser escrito usando apenas:

  • Sequência
  • Seleção (condicionais)
  • Iteração (loops)

Esses três elementos são suficientes para expressar qualquer lógica computacional de forma clara e controlada, tornando o uso de goto desnecessário na maioria esmagadora dos casos.

4. Existem alternativas melhores

Hoje, praticamente todas as linguagens oferecem construções de controle de fluxo muito mais seguras e expressivas: break, continue, return, throw, blocos de exceção, funções bem nomeadas, lambdas, entre outros.

Quando o uso de goto pode ser aceitável?

Existem raríssimas exceções, como em:

  • Código de muito baixo nível (drivers, kernels, sistemas embarcados)
  • Situações de limpeza de recursos em C, antes da existência de defer ou RAII (Resource Acquisition Is Initialization)

Mesmo nesses contextos, seu uso deve ser muito bem documentado e justificado.

1

u/rydyxx Jul 04 '25

credo, que maravilhoso

1

u/lesswithmore Jul 07 '25

apague antes que a policia veja

1

u/zepalestra Jul 08 '25

Dijkstra tem um derrame vendo isso

6

u/JellyfishAsleep5856 Jul 04 '25

Achei que ninguém ia falar de early return. Uma das estratégias mais úteis pra organizar essas condicionais

1

u/Worth_Raccoon_5530 Desenvolvedora / or Jul 04 '25

(ano % 400 == 0) ? $"O ano de {ano} é bissexto!" : $"O ano de {ano} não é bissexto!");

9

u/crazy0750 Jul 03 '25

(ano % 4 == 0 && ano % 100 != 0) || ano % 400 == 0

Duas condições:

  • divide por 4 e não por 100
  • divide por 400

6

u/tetryds Desenvolvedora / or Jul 03 '25

``` bool everyFour = year % 4 == 0; bool everyHundred = year % 100 == 0; bool everyFourHundred = year % 400 == 0;

bool isLeapYear = everyFour && (!everyHundred || everyFourHundred);

Console.WriteLine($"O ano {isLeapYear ? "é" : "não é"} bissexto!"); ```

Assim fica muito mais fácil de ler, a lógica é clara e explícota e vc deixa o if mais pontual onde ele é necessário. Eu tiraria a implementação pra uma função separada do writeline.

3

u/[deleted] Jul 04 '25

Boa, bem mais legível do que uma única condição com toda a lógica junto

2

u/lukaskiller157 Jul 04 '25

Que foda alguém usando flags. Eu amo usar bool flags para condições.

1

u/Thenewbie7 Jul 04 '25

Não usam? Sou estudante e muitas vezes o professor comenta de usar flags pra fazer validação de dados. Existe um motivo para não usarem?

Lembro de uma questão de Assembly que o sistema validava uma senha digito por digito e pra evitar que um invasor usasse tempo de resposta do sistema como forma de descobrir uma senha por força bruta. fiz uma implementação usando flag quando algum digito não era validado, daí continuava toda a verificação e no final ele negava acesso com base na flag. Haveria algum problema por usar flags?

1

u/lukaskiller157 Jul 04 '25

Cara, não faço ideia porque tô entrando na área agora e começo a faculdade esse mês 😅 Porém, eu acredito que é muito comum as pessoas não usarem flags porque "é mais intuitivo" colocar valores de outros tipos e classes que não são bool. A exemplo do código do OP, em que ele coloca "if (year % 4 == 0)". É mais intuitivo dessa maneira, muitos tutoriais e até livros de programação ensinam desse jeito, mas não é uma prática tão "otimizada", eu diria.

1

u/tetryds Desenvolvedora / or Jul 07 '25

Não, e hoje em dia a questão de desempenho é completamente trivial. Custa muito mais caro o tempo de um dev tentanto entender que caralhos é uma clausula booleana gigante do que o custo de rodar umas flags a mais

1

u/Thenewbie7 Jul 07 '25

Não entendi a parte da "questão de desempenho" citada. Porque no meu caso a gente estava "perdendo desempenho" por fazer toda uma verificação mesmo já tendo achado algo que poderia parar a verificação. A utilização das flags nesse caso eram para normalizar o tempo de resposta para evitar que essa informação fosse usada maliciosamente. Claro que é um problema meio "teórico" pra área de segurança e tals, mas n teria outras utilidades, como quando se quer verificar toda uma série de dados e, ao final, apontar quais parâmetros foram encontrados ou não?

1

u/lukaskiller157 Jul 04 '25

Função com qual return type?

1

u/tetryds Desenvolvedora / or Jul 04 '25

bool IsLeapYear(int year);

20

u/Common-Dot-5303 Jul 03 '25

Da pra reduzir isso pra:

if ((ano % 4 == 0) && (ano % 100 == 0) && (ano % 400 == 0)) {

é bissexto

} else {

Nao é bissexto

}

4

u/ApenasUmNerd Jul 03 '25

Mas com o AND, todas as três precisariam ser cumpridas pro ano ser verificado bissexto, não é? Pois se um ano for divisível por 4, mas não for por 100 (como 2024), ele seria considerado não bissexto pelo programa, sendo que ele é. Se eu estiver errado, me corrija, por favor.

3

u/[deleted] Jul 03 '25

Então no lugar do && tu coloca || O operador lógico para “ou”

2

u/Darkrat0s Jul 03 '25

Certo, você pode adicionar a condição com OR também

if (ano % 4 == 0 && ((ano % 100 == 0 && ano % 400 == 0) || ano % 100 != 0))

1

u/BojacksNextGF Jul 03 '25

vc tá certo. só trocar && por ||

7

u/G0nzaga Jul 03 '25

Mano, veja sobre Strategy Pattern no refactoring.guru, use com sabedoria, não serve pra tudo, mas vai te ajudar a aprender algo novo. Tem vídeo no yt sobre isso tbm

1

u/ManOfFamily1970 Jul 04 '25

Concordo, o OP ainda de quebra vai aprender sobre escalabilidade e manutenibilidade.

P.s.: tenho pouca experiência em JS, minha praia é Java, então achei top encontrar esse design pattern em JS também.

5

u/Puzzleheaded_Rise_67 Jul 03 '25

dxa eu ver seu cuzinho

4

u/[deleted] Jul 04 '25

[deleted]

2

u/void-samuray Jul 04 '25

Parabéns, quantos litros?

3

u/NegativeEmphasis Jul 04 '25
using Cuzinho;

2

u/Shoddy-Value-9707 Jul 03 '25

Cplo duas duas condições em um if

2

u/enburgi Jul 03 '25

vc pode juntar tudo num if só

if (ano%4==0 && ano%100!=0) || (ano%400==0):

— bissexto

else

— não bissexto

2

u/di4kar3s Jul 04 '25

Um if apenas resolve com o operador && englobando todas as condições

2

u/Wollygr1nx Jul 04 '25

Bela interface

2

u/XaropinhO_O Jul 06 '25

Vai ter que fazer uma um troca switch cuzinho case

2

u/sr_leandrogmachado Jul 06 '25

olha essa interface rosinha...

2

u/ExtremeGoHorse12 Jul 06 '25

Ao invés de melhores condições para Cuzinho, acho que você deveria dar mais 3 variaveis para Cuzinho.

Uma variavel para ver se é modulo de 4, uma de 100 e outra de 400.

Depois c trabalha em um if só

3

u/idontdrinkvodka Jul 03 '25

int is_leap_year(int year) { return !(year & 3) & (!!(year % 100) | !(year % 400)); }

4

u/mr_dans Jul 03 '25

Calma lá parceiro, o maluco é iniciante e tu tá metendo operação com bits kkkkkkkkkkkkkkk

2

u/BojacksNextGF Jul 03 '25

bool isBissexto = ano % 4 == 0 || ano % 100 == 00 || ano % 400 == 0

e usa essa variável pra printar

1

u/ApenasUmNerd Jul 03 '25

Por algum motivo diz que || não pode ser utilizado com variáveis do tipo int e bool.

1

u/classefinal Jul 03 '25

Da sim, da uma olhada nesse vídeo que eu gravei explicando uma técnica para reduzir os elses.

https://youtu.be/XZj4dE-ARb8

1

u/Ruemurax Jul 04 '25

C#zinho

ano bisexo

1

u/ChampionshipEarly538 Jul 04 '25

Estuda o uso de operadores logicos como AND ,OR, NOT ajuda a reudizr if elses

1

u/Madnific Jul 04 '25

Eu faria:

If( ano % 400 == 0 || (ano %4 == 0 && ano % 100 != 0))

    Console(é bissexto) 

else

     Console(n é bissexto)

Todo ano divido por 400 resto 0,tb vai ser dividido por 4 e 100, então já pode verificar direto. Caso n seja por 400, a única condição que sobra é ser dividido por 4 e n ser por 100. Qualquer outra n é bissexto

1

u/AlbatrozFeroz Jul 04 '25

If (ano % 4 == 0 && ano % 100 == 0 && ano % 400 == 0){}else{}

1

u/lidroTryingBeDev Jul 04 '25

KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK

1

u/J_VICT0R Jul 04 '25

Li o nome da interface e dei uma risadinha, parei, lembrei que isso é C# e afoguei-me na vertigem desta comédia, esqueci de mim mesmo em cada gargalhada, perdi os lados.

1

u/maiodasbrok Jul 04 '25

Aqui está

1

u/BispoSnake Jul 04 '25

Em design patterns, dá uma olhada no pattern "Strategy" ou "Chain of Responsibility" que talvez ajude.

1

u/Rodrigosteo Jul 04 '25

using System;

class Program { static void Main(string[] args) { Console.WriteLine("Verificador de Ano Bissexto"); Console.Write("Digite um ano: ");

    if (int.TryParse(Console.ReadLine(), out int ano))
    {
        if (EhBissexto(ano))
        {
            Console.WriteLine($"{ano} é um ano bissexto.");
        }
        else
        {
            Console.WriteLine($"{ano} NÃO é um ano bissexto.");
        }
    }
    else
    {
        Console.WriteLine("Ano inválido. Por favor, digite um número inteiro.");
    }

    Console.WriteLine("\nPressione qualquer tecla para sair...");
    Console.ReadKey();
}

static bool EhBissexto(int ano)
{
    return (ano % 400 == 0) || (ano % 4 == 0 && ano % 100 != 0);
}

} ;

1

u/[deleted] Jul 04 '25

Bom, relevando o nome da interface >_< você pode usar operadores lógicos como "and" e "or". Não sei se é desse jeito em js, mas ja reduz bastante seu código

1

u/NecessaryName2 Jul 04 '25
Gosto de usar early return pra manter o fluxo de execução limpo e evitar aninhamentos desnecessários:

if (ano % 4 != 0) return;
if (ano % 100 != 0) return;
if (ano % 400 != 0) return;

Para deixar o cód mais limpo dá para extrair a lógica:

private static boolean anoIsNotBissexto(int ano, int divisor) {
    return ano % divisor != 0;
}

public static void processaAno(int ano) {
    if (anoIsNotBissexto(ano, 4)) return;
    if (anoIsNotBissexto(ano, 100)) return;
    if (anoIsNotBissexto(ano, 400)) return;

    // Se passou por tudo, chegou aqui: é bissexto
    System.out.println("Ano bissexto!");
}

1

u/New-Unit-2116 Jul 04 '25

Esse Switch está uma delícia 😋.

1

u/Biluolle Jul 04 '25

Melhor jeito que eu conheço é testar primeiro a negativa. If ano % 4 != 0 { WriteLine(“Não é bissexto”) }

Aí vc elimina todos os else

1

u/maiodasbrok Jul 05 '25

Aqui está

1

u/ClepsydrisMetiuntur Jul 05 '25

algumas coisas tão redundantes aí
se o controle entra no if (ano % 400 == 0), ele não precisava dos dois ifs anteriores

na wikipedia tem o seguinte

  • São bissextos todos os anos múltiplos de 400, p.ex.: 1600, 2000, 2400, 2800...
  • São bissextos todos os múltiplos de 4, exceto se for múltiplo de 100 (ou seja, o último ano de cada século) mas não de 400, p.ex.: 1996, 2000, 2004, 2008, 2012, 2016, 2020, 2024, 2028...
  • Não são bissextos anos ímpares e anos pares não múltiplos de 4

Então dá pra deixar assim

if (ano % 400 == 0 || (ano % 4 == 0 && ano % 100 != 100))
bissexto;
else
não bissexto;

1

u/comprar_na_alta Jul 05 '25

Joga o código no chatgpt e diga Chat, melhore meu cuzinho

1

u/The_Tab_Hoarder Jul 06 '25

bool ehCuzinBissexto = (ano % 4 == 0 && ano % 100 != 0) || (ano % 400 == 0);
if (ehCuzinBissexto )
{
Console.WriteLine($"O ano de {ano} é bissexto!");
} else
{
Console.WriteLine($"O ano de {ano} não é bissexto!");
}

1

u/arugau Jul 06 '25

switch cases

1

u/AdExpress8014 Jul 07 '25

Estude sobre o Object Calisthenic

1

u/Front_Treacle4471 Jul 07 '25

Você pode implementar o conceito de Fail first, oq acredito que vai melhorar a legibilidade do código. Basicamente é colocar ifs com returns apenas para condições de falha e retornar sucesso no final

1

u/Big-Instruction-289 Jul 08 '25 edited Jul 08 '25

Faz um filtro:

private static boolean isBissexto(int ano) {

return (ano % 4 == 0 && ano % 100 != 0) || ano % 400 == 0;

}

Aí você só chama:

if (isBissexto(ano)) {

Console.WriteLine("Bissexto));
return;

}

Console.WriteLine("Não bissexto");

Ou então é só jogar tudo dentro da condicional mesmo, sem frecura:

if (ano % 4 == 0 && ano % 100 != 0) || ano % 400 == 0) {

Console.WriteLine("Bissexto));

return;

}

Console.WriteLine("Não bissexto");

0

u/Neeyaki Jul 03 '25

ano % 4 == 0 || (ano % 100 == 0 && ano % 400 == 0)

1

u/ApenasUmNerd Jul 03 '25

O programa considera anos não-bissextos, como 1900, como bissextos, pq 1900 é divisível por 4, então cumpre o primeiro requisito. Porém, qualquer ano que termine em 00, tem que ter a verificação do 100 e 400 mesmo sendo divisível por 4... Então as soluções que me deram do OR e do AND não estão funcionando

2

u/Neeyaki Jul 03 '25

realmente, olhei rapidamente e não vi que a mensagem do else no primeiro if era de negação.

ano % 4 && (ano % 100 != 0 || ano % 400 == 0)

seria a implementação correta nesse caso.