No es trampa, pero como cualquier herramienta, debe usarse para lo que se pretende resolver. La reflexión, por definición, le permite inspeccionar y modificar el código a través del código; Si eso es lo que necesita hacer, entonces la reflexión es la herramienta para el trabajo. La reflexión tiene que ver con el metacódigo: el código que se dirige al código (a diferencia del código regular, que se dirige a los datos).
Un ejemplo de buen uso de la reflexión son las clases de interfaz de servicio web genéricas: un diseño típico es separar la implementación del protocolo de la funcionalidad de la carga útil. Entonces tienes una clase (llamémosla T
) que implementa tu carga útil, y otra que implementa el protocolo ( P
). T
es bastante sencillo: para cada llamada que desee hacer, simplemente escriba un método que haga lo que se supone que debe hacer. P
, sin embargo, necesita asignar llamadas de servicio web a llamadas de método. Hacer que este mapeo sea genérico es deseable, ya que evita la redundancia y lo hace P
altamente reutilizable. Reflection proporciona los medios para inspeccionar la clase T
en tiempo de ejecución y llamar a sus métodos basados en cadenas pasadas a P
través del protocolo de servicio web, sin ningún conocimiento de la clase en tiempo de compilaciónT
. Usando la regla 'código sobre código', uno puede argumentar que la clase P
tiene el código en clase T
como parte de sus datos.
Sin embargo.
Reflection también le brinda herramientas para sortear las restricciones del sistema de tipos del lenguaje: en teoría, podría pasar todos los parámetros como tipo object
y llamar a sus métodos a través de reflexiones. Voilà, el lenguaje que se supone que impone una fuerte disciplina de tipeo estático ahora se comporta como un lenguaje tipado dinámicamente con enlace tardío, solo que la sintaxis es mucho más elaborada. Cada instancia de ese patrón que he visto hasta ahora ha sido un truco sucio, e invariablemente, una solución dentro del sistema de tipos de lenguaje habría sido posible, y habría sido más seguro, más elegante y más eficiente en todos los aspectos. .
Existen algunas excepciones, como los controles de la GUI que pueden vincularse a varios tipos de fuentes de datos no relacionadas; exigir que sus datos implementen una determinada interfaz para que pueda vincular los datos no es realista, y tampoco es que el programador implemente un adaptador para cada tipo de fuente de datos. En este caso, usar la reflexión para detectar el tipo de fuente de datos y ajustar el enlace de datos es una opción más útil.