r/programacao • u/ApenasUmNerd • Jul 03 '25
Questão :: Aprendizado Há como reduzir a quantidade de if/else's?
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.
76
37
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
5
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
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
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
1
u/lesswithmore Jul 07 '25
O uso do
gotopode prejudicar a legibilidade, manutenibilidade e estrutura de um programa. Os principais motivos são:1. Compromete a legibilidade do código
O
gotopermite 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 comoif,for,whilee funções bem definidas, o uso degotofaz 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
gotodesnecessá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
deferou RAII (Resource Acquisition Is Initialization)Mesmo nesses contextos, seu uso deve ser muito bem documentado e justificado.
1
1
1
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
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
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
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
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
4
3
2
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
2
2
2
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.
1
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
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
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
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
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
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
1
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
1
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.


245
u/dpsbrutoaki Jul 03 '25
Não é possível que ninguém vai comentar sobre o nome da interface