1
resposta

Desafio Opcional - com filtro de datas

Inseri o filtro completo de datas válidas na classe. Teria uma maneira melhor em OO para fazer neste caso, pra não ficar tão tumultuado?

class Data:
    def __init__(self, dia, mes, ano):
        verifica = True
        if ano < 1:
            verifica = False
        elif mes not in range(1, 13):
            verifica = False
        elif mes in (1, 3, 5, 7, 8, 10, 12):
            if dia not in range(1, 32):
                verifica = False
        elif mes in (4, 6, 9, 11):
            if dia not in range(1, 31):
                verifica = False
        elif mes == 2:
            bidiv = ano % 4
            if bidiv == 0:
                if dia not in range(1, 30):
                    verifica = False
            else:
                if dia not in range(1, 29):
                    verifica = False
        if verifica:
            self.dia = dia
            self.mes = mes
            self.ano = ano
        else:
            print('Data inválida - lançamento 01/01/0001')
            self.dia = 1
            self.mes = 1
            self.ano = 1
            
    def formatada(self):
        print(f"{self.dia:02d}/{self.mes:02d}/{self.ano:04d}")

no outro arquivo eu chamei

from datas import Data

d = Data(21,11,2007)
d.formatada()
1 resposta

Oi, Dalmar! Tudo bom contigo?

Desculpe a demora em te responder.

Uma ideia bacana para melhorar a classe Data é separar a lógica de validação de data em seus próprios métodos. Além disso, para verificar se um ano é bissexto, temos que considerar que o ano seja divisível por 4, não seja divisível por 100, ou seja divisível por 400.

Implementando esses aspectos em nosso código, chegaremos no seguinte resultado:

class Data:
    def __init__(self, dia, mes, ano):
        if self.data_valida(dia, mes, ano):
            self.dia = dia
            self.mes = mes
            self.ano = ano
        else:
            print('Data inválida - lançamento 01/01/0001')
            self.dia = 1
            self.mes = 1
            self.ano = 1
            
    def data_valida(self, dia, mes, ano):
        if ano < 1 or mes not in range(1, 13):
            return False
        if mes in (1, 3, 5, 7, 8, 10, 12) and dia in range(1, 32):
            return True
        if mes in (4, 6, 9, 11) and dia in range(1, 31):
            return True
        if mes == 2:
            if self.eh_bissexto(ano) and dia in range(1, 30):
                return True
            if not self.eh_bissexto(ano) and dia in range(1, 29):
                return True
        return False

    def eh_bissexto(self, ano):
        return ano % 4 == 0 and (ano % 100 != 0 or ano % 400 == 0)

    def formatada(self):
        print(f"{self.dia:02d}/{self.mes:02d}/{self.ano:04d}")

Dalmar, abaixo há um resumo das mudanças feitas, veja comigo:

  • A lógica de validação foi movida para o método data_valida;
  • A lógica para verificar se um ano é bissexto foi movida para o método eh_bissexto;
  • Em data_valida, simplificamos as condições por meio da utilização de IFs e de verificações compostas (com and ou or), reduzindo a complexidade e a existência de IFs aninhados.

Com isso, simplificamos o código, tornando-o mais legível e simples :)

Espero que essas dicas te ajudem, Dalmar! Durante a realização deste curso, você estudará vários conceitos legais de Programação OO, então, sinta-se confortável para aplicá-las neste projeto e aperfeiçoá-lo.

Qualquer dúvida, estarei por aqui.

Um abraço!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!