Espero que veas el problema que estoy describiendo en el siguiente escenario. Si no está claro, házmelo saber.¿Dónde se realiza la validación?
Tienes una aplicación que se ha roto en tres capas,
- frontal capa de interfaz de usuario final, podría ser formulario web asp.net, o ventana (utilizado para los datos persona edición)
- nivel medio de servicios de negocios capa, compilado en una DLL (PersonServices) capa de acceso
- datos, recopilados en un archivo DLL (PersonRepository)
En mi extremo delantero, que quieren crear un nuevo objeto persona, establecer algún properti es, como FirstName, LastName según lo que un usuario haya ingresado en la UI, y llame a PersonServices.AddPerson, pasando a la persona recién creada. (AddPerson no tiene que ser estático, esto es solo por simplicidad, en cualquier caso el AddPerson eventualmente llamará a AddPerson del Repositorio, que luego persistirá en los datos.)
Ahora la parte que me gustaría escuchar su la opinión es validación En algún momento, esa persona recién creada necesita ser validada. Puede hacerlo desde el lado del cliente, lo que sería simple, pero ¿qué ocurre si quiero validar la persona en mi método PersonServices.AddPerson? Esto garantizaría que cualquier persona que quiera guardar sea validada y elimina cualquier dependencia en la capa de interfaz de usuario que hace el trabajo. O tal vez, valide tanto en la interfaz de usuario como en la capa de servidor empresarial. ¿Suena bien hasta ahora, verdad?
Así, por simplicidad, voy a actualizar el método PersonService.AddPerson para realizar las siguientes comprobaciones de validación - Compruebe si nombre y apellido no están vacíos - Asegurar esta nueva persona no existe ya en mi repositorio
Y este método devolverá True si toda la validación se aprueba y persiste la persona, False si la Validación falla o si la Persona no se conserva.
Pero este valor booleano que devuelve AddPerson no es suficiente para mí en la capa UI para darle al usuario un motivo claro por el que falló el proceso de guardar. Entonces, ¿qué hace un desarrollador solitario? En última instancia, me gustaría que el método AddPerson sea capaz de garantizar que lo que está a punto de guardar sea válido, y si no, ser capaz de comunicar las razones por las que no es inválido para mi capa de UI.
Solo para que fluya tu jugo, algunas formas de resolverlo podrían ser: (Algunas de estas soluciones, en mi opinión, apestan, pero solo las pongo allí para que entiendas lo que estoy intentando para resolver)
En lugar de addPerson devolver un valor lógico, puede devolver un int (es decir, 0 = éxito, distinto de cero es igual a fracaso y el número indica la razón por la que falló.
En addPerson, lanzar excepciones personalizadas cuando la validación falla. Cada tipo de excepción personalizada tendría su propio mensaje de error. Además, cada excepción personalizada w Ould ser lo suficientemente única para coger en la capa de interfaz de usuario
Tienes addPerson regresar algún tipo de clase personalizada que tendría propiedades que indican si la validación superado o no, y si se omitió, ¿cuáles fueron las razones
- No
Asegúrese de que esto se pueda hacer en VB o C#, pero adjunte algún tipo de propiedad a la Persona y sus propiedades subyacentes.Esta propiedad "adjunto" podría contener cosas como información de validación
Inserte su idea o patrón aquí
Y tal vez otro aquí
Disculpas por la cuestión de largo aliento, pero Definitivamente me gusta escuchar tu opinión sobre esto.
Gracias!
¿Qué hay de la capacidad de prueba? Considere un ejemplo artificial, que es una versión simplificada de lo que había visto en una aplicación no relacionada. "Shopping.com" crea cupones/promociones en su sitio web con su aplicación web interna "Genie" . El promo genie más corto puede crear será válido durante 6 horas después de su publicación. Para crear (no publicar) una promoción, genie realiza una llamada api que envía el expiryDateTime, , entre otras cosas, al back-end. Tenga en cuenta que la regla de negocios de 6 horas no se puede cambiar por algunas buenas razones ..... (refiérase al siguiente comentario) – testerjoe2
En genie, queremos PRUEBA si se muestra un cuadro de mensaje debajo de la promoción cuando caduque. Pensé en el impacto en las pruebas cuando utilizamos los dos enfoques de diseño a continuación para crear promociones: *** ONE *** - La IU comprueba si el tiempo de expiración es de al menos 6 horas o más desde la hora actual y menos de un mes . Luego pasa, expiryDateTime para back-end. - Backend solo comprueba si expiryDateTime está entre la hora actual y un mes. *** DOS *** - Controles de back-end si el expiryDateTime es entre 6 horas a partir de ahora y un mes ..... (refiérase al comentario siguiente) – testerjoe2
Prueba en los dos enfoques - *** ONE ** * - Use la llamada api para ejecutar el servidor para establecer expiryDateTime a unos minutos de la hora actual. *** DOS *** - Envíe una llamada de API al backend y espere 6 horas para probar el vencimiento. O bien, golpee la capa de la base de datos directamente y cambie expiryDateTime allí, si está permitido. – testerjoe2