🧱 Programando con Objetos: Dependencias
En esta serie sobre Programación Orientada a Objetos, hemos explorado varios conceptos clave. Hoy, nos sumergiremos en el mundo del manejo de dependencias, un aspecto crucial para escribir código limpio y mantenible.
¿Por Qué Importan las Dependencias?
Las dependencias son objetos que otro objeto necesita para funcionar correctamente. Por ejemplo, en nuestro caso, el objeto Payment
depende del objeto Gateway
para procesar pagos. Un manejo adecuado de estas dependencias aumenta la modularidad y la facilidad de prueba de nuestro código.
Métodos para Manejar Dependencias
Exploraremos cuatro métodos comunes a través de los cuales Payment puede acceder a Gateway, cada uno con sus propias ventajas y posibles inconvenientes.
📋 Diferentes Maneras desde Payment para Acceder a una Instancia de Gateway
🏷 Instanciación Directa
class Payment
{
private gateway: Gateway;
public someMethod(): void
{
this.gateway = new Gateway(); // Payment crea una instancia de Gateway cuando es necesario.
this.gateway.process('...');
}
}
- Ventajas: Simplicidad y facilidad de uso.
- Desventajas: Alta dependencia y dificultad para probar.
🏷 Mediante un Service Locator
class Payment
{
private gateway: Gateway;
public someMethod(): void
{
this.gateway = ServiceLocator.get(Gateway); // Payment obtiene una instancia de Gateway de una ubicación conocida mediante nuestro servicio que se encarga de obtenerla.
this.gateway.process('...');
}
}
- Ventajas: Flexibilidad y reutilización.
- Desventajas: Acoplamiento al localizador de servicios.
🏷 Inyección en el Constructor
class Payment
{
private gateway: Gateway;
public construct(gateway: Gateway)
{
this.gateway = gateway; // Una instancia de Gateway se proporciona como un argumento del constructor.
}
public someMethod(): void
{
this.gateway.process('...');
}
}
- Ventajas: Facilita las pruebas y reduce el acoplamiento.
- Desventajas: Puede complicar la creación de instancias si hay muchas dependencias.
🏷 Inyección a través de Argumentos de Método
class Payment
{
public someMethod(gateway: Gateway): void
{
gateway.process('...');
}
}
- Ventajas: Flexibilidad y control fino de las dependencias por cada método.
- Desventajas: Necesidad de pasar dependencias en cada llamada de método.
Reflexiones Finales
Mientras que la localización de servicios se conoce como service location
, obtener dependencias a través de constructores o métodos se llama dependency injection
. En futuras lecciones, profundizaremos en qué método es más adecuado según diferentes escenarios.
En nuestra próxima lección, nos adentraremos en uno de los pilares fundamentales de la Programación Orientada a Objetos: la herencia. Exploraremos cómo la herencia permite crear jerarquías de clases y cómo facilita la reutilización y extensión del código. ¡Nos vemos en la próxima lección!