Validar os dados do construtor

votos
3

Uma classe de exemplo em C # Classe Desing Handbook (pg 137) não chama o método de validação classes por um campo específico de dentro das classes somente construtor. Então, basicamente a classe de amostra permite que você crie um objeto com dados ruins e só gera um erro para que os dados quando você chamar a propriedade do campo que faz a validação sobre ele, então. Então, agora você tem um objeto ruim e não ele sabe até depois do fato.

Eu nunca entendi por que eles não apenas chamar a propriedade do construtor jogando assim um erro imediatamente se dados ruins é encontrado durante a inicialização? Eu lhes enviei um email sem sucesso ...

Eu costumo usar o seguinte formato chamando minhas propriedades dos meus construtores - é esta estrutura adequada para validar dados de inicialização? ty

class Foo
{
    private string _emailAddress;

    public Foo(string emailAddress)
    {
        EmailAddress = emailAddress;
    }

    public string EmailAddress
    {
        get { return _emailAddress; }
        set
        {
            if (!ValidEmail(value))
                throw new ArgumentException
                    (string.Format
                    (Email address {0} is in wrong format, 
                    value));

            _emailAddress = value;
        }
    }


    private static bool ValidEmail(string emailAddress)
    {
        return Regex.IsMatch
            (emailAddress, @\b[A-Z0-9._%+-]+ +
                           @@[A-Z0-9.-]+\.[A-Z]{2,4}\b,
                           RegexOptions.IgnoreCase);
    }
}
Publicado 26/08/2009 em 23:59
fonte usuário
Em outras línguas...                            


5 respostas

votos
2

Não faz sentido para mim para não validar os dados no construtor. Como salienta, o objeto pode acabar em um estado inválido. Dado este design, você nem sequer perceber que você tinha dados errados ao chamar o getter.

Para qualquer coisa de complexidade moderada ou superior, que tendem a usar um Broken Rules aproximar em vez de imediatamente lançar uma exceção. Nesse enfoque, eu definir um objeto BrokenRules que contém informações sobre a classe e propriedade que é inválido, ea razão que é inválido. Então, em uma classe base comum, eu definir uma lista para manter uma lista de tudo "errado" sobre o objeto. Uma propriedade (novamente na classe base) IsValid indica se existem presentemente quaisquer regras quebradas.

A vantagem desta é que não poderia ser várias coisas erradas com o estado do objeto. Se um usuário está sendo solicitado para corrigir os problemas (ou seja, este objecto é definido a partir de uma interface do usuário), fornecendo uma lista de todos os problemas permite que o usuário corrigi-los de uma só vez, em vez de fixar um erro apenas para ser dito que não é outro. E um outro. Etc.

Respondeu 27/08/2009 em 00:07
fonte usuário

votos
2

Sim, se sua abordagem geral é:

Certifique-se que você só pode obter uma instância de um validobjeto

em seguida, eu adoro isso.

Construtores deve ser usado para criar objetos que são imediatamente válida, para não criar apenas um 'recipiente', para que as coisas para ser colocado em.

Respondeu 27/08/2009 em 00:03
fonte usuário

votos
2

Bem, para um, você é provável começar a NullReferenceException temida, desde que você não está verificando se emailAddress é nula em qualquer nível. Isso cheque especial deve ser feito no próprio construtor, e se emailAddress é nulo, lançar um ArgumentNullException. Quanto ao resto, não vejo qualquer problema particular com ele, como está escrito na sua amostra. No entanto, existem alguns problemas que podem surgir se você tornar a propriedade virtual, e derivar as crianças dessa classe. ordem de execução de inicialização do campo, base e consturctors classe derivada, em seguida, se torna um problema, e você tem que ter cuidado.

Respondeu 27/08/2009 em 00:03
fonte usuário

votos
0

a validação está acontecendo quando o endereço de e-mail está definido. Este é o lugar onde você quer que ele porque o endereço de e-mail poderia ser definido novamente mais tarde.

Se você também chamado de validação no construtor, você estaria fazendo, uma chamada de validação redundante adicional (uma vez quando construída, outra quando o endereço de e-mail está definido no construtor).

Respondeu 27/08/2009 em 00:04
fonte usuário

votos
0

Não vejo nada de errado com esta abordagem. Você pode chamar métodos nesta dentro do construtor, e setters de propriedade / getters são apenas açúcar sintático para chamadas de método.

Respondeu 27/08/2009 em 00:03
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more