Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] validação no método estático?

Eu fiz de um jeito diferente a validação de nota. Eu coloquei dentro do método estático, seria uma má prática? Nos meus testes funcionou normalmente.

namespace ScreenSound.Modelos;

internal class Avaliacao
{
    public int Nota { get; }

    public Avaliacao(int nota)
    {
        if (nota < 0) nota = 0;
        if (nota >=10) nota = 10;
        Nota = nota;
    }

    public static Avaliacao Parse(string texto)
    {
        int nota = int.Parse(texto);

        if (nota < 0 || nota > 10)
        {
            if (nota < 0)
            {
                nota = 0;
                Console.WriteLine("A nota atribuída foi 0!");
            }
            else if (nota > 10)
            {
                nota = 10;
                Console.WriteLine("A nota atribuída foi 10!");
            }
            else 
                nota = nota;
        }

        return new Avaliacao(nota);
    }
}

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
1 resposta
solução!

Olá Luís.
Você não está necessariamente cometendo uma má prática ao fazer a validação dentro do método estático Parse, mas há algumas observações importantes sobre responsabilidade, previsibilidade e boas práticas de design que podem te ajudar a entender os impactos da sua abordagem.
O que está funcionando bem no seu código:

  • A validação de faixa da nota está sendo feita (valores fora de 0–10 são ajustados).
  • O código funciona corretamente nos testes.
  • O método Parse encapsula a lógica de conversão de string para objeto Avaliacao, o que é comum e válido.

Você está validando/ajustando a nota tanto no construtor quanto no método Parse.
Isso pode parecer inofensivo agora, mas viola o princípio DRY (Don't Repeat Yourself).
Além disso, se alguém no futuro modificar a regra de validação só no construtor, o Parse pode gerar resultados inconsistentes.
Concentre a lógica de validação em um único lugar, preferencialmente no construtor.
O método Parse faz algo que o nome não sugere: além de converter a string em Avaliacao, ele imprime mensagens no console e altera o valor da nota silenciosamente.
Isso é um pouco surpreendente para quem usa o método esperando apenas a conversão.
Métodos de parsing devem ser previsíveis.
Se o valor for inválido, ou:

  • Você lança uma exceção (FormatException, ArgumentOutOfRangeException), ou
  • Você retorna um valor ajustado, mas sem efeito colateral (sem Console.WriteLine dentro de uma biblioteca, por exemplo).

Inserir Console.WriteLine dentro de uma classe de modelo (Avaliacao) acopla lógica de domínio com lógica de apresentação (UI), o que dificulta testes automatizados e a reutilização do código (por exemplo, em um app web ou API).
Exponha o problema (por exemplo, retornando a nota corrigida ou uma flag), e deixe quem chamou o método decidir se imprime algo no console.
Aqui vai uma sugestão refatorada:

namespace ScreenSound.Modelos;

internal class Avaliacao
{
    public int Nota { get; }

    public Avaliacao(int nota)
    {
        Nota = CorrigirNota(nota);
    }

    private static int CorrigirNota(int nota)
    {
        if (nota < 0) return 0;
        if (nota > 10) return 10;
        return nota;
    }

    public static Avaliacao Parse(string texto)
    {
        int nota = int.Parse(texto);
        int notaCorrigida = CorrigirNota(nota);

        if (nota != notaCorrigida)
        {
            Console.WriteLine($"Nota ajustada para {notaCorrigida}!");
        }

        return new Avaliacao(notaCorrigida);
    }
}
  • Centraliza a validação na função CorrigirNota.
  • O construtor garante que toda nota criada estará válida.
  • O método Parse ainda imprime a mensagem, mas agora de forma justificada e clara.
  • Está mais fácil de manter e testar.
    Concluindo:
    Não é exatamente uma má prática, mas sim uma escolha que pode gerar problemas de manutenção e previsibilidade no futuro.
    Seu código está funcional, mas com pequenos ajustes de design, ele pode ficar mais robusto, reutilizável e fácil de entender.
    Analisa todos estes pontos e me retorna um feedback.
    Comente ai qualquer duvida.
    Bons estudos.