Singleton vs inyeccion de dependencias
lunes, mayo 19, 2008 at 8:14PM A travéz de DZONE he visto el siguiente blog:
<a href="http://googletesting.blogspot.com/2008/05/tott-using-dependancy-injection-to.html">TotT: Using Dependancy Injection to Avoid Singletons</a>
Su idea es dejar de usar el Singleton y usar inyección de dependencias.
Es decir no debemos tener cosas como Service.getIntance() sino que debemos substituirlo por un constructor ( o un método "set") con un parámetro que sea la instancia del servicio.
Llevo unos cuantos años oyendo este tipo de cosas, sobre todo desde que se puso de moda <a href="TotT: Using Dependancy Injection to Avoid Singletons">Spring</a> y creo que va contra uno de los paradigmas mas importantes de la programación: La encapsulación.
Una de las ideas fundamentales de la encapsulación es ocultar los detalles internos referidos a la implementación y que además son subcestibles de ser cambiados.
Pués bien,vamos a poner un ejemplo en la que la inyección de dependencias no ayuda para nada a la encapsulación.
Imaginamos una clase llamada "NotificaciónNomina" esta clase se usa en una aplicación bancaria para notificar a los clientes cuando les llega la nómina. Actualmente mi banco me ofrece la posibilidad de notificarme mediante un SMS. De esta forma la clase necesitaría del servicio de envios de SMS.
public class NotificaciónNomina
private SMSSender smsSender;
public void setSMSSender(SMSSender smsSender) {
this.smsSender= smsSender
}
public void notificarNomina(String idCliente) {
this.smsSender.sendSMS(...,idCliente,.....)
}
}
¿Que pasa ahora si mi banco quiere ahorrase el dinero del SMS y ahora lo quiere hacer por Email?
Tengo que eliminar el método setSMSSender y añadir setMailSender.Como todos sabemos no se deben cambiar los métodos públicos de una clase si solo modificamos su implementación, pero además ¿por qué alguien que ve el JavaDoc de la clase tiene que saber si uso Email o SMS? ¿A quien le importan los servicios que necesita una clase para hacer su trabajo? Si una clase necesitan de 20 servicios, ¿debe tener 20 métodos setXXXXX?.
Para acabar se puede argumentar que usar inyección de dependencias hace que sea mas cómodo cambiar de una implementación a otra del servicio pq la configuración está en un XML , pero: ¿no puede Service.getIntance() hacer lo mismo e ir a buscar la información a un XML?
otro 
Reader Comments