Você estaria violando o princípio DRY, colocando essa lógica de validação em todos os lugares onde um código postal é usado.
Por outro lado, ao lidar com muitos países diferentes e seus diferentes sistemas de CEP, isso significa que você não pode validar um CEP, a menos que conheça o país em questão. Então seuZipCode
turma também precisa armazenar o país.
Mas você armazena separadamente o país como parte do Address
(do qual o CEP também faz parte) e parte do CEP (para validação)?
- Se o fizer, você também está violando o DRY. Mesmo que você não a chame de violação DRY (porque cada instância tem uma finalidade diferente), ainda assim é desnecessário ocupar memória extra, além de abrir a porta para erros quando os valores dos dois países forem diferentes (o que eles logicamente nunca deveriam estar).
- Ou, como alternativa, você precisará sincronizar os dois pontos de dados para garantir que eles sejam sempre os mesmos, o que sugere que você realmente deve armazenar esses dados em um único ponto de qualquer maneira, derrotando o objetivo.
- Caso contrário, não é uma
ZipCode
classe, mas uma Address
classe, que novamente conterá uma string ZipCode
que significa que fizemos um círculo completo.
Por exemplo, posso conversar com um analista de negócios sobre um Código Postal em vez de uma string que contém um código postal.
O benefício é que você pode falar sobre eles ao descrever o modelo de domínio.
Não entendo sua afirmação subjacente de que, quando uma informação tem um tipo de variável, você é obrigado a mencionar esse tipo sempre que estiver conversando com um analista de negócios.
Por quê? Por que você não consegue simplesmente falar sobre "o CEP" e omitir completamente o tipo específico? Que tipo de discussão você está tendo com o seu analista de negócios (não técnico!), Onde o tipo de propriedade é essencial para a conversa?
De onde eu sou, os códigos postais são sempre numéricos. Portanto, temos uma escolha, podemos armazená-lo como um int
ou como string
. Nós tendemos a usar uma string porque não há expectativa de operações matemáticas nos dados, mas nunca um analista de negócios me disse que precisava ser uma string. Essa decisão é deixada para o desenvolvedor (ou possivelmente para o analista técnico, embora, na minha experiência, eles não lidem diretamente com o âmago da questão).
Um analista de negócios não se importa com o tipo de dados, desde que o aplicativo faça o que é esperado.
A validação é uma besta complicada de enfrentar, porque depende do que os humanos esperam.
Por um lado, não concordo com o argumento da validação como uma maneira de mostrar por que a obsessão primitiva deve ser evitada, porque não concordo que (como uma verdade universal) os dados sempre precisem ser validados o tempo todo.
Por exemplo, e se for uma pesquisa mais complicada? Em vez de uma simples verificação de formato, e se a sua validação envolver entrar em contato com uma API externa e aguardar uma resposta? Deseja realmente forçar seu aplicativo a chamar essa API externa para cada ZipCode
objeto que você instancia?
Talvez seja um requisito comercial estrito e, é claro, justificável. Mas isso não é uma verdade universal. Existem muitos casos de uso em que isso é mais um fardo do que uma solução.
Como segundo exemplo, ao inserir seu endereço em um formulário, é comum inserir seu código postal antes do seu país. Embora seja bom ter um feedback de validação imediato na interface do usuário, seria realmente um obstáculo para mim (como usuário) se o aplicativo me alertasse para um formato de código postal "errado", porque a fonte real do problema é (por exemplo) meu país não é o país selecionado por padrão e, portanto, a validação ocorreu para o país errado.
É a mensagem de erro errada, que distrai o usuário e causa confusão desnecessária.
Assim como a validação perpétua não é uma verdade universal, nem são meus exemplos. É contextual . Alguns domínios de aplicativo exigem validação de dados acima de tudo. Outros domínios não colocam uma validação tão alta na lista de prioridades porque o aborrecimento que ele traz consigo entra em conflito com as prioridades reais (por exemplo, experiência do usuário ou a capacidade de armazenar inicialmente dados com defeito para que possam ser corrigidos, em vez de nunca permitir que sejam). armazenado)
Data de nascimento: verifique se é maior que mindate e menor que a data de hoje.
Salário: verifique se é maior ou igual a zero.
O problema com essas validações é que elas são incompletas, redundantes ou indicativas de um problema muito maior .
Verificar se uma data é maior que o mindate é redundante. O mindate significa literalmente que é a menor data possível. Além disso, onde você desenha a linha de relevância? Qual é o sentido de impedir, DateTime.MinDate
mas permitir DateTime.MinDate.AddSeconds(1)
? Você está escolhendo um valor específico que não está particularmente errado em comparação com muitos outros valores.
Meu aniversário é 2 de janeiro de 1978 (não é, mas vamos supor que seja). Mas digamos que os dados em seu aplicativo estejam incorretos e, em vez disso, diga que meu aniversário é:
- 1 de janeiro de 1978
- 1 de janeiro de 1722
- 1 de janeiro de 2355
Todas essas datas estão erradas. Nenhum deles é "mais correto" que o outro. Mas sua regra de validação captaria apenas um desses três exemplos.
Você também omitiu completamente o contexto de como está usando esses dados. Se isso for usado, por exemplo, em um lembrete de aniversário, eu diria que a validação é inútil, pois não há conseqüências ruins em particular no preenchimento da data errada.
Por outro lado, se este é dados do governo e você precisa da data de nascimento para a identidade de alguém autenticar (e não fazê-lo leva a conseqüências ruins, por exemplo, negando alguém da segurança social), então a correção dos dados é fundamental e você precisa totalmente validar os dados. A validação proposta que você tem agora não é adequada.
Para um salário, existe algum senso comum de que ele não pode ser negativo. Mas se você realisticamente espera que dados sem sentido estejam sendo inseridos, sugiro que você investigue a fonte desses dados sem sentido. Porque se eles não podem confiar em inserir dados sensoriais, você também não pode confiar neles para inserir dados corretos .
Se, em vez disso, o salário for calculado pelo seu aplicativo e, de alguma forma, for possível acabar com um número negativo (e correto), então uma abordagem melhor seria fazer Math.Max(myValue, 0)
com que os números negativos fossem 0, em vez de falhar na validação. Como se sua lógica decidir que o resultado é um número negativo, falhar na validação significa que terá que refazer o cálculo e não há razão para pensar que ele apresentará um número diferente na segunda vez.
E se surgir um número diferente, isso levará você a suspeitar que o cálculo não é consistente e, portanto, não pode ser confiável.
Isso não quer dizer que a validação não seja útil. Mas a validação inútil é ruim, tanto porque exige esforço e não soluciona realmente um problema, como proporciona às pessoas uma falsa sensação de segurança.