inversion-of-control - ioc - inyeccion de dependencias c#
¿Cuáles son los pros y los contras para usar un contenedor de IOC? (7)
Bueno, supongo que una estafa que he experimentado es que algunos desarrolladores no parecen ser capaces de comprender IoC. Hemos tenido algunas personas que estaban en contra de ella sin más motivo que el hecho de que no las entendieron. (No decir que es una mala razón para estar en contra de algo, en absoluto.)
Añade un poco de abstracción que siempre parece lograrse para confundir a alguien, pero diría que los pros superan a los inconvenientes en la mayoría de los casos.
Usar un contenedor de IOC disminuirá la velocidad de su aplicación porque la mayoría de ellos usa la reflexión debajo del capó. También pueden hacer que su código sea más difícil de entender (?). En el lado brillante; te ayudan a crear aplicaciones más flexibles y te hacen las pruebas unitarias más fáciles. ¿Hay otros pros y contras para usar / no usar un contenedor de IOC?
Creo que es justo decir que si tiene una comprensión experta de cómo usar el COI y tiende a escribir un buen código de todos modos, el COI hará que su código sea más fácil de entender en todos los sistemas, excepto en los más pequeños.
Sin embargo, si está trabajando en un lugar donde la mayoría de las clases / métodos son muy grandes y el concepto de refactorización aún no se ha establecido, entonces tratar de usar un IOC es probable que dificulte la comprensión del software. El COI también debe ser apoyado por todos los que programan el proyecto, por lo que puede ser una consideración.
Veo al COI como la guinda del pastel; Me gusta la guinda pero solo en un buen pastel. Si el pastel no es bueno para empezar, primero ordena el pastel.
En cuanto a la sobrecarga de rendimiento del uso de IOC, no veo esto como un problema en la mayoría de los casos. La sobrecarga no necesita ser grande, y dada la velocidad de la CPU actual, la mayor parte del tiempo de ejecución probablemente sea acceso a datos de todos modos. Si un IOC demostró ser más lento para un determinado bit de código, me gustaría añadir algo de almacenamiento en caché del objeto devuelto, o eliminar el IOC solo de ese bit de código.
Creo que la suposición sobre la reducción de la velocidad de ejecución es muy similar al argumento de que "C es más rápido que C # / Java". Si bien esta afirmación puede ser cierta para operaciones específicas y / o tareas estructuralmente simples, no es el caso en el momento en que aumenta la complejidad.
La forma en que DI-frameworks te permite enfocarte en la creación de objetos y dependencias crea sistemas más eficientes cuando aumenta el tamaño del código. Para aplicaciones grandes, estoy casi seguro de que el código basado en DI-DI superará a cualquier solución alternativa. ¡Simplemente hay tan poca redundancia en el tiempo de ejecución que es difícil hacerlo más eficiente! La mayor parte de la sobrecarga adicional también es solo a primera carga.
Los contenedores DI avanzados también te permiten hacer magia de "alcance" con la que solo puedes soñar sin el contenedor. Usando scope-proxies, spring puede hacer lo siguiente:
A Singleton
|
B Singleton
|
C Prototype (per-invocation)
|
D Singleton
|
E Session scope (web app)
|
F Singleton
De hecho, puede tener diez capas de objetos únicos y, de repente, se muestra algo con una sesión con alcance.
Cosas como la seguridad se pueden inyectar de manera totalmente diferente a como lo haría de otra manera. A menudo hay una paradoja clásica: a menudo la capa de GUI necesita tener un conocimiento complejo de los permisos de seguridad. Con bastante frecuencia, la capa de servicios también necesita esto, pero a menudo con un nivel de detalle diferente (por lo general, menos detallado que la interfaz gráfica de usuario). El enfoque clásico sería enviarlo como parámetros, ponerlo en un threadlocal o pedir un servicio. Con la primavera, puede inyectarlo directamente donde lo necesita y nadie más necesita saberlo.
Esto realmente cambia el desarrollo de la aplicación como un todo. Me costó mucho adaptarme a esto, pero después de este dolor, veo que está mucho más cerca de cómo deberían ser las cosas (en lugar de cómo hemos aprendido a hacerlo).
Por lo tanto, creo que los marcos DI tienen el potencial de cambiar la forma en que se crean los programas, con implicaciones mucho más amplias que solo DI. No es solo una forma glorificada de llamar a alguien nuevo .
En la mayoría de las circunstancias, ni siquiera notarías la penalización de rendimiento, ya que para los objetos "únicos" toda la inicialización se realiza una sola vez. También argumentaría que IoC hace que sea diferente entender el código: por el contrario, el desarrollo de estilo IoC te obliga a crear clases pequeñas y coherentes, que a su vez son más fáciles de asimilar.
Si está escribiendo una aplicación comercial, usar un contenedor de inversión de control e inyección de dependencia (junto con otras prácticas y herramientas ágiles) lo ayudará en términos de productividad y confiabilidad.
Además, su aplicación probablemente pasará la gran mayoría del tiempo de su CPU esperando recursos o esperando interacción humana y sin hacer nada útil. Su aplicación debe tener una gran cantidad de caballos de sobra por unos pocos microsegundos de reflexión.
Si está utilizando un contenedor IOC de manera simple, la reflexión solo se usa al inicio: la aplicación está conectada para comenzar y luego se ejecuta normalmente sin intervención del contenedor. Por supuesto, si está utilizando el COI para resolver dependencias después de que haya empezado a correr, puede ser un poco diferente, aunque aún esperaría que se resolviera con pereza y caché a menos que lo haya configurado para crear nuevas instancias cada una. hora.
En cuanto a hacer que el código sea más difícil de entender, ¡todo lo contrario! Con las dependencias explícitamente indicadas, es mucho más fácil comprender cada componente, y los archivos de configuración dejan en claro cómo se junta toda la aplicación.
Estoy de acuerdo con todas las respuestas hasta ahora.
Lo que me gustaría agregar es que crea un poco de sobrecarga, por lo que no es realmente adecuado para aplicaciones pequeñas.
Las aplicaciones medianas y más grandes se benefician al usar IoC.
También puede consultar esta pregunta para obtener más información sobre los pros y los contras: Castle Windsor ¿Hay algún inconveniente?