Inyectar Servicios vs instanciarlo como Objeto!

55 views
Skip to first unread message

csal...@paradigmadigital.com

unread,
Jan 30, 2019, 7:15:58 AM1/30/19
to symfony-es
Hola a todos..
PREGUNTA:
      estoy en un proyecto donde inyectamos servicios y tiene todo el sentido hacerlo..

Pero esta  esta situación!

  Tenemos una clase AClass que puede estar declarada como un servicio por ejemplo, por lo que se injecta a muchos otros servicios que la requieren--
Pero esta AClass puede ser instanciada como new AClass(); ya que no tiene dependencias de ningun tipo ni parámetros adicionales en el constructor y hace lo que debe.. En cualquier caso si es inyectada como servicio pasandola en el yml como
arguments:
    - '@method.AClass'

Funciona exactamente igual que hacerlo  con 
             $aClass = new AClass();

Entonces Existe alguna Relacion de Rendimiento es mejor Pasarlo como servicio? porque no se instancia mas veces una vez que esta disponible! almenos eso creo que debe pasar!!, y con la relacion de Instanciar con "new"  es crear mas espacio de memoria para el objeto en cada servicio que lo implmenta!!! si se invocan 3 o 5 servicio que lo usan serian 5 instancias tambien de ese objeto .... En cambio si es inyectado entonces será sólo una con un consumo menor de memoria vamos lo que consuma(n) lo(s) servicio(s) .... Es correcto esto!? Algun Gurú del symfony (que espero llegar a ser yo tambien algún día) que me pueda responder.!?

Gracias!!!

Listero Absoluto

unread,
May 3, 2019, 11:06:22 PM5/3/19
to symfo...@googlegroups.com
Hola!

Cuando empezas a usar un contenedor de dependencias y comprendes sus ventajas vas a odiar la palabra NEW.
La ventaja tiene más que ver con diseño que con performance. Pero empecemos por performance. El contenedor puede configurarse para que siempre retorne (a partir de su primer uso, es lo que se llama Lazy Loading, si no se necesita no se crea) una única instancia de tu servicio (lo podes pensar como un singleton) y eso está perfecto cuando se trata de servicios, dado que no deberían mantener un estado. Con estado me refiero tener datos en sus propiedades, porque si los tuviera, tu singleton no se diferenciaría de una variable global, con todos los problemas que eso conlleva.
Al ser un singleton solo reserva memoria para esa única instancia, que podrá ser compartida como dependencia por varios servicios como bien mencionas.
En cuando a diseño la ventaja es muy grande utilizando el contenedor vs el uso de new. Suponete que tu AClass está instanciada en esos 3 o 5 servicios, y llegado un punto en tu desarrollo necesitas pasarle una dependencia. Inevitablemente deberás buscar cada una de esas instanciaciones y modificarlas. Y eso si tenes un acceso sencillo a esa dependencia.
Además, más allá de que sea solo una línea, estarías duplicando código, atandolo a una implementación puntual de AClass.
Lo que te recomiendo es que uses (y pienses) al contenedor de dependencias como una fabrica de objetos, de esa manera invertis la creación (buscá sobre Inversión de control que es un concepto relacionado al contenedor de dependencias).
Incluso si querés ir más allá, podrías extraer AClass a un interface AClassInterface, de esa manera cualquier necesidad de cambio de implementación sería tan simple como cambiar una configuración del contenedor sin tener que cambiar código.

Entonces pasando en limpio:
1 - No utilizar NEW en servicios, delegar la creación al contenedor de dependencias siempre.
2 - Los servicios no deben tener estado
3 - Pensar en abstracciones en lugar de clases concretas.
4 - Los gurús no existen

Saludos.
Gastón.

--
--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Google Groups.
Para publicar en este grupo, envía un email a symfo...@googlegroups.com
Para darte de baja, envía un email a symfony-es+...@googlegroups.com
El resto de opciones puedes encontrarlas en http://groups.google.com/group/symfony-es?hl=es

---
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a symfony-es+...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.


--
Saludos y gracias.
Reply all
Reply to author
Forward
0 new messages