2011-01-20 8 views
8

He escrito C# y el mantra que viene de lo alto parece ser "nunca usar reflejo en el código de producción". Lo he usado para el código de prueba, pero nunca nada que se ejecute en la naturaleza. Todos los argumentos parecen razonables, y siempre hay una forma de hacerlo agregando otra capa de abstracción o patrón de diseño o lo que sea.¡Nunca use reflejo en el código de producción! ¿Qué hay de Python?

Ahora estoy empezando a escribir un código Python serio, me pregunto si se aplica el mismo principio. Parece que Python está diseñado con la reflexión en mente. Los módulos y las clases almacenan miembros en un diccionario de fácil acceso. Las clases meta de los modelos de Django, por ejemplo, toman cadenas para hacer referencia a los miembros.

Podría escribir C#/Java en Python pero realmente no quiero. Todavía creo firmemente en 'no hay reflexión' para dichos idiomas. ¿La forma de Python es fundamentalmente diferente?

+1

Esto es curioso, porque Reflection se usa tanto en bibliotecas .NET y de terceros, que "no utilizar la reflexión" significaría "no usar .NET". – Euphoric

+0

Sí, .NET usa la reflexión para hacer todo tipo de cosas. Pero otro de los principios era 'trust .NET y otras bibliotecas para hacer lo que prometen'. Lo cual está bien si te apegas a bibliotecas bien probadas. Deberíamos preocuparnos principalmente por los errores en nuestro propio código. – Joe

+0

Creo que esto se puede decir sobre cualquier pieza de tecnología, no solo Reflection. Mientras sepa lo que está haciendo y conozca sus altibajos, no encontraré una razón para no usarlo. – Euphoric

Respuesta

17

Como un lenguaje dinámico Python es fundamentalmente diferente de las lenguas tipos estáticos, así que todo es reflejo en él :-) También Nunca utilizar la reflexión en el código de producción (para lenguajes estáticos) parece un poco extremo para mí.

+4

de acuerdo. Decir _never_ usar algo y en su lugar perder el tiempo con muchos códigos de depuración/reestructuración de código en lugar de utilizar la funcionalidad integrada me parece un poco tonto. Por supuesto, si es posible, es mejor evitar la reflexión, pero no siempre. – Rob

+0

Sé que este es un comentario antiguo, pero estoy de acuerdo. Además, nunca utilizar el reflejo en el código de producción sensible al tiempo es nuestro mantra. La reflexión en .net es muy lenta. – Justin

6

Creo que el "no reflejo en el código de producción" no es correcto en C#.
La reflexión a menudo permite que el programador haga cosas imposibles.
Yo diría "no hay reflejo para los miembros no públicos en el código de producción" y "¡use la reflexión con cuidado!" si no se usa correctamente, puede perder rendimiento. Si se usa correctamente, puede hacer que gane rendimiento (solo piense en la reflexión estática) No utilice la reflexión para el código llamado masivamente.
Python en cambio es un lenguaje dinámico. Todos los conceptos son diferentes. La normalidad (y la forma correcta de hacerlo) es usar las técnicas de las que está hablando.

+0

¿Qué quiere decir con "reflexión estática", nemenos? – Nickolodeon

+0

De una manera muy rápida para explicarlo, es una forma de recopilar información recopilada por reflexión. De esta forma, paga el costo de la reflexión solo una vez, y el resultado compilado es casi tan rápido como el código puramente compilado. – nemenos

0

IMO El motivo por el que evito usar el reflejo en el código de producción es el hecho de que la reflexión podría dificultar el mantenimiento y la depuración del código.

+0

Si está lleno de reflejos, seguro. Para algo así como una fábrica de objetos o un mapa de estructura, no estoy del todo de acuerdo. – Rob

+0

@Rob: ¡eso es seguro! – ykatchou

0

La reflexión es una tecnología muy avanzada y potente. Pero es lento. Puede usar la reflexión, pero no a menudo. Entonces los desarrolladores de CLR agregaron un tipo más genial a .NET 4.0 - tipo dinámico. Le recomiendo que consulte algunos documentos o libros para obtener más información. F.e. CLR a través de C#.

dynamic a = SomeFooInterface.GetsomeObjectWithUnknownInterface(); 
// returns object, for example, from another assembly. or some unknown instance. 
// But you know that there is method int GetValue() inside. 
// So you can call this method without any casts! 
int myValue = a.GetValue(); 
// This method is much faster then reflection! 

CLR a través de C#:

También hay muchas ocasiones en las que un programa tiene que actuar sobre la información que que no sabe nada hasta que esté en funcionamiento . Aunque se puede usar idiomas con seguridad de tipos programación (como C#) para interactuar con esta información, la sintaxis tiende a ser torpe, especialmente ya que tienden a trabajar mucho con cuerdas, y el rendimiento se ve obstaculizada también. Si está escribiendo una aplicación C# pura, entonces la única ocasión que tiene para trabajar con información determinada por el tiempo de ejecución es cuando está utilizando la reflexión (discutida en Capítulo 23). Sin embargo, muchos desarrolladores también usan C# para comunicarse con los componentes que no están implementados en C#. Algunos de estos componentes podrían ser .idiomas NET-dinámico como Python o Ruby, o los objetos COM que apoyan la interfaz IDispatch (posiblemente implementados en C nativa o C++), o documento HTML Object Model (DOM) objetos (implementado usando varios idiomas y tecnologías). La comunicación con objetos HTML DOM es particularmente útil al compilar una aplicación de Microsoft Silverlight. Para hacer que sea más fácil para los desarrolladores que usan reflejo o comunicarse con otros componentes , el compilador C# le ofrece una forma de marcar el tipo de una expresión como dinámica. También puede poner el resultado de una expresión en una variable y puede marcar el tipo de una variable como dinámica. Esta expresión/variable dinámica se puede usar para invocar un miembro como un campo, un propietario/indexador , un método, un delegado, y operadores unarios/binarios/de conversión. Cuando su código invoca a un miembro que usa una expresión/variable dinámica, el compilador genera el código IL especial que describe la operación deseada. Este código especial se conoce como la carga útil. En tiempo de ejecución, el código de carga útil determina la operación exacta a ejecutar en función del tipo real de el objeto al que hace referencia la expresión/variable dinámica .

+0

Gracias por eso. Podrías haber dicho "CLR a través de la página X de C#", ¡tengo una copia aquí! Esta pregunta, sin embargo, se trata de Python no C#. – Joe

+0

La cita es para alguien que no pudo tener la copia. Y escribiste que puedes usar otro idioma, así que decidí aconsejarte C# de vuelta :). –

+0

> // ¡Este método es mucho más rápido que el reflejo! Divertido, porque la única manera de ejecutar código como este en el tipo estático es usar la reflexión. – Euphoric

2

Sí, en ese aspecto, Python Desarrollos es fundametally diferente.

La reflexión en C#/Java se refiere a la capacidad del tiempo de ejecución para saber cosas sobre el código que se está ejecutando y para tomar decisiones basadas en esa información.

Desde Python usa tipado dinámico, cualquier descubrimiento tipo se delega en el tiempo de ejecución y no el tiempo de compilación, así que básicamente eso significa, que cualquier programa Python debe utilizar la reflexión con el fin de trabajar, sólo que se no se llama reflejo, que es llamado ejecutar el programa :)
Además, la filosofía de Python abarca la naturaleza dinámica de la ejecución, por lo que no debe dudar en utilizarla para su ventaja.

P.S. Si bien uno debe evitar el uso de la reflexión en bucles apretados, y uno debe saber que la reflexión es uno o dos órdenes de magnitud más lenta, no debe temer usarla cuando es la herramienta adecuada para el trabajo.

+0

Buena respuesta. Pero hay una diferencia entre decir 'myobject.foo()' y 'x = getattr (myobject," foo "); x(); '. Incluso si es solo cosmético. En el primero, 'foo()' se compila de forma estática. En el segundo, la secuencia podría ser producida de muchas maneras. – Joe

+1

Eh, potato/solanum tuberosum ... en python, niether está compilado estáticamente, por lo que son más o menos equivalentes. – SWeko

Cuestiones relacionadas