1
resposta

desafio datas.py (queria receber feedback do meu codigo, no objetivo de aprimorar conhecimento)



class Data:
    def __init__(self, dia, mes, ano):
        self.dia = dia
        self.mes = mes
        self.ano = ano

    def formatada(self):
        if self.mes < 1 or self.mes > 12:  # Se o mes for negativo ou maior que 12
            print("Mês não existe")

        elif self.mes == 2 and self.dia in range(1, 30):  # Condiçao para fevereiro
            print("{}/{}/{}".format(self.dia, self.mes, self.ano))

        elif self.mes % 2 != 0 and self.dia in range(1, 31): # Condiçao para os meses impares
            print("{}/{}/{}".format(self.dia, self.mes, self.ano))

        elif self.mes % 2 == 0 and self.dia in range(1, 32) and self.mes != 2: # Condição para os meses pares
            print("{}/{}/{}".format(self.dia, self.mes, self.ano))

        else:
            print("Dia {} do {} de {} não existe".format(self.dia, self.mes, self.ano))

# By: Matheus Silverio 
1 resposta

Eu recentemente fiz essa atividade e nem de longe pensei em implementar toda essa complexidade, parabéns, haha!

Seu código ficou bom, e bem organizado. Porém, os meses impares só têm 31 dias até agosto, e vice-versa. Tem também a questão dos anos bissextos.

Eu dei umas ajustadas no seu código para implementar essas mudanças, e ficou assim:

class Data:
    def __init__(self, dia, mes, ano):
        self.dia = dia
        self.mes = mes
        self.ano = ano

    def formatada(self):

        #  Declaração de variáveis para melhorar a legibilidade:
        mes_inexistente = self.mes < 1 or self.mes > 12
        ano_bissexto = self.ano % 4 == 0 and self.ano % 100 != 0
        fevereiro = self.mes == 2
        mes_impar = self.mes % 2 != 0
        mes_par = self.mes % 2 == 0
        ate_28_dias = self.dia in range(1, 29)
        ate_29_dias = self.dia in range(1, 30)
        ate_30_dias = self.dia in range(1, 31)
        ate_31_dias = self.dia in range(1, 32)
        antes_de_agosto = self.mes < 8
        depois_de_agosto = self.mes >= 8

        #  Se o mês é impar e vem antes de agosto, ou é par depois de agosto, tem 31 dias:
        mes_31_dias = mes_impar and antes_de_agosto or mes_par and depois_de_agosto

        #  Se o mês é par e vem antes de agosto (exceto  fevereiro), ou é impar e depois de agosto, tem 30 dias:
        mes_30_dias = mes_par and not fevereiro and antes_de_agosto or mes_impar and depois_de_agosto


        if mes_inexistente:  # Se o mes for negativo ou maior que 12
            print("Mês não existe")

        elif ano_bissexto and fevereiro and ate_29_dias: #  Condição para fevereiro em anos bissextos
            print(f"{self.dia}/{self.mes}/{self.ano}")

        elif not ano_bissexto and fevereiro and ate_28_dias: #  Condição para fevereiro em anos não-bissextos
            print(f"{self.dia}/{self.mes}/{self.ano}")

        elif mes_31_dias and ate_31_dias:  # Condiçao para os meses com 31 dias
            print(f"{self.dia}/{self.mes}/{self.ano}")

        elif mes_30_dias and ate_30_dias:  # Condição para os meses com 30 dias
            print(f"{self.dia}/{self.mes}/{self.ano}")

        else:
            print(f"Dia {self.dia} do {self.mes} de {self.ano} não existe")

Essas mudanças tornariam o código bastante ilegível, então eu também fiz uns ajustes na questão de legibilidade, colocando as condições dentro de variáveis e substituindo a função "str.format()" pelo "f".