Estaría rompiendo el principio DRY poniendo esa lógica de validación en todas partes donde se usa un código postal.
Por otro lado, cuando se trata con muchos países diferentes y sus diferentes sistemas de códigos postales, eso significa que no puede validar un código postal a menos que conozca el país en cuestión. Por lo tanto, su ZipCode
clase también debe almacenar el país.
Pero, ¿almacena por separado el país como parte del Address
código postal (del que también forma parte el código postal) y parte del código postal (para la validación)?
- Si lo haces, también estás violando DRY. Incluso si no lo llama una violación SECA (porque cada instancia tiene un propósito diferente), todavía está ocupando innecesariamente memoria adicional, además de abrir la puerta a los errores cuando los valores de los dos países son diferentes (que lógicamente nunca deberían ser).
- O, alternativamente, hace que necesite sincronizar los dos puntos de datos para asegurarse de que siempre sean los mismos, lo que sugiere que de todos modos realmente debería almacenar estos datos en un solo punto, lo que anula el propósito.
- Si no lo hace, entonces no es una
ZipCode
clase sino una Address
clase, que nuevamente contendrá una string ZipCode
que significa que hemos cerrado el círculo.
Por ejemplo, puedo hablar con un analista de negocios sobre un código postal en lugar de una cadena que contiene un código postal.
El beneficio es que puede hablar sobre ellos al describir el modelo de dominio.
No entiendo su afirmación subyacente de que cuando una información tiene un tipo de variable dado, de alguna manera está obligado a mencionar ese tipo cada vez que habla con un analista de negocios.
¿Por qué? ¿Por qué no puede simplemente hablar sobre "el código postal" y omitir completamente el tipo específico? ¿Qué tipo de discusiones está teniendo con su analista de negocios (no técnico) donde el tipo de propiedad es la esencia de la conversación?
De donde soy, los códigos postales son siempre numéricos. Entonces tenemos una opción, podríamos almacenarlo como un int
o como un string
. Tendemos a usar una cadena porque no se esperan operaciones matemáticas en los datos, pero nunca un analista de negocios me dijo que tenía que ser una cadena. Esa decisión se deja en manos del desarrollador (o posiblemente el analista técnico, aunque en mi experiencia no tratan directamente con el meollo del asunto).
Un analista de negocios no se preocupa por el tipo de datos, siempre que la aplicación haga lo que se espera que haga.
La validación es una bestia difícil de abordar, porque se basa en lo que los humanos esperan.
Por un lado, no estoy de acuerdo con el argumento de validación como una forma de mostrar por qué se debe evitar la obsesión primitiva, porque no estoy de acuerdo en que (como una verdad universal) los datos siempre deben validarse en todo momento.
Por ejemplo, ¿qué pasa si esta es una búsqueda más complicada? En lugar de una simple verificación de formato, ¿qué sucede si su validación implica contactar a una API externa y esperar una respuesta? ¿Realmente desea obligar a su aplicación a llamar a esta API externa para cada ZipCode
objeto que cree una instancia?
Tal vez es un requisito comercial estricto, y luego, por supuesto, es justificable. Pero esta no es una verdad universal. Habrá muchos casos de uso donde esto es más una carga que una solución.
Como segundo ejemplo, al ingresar su dirección en un formulario, es común ingresar su código postal antes de su país. Si bien es bueno tener comentarios de validación inmediata en la interfaz de usuario, en realidad sería un obstáculo para mí (como usuario) si la aplicación me alertara de un formato de código postal "incorrecto", porque la fuente real del problema es (por ejemplo) que mi país no es el país seleccionado de forma predeterminada y, por lo tanto, la validación se realizó para el país incorrecto.
Es el mensaje de error incorrecto, que distrae al usuario y causa confusión innecesaria.
Al igual que la validación perpetua no es una verdad universal, tampoco lo son mis ejemplos. Es contextual . Algunos dominios de aplicación requieren validación de datos por encima de todo. Otros dominios no colocan la validación tan arriba en la lista de prioridades porque la molestia que conlleva entra en conflicto con sus prioridades reales (por ejemplo, la experiencia del usuario o la capacidad de almacenar inicialmente datos defectuosos para que puedan corregirse en lugar de nunca permitir que sean almacenado)
Fecha de nacimiento: verifique que sea mayor que mindate y menor que la fecha de hoy.
Salario: verifique que sea mayor o igual que cero.
El problema con estas validaciones es que son incompletas, redundantes o indican un problema mucho mayor .
Comprobar que una fecha es mayor que la fecha mínima es redundante. La fecha mínima literalmente significa que es la fecha más pequeña posible. Además, ¿dónde trazas la línea de relevancia? ¿De qué sirve prevenir?DateTime.MinDate
pero permitir DateTime.MinDate.AddSeconds(1)
? Estás seleccionando un valor particular que no es particularmente incorrecto en comparación con muchos otros valores.
Mi cumpleaños es el 2 de enero de 1978 (no lo es, pero supongamos que sí). Pero digamos que los datos en su aplicación son incorrectos, y en cambio dice que mi cumpleaños es:
- 1 de enero de 1978
- 1 de enero de 1722
- 1 de enero de 2355
Todas estas fechas están mal. Ninguno de ellos tiene "más razón" que el otro. Pero su regla de validación solo atraparía uno de estos tres ejemplos.
También ha omitido por completo el contexto de cómo está utilizando estos datos. Si esto se usa, por ejemplo, en un bot de recordatorio de cumpleaños, diría que la validación no tiene sentido ya que no hay ninguna consecuencia negativa particular al completar la fecha incorrecta.
Por otro lado, si se trata de datos del gobierno y lo que necesita la fecha de nacimiento de la identidad de alguien autenticar (y el no hacerlo conduce a malas consecuencias, por ejemplo, que niegan la seguridad social a alguien), entonces la exactitud de los datos es de suma importancia y lo que necesita totalmente validar los datos. La validación propuesta que tiene ahora no es adecuada.
Para un salario, hay algo de sentido común en que no puede ser negativo. Pero si realmente espera que se ingresen datos sin sentido, le sugiero que investigue la fuente de estos datos sin sentido. Porque si no se puede confiar en que ingresen datos sensibles, tampoco puede confiar en ellos para que ingresen datos correctos .
Si, en cambio, su aplicación calcula el salario, y de alguna manera es posible terminar con un número negativo (y correcto), entonces un mejor enfoque sería Math.Max(myValue, 0)
convertir los números negativos en 0, en lugar de fallar la validación. Porque si su lógica decidió que el resultado es un número negativo, no aprobar la validación significa que tendrá que rehacer el cálculo, y no hay razón para pensar que saldrá con un número diferente la segunda vez.
Y si aparece un número diferente, eso nuevamente lo lleva a sospechar que el cálculo no es consistente y, por lo tanto, no se puede confiar.
Esto no quiere decir que la validación no sea útil. Pero la validación sin sentido es mala, tanto porque requiere esfuerzo sin resolver realmente un problema, y da a las personas una falsa sensación de seguridad.