que necesita para trabajar en una aplicación que consta de dos partes principales:¿Es una buena práctica usar la reflexión en la lógica de su negocio?
- La parte lógica de negocio con clases específicas de negocio (por ejemplo, libro, biblioteca, Autor, ...)
- Una parte genérica que puede mostrar libros, bibliotecas, ... en cuadrículas de datos, asignarlas a una base de datos, ...).
La pieza genérica utiliza la reflexión para sacar los datos de las clases de negocio sin la necesidad de escribir una grilla de datos o lógica de base de datos específica en las clases de negocio. Esto funciona bien y nos permite agregar nuevas clases de negocios (por ejemplo, LibraryMember) sin la necesidad de ajustar la cuadrícula de datos y la lógica de la base de datos.
Sin embargo, a lo largo de los años, se ha agregado un código a las clases de negocios que también utiliza la reflexión para hacer las cosas en las clases de negocios. P.ej. si se cambia el autor de un libro, se llama a los observadores para que le digan al autor que debe agregar este libro a su colección de libros escritos por él (Author.Books). En estos observadores, no solo se pasan las instancias, sino también la información que se deriva directamente de la reflexión (FieldInfo se agrega a la llamada del observador para que la persona que llama sepa que el campo "Autor" del libro se ha modificado).
Puedo ver claramente las ventajas de usar la reflexión en estos módulos genéricos (como la cuadrícula de datos o la interfaz de la base de datos), pero me parece que usar el reflejo en las clases de negocios es una mala idea. Después de todo, ¿no debería funcionar la aplicación sin depender de la reflexión tanto como sea posible? ¿O es el uso de la reflexión la "forma normal de trabajar" en el siglo XXI?
¿Es una buena práctica usar la reflexión en la lógica de su negocio?
EDITAR: Algunas aclaraciones sobre el comentario de Kirk:
- Imagínese que Autor implementa un observador en el libro.
- Libro llama a todos sus observadores cuando algún campo de libro cambia (como Título, Año, #Páginas, Autor, ...). El 'FieldInfo' del campo cambiado se pasa en el observador.
- El Autor-observador luego usa este FieldInfo para decidir si le interesa este cambio. En este caso, si FieldInfo es para el campo Autor del libro, el autor-observador actualizará su propio vector de libros.
Usted dice que se pasa el 'FieldInfo', pero no veo que explique cómo se usa. Concretamente, (aparte de pasar las clases de información, que es relativamente inocua) ¿cómo se usa la reflexión? –
¿Lo usa como la interfaz INotifyPropertyChanged (generalmente se usa en aplicaciones WPF para el enlace de datos)? ¿Subir evento cada vez que se estableció la propiedad, con el nombre de la propiedad? –
@Amittai: No, es una implementación más bien personalizada y muy específica que utiliza la reflexión. – Patrick