Merida Design Blog

Publicado el | Artículos / , ,

S.O.L.I.D. Principios de programación orientada a objetos: Inversión de dependencia

El principio de Inversión de Dependencia establece lo siguiente:

Las entidades deben depender de abstracciones, no concretos. Un módulo de alto nivel no debe depender del módulo de bajo nivel, pero ambos deben depender de una abstracción.

Suena confuso, pero en realidad no es tan difícil de comprender, básicamente se refiere a que las clases no deben depender de otras clases directamente, si no que ambas clases deben depender de una abstracción (interfaz) que les permita interactuar sin problemas, obteniendo con esto un mayor desacoplamiento entre los módulos.

Veamos un ejemplo para aclarar más el concepto:

class PasswordReminder {
    private $dbConnection;
		
    public function __construct(MySQLConnection $dbConnection) {
        $this->dbConnection = $dbConnection
    }
}

Como podemos ver, la clase PasswordReminder (módulo de alto nivel) depende directamente de la clase MySQLConnection (módulo de bajo nivel) para establecer una conexión a la base de datos.

Que pasaría entonces si queremos implementar el módulo PasswordReminder pero en esta ocasión con un motor de base de datos distinto, por supuesto no sería posible ya que depende de una conexión de tipo MySQL lo que va en contra del principio de inversión de dependencia y tendrías que modificar la clase PasswordReminder y eso violaría el principio de Abierto/Cerrado.

Debería ser posible usar la clase PasswordReminder sin importar que tipo de motor de base de datos uses, así que para arreglar esto necesitamos crear una interfaz de la que van a depender los módulos de alto y bajo nivel (PasswordReminder y MySQLConnection respectivamente).

interface DBConnectionInterface {
    public function connect();
}

Ahora la clase MySQLConnection puede implementar esta interfaz y en la clase PasswordReminder en lugar de especificar la conexión de tipo MySQLConnection le decimos que sea del tipo DBConnectionInterface y podrá conectarse sin importar que tipo de motor de base de datos se use, y de esta forma ya no se viola ninguno de los principios que mencioné anteriormente.

class MySQLConnection implements DBConnectionInterface {
    public function connect() {
        return "Conexión a la base de datos";
    }
}
	
class PasswordReminder {
    private $dbConnection;
		
    public function __construct(DBConnectionInterface $dbConnection) {
        $this->dbConnection = $dbConnection;
    }
}

Como puedes ver, ahora ambas clases dependen de una abstracción.

Conclusión

Para se sinceros, S.O.L.I.D. al principio puede parecer complicado, pero una vez que lo empleas continuamente se vuelve parte de tu proceso mental y el código que escribes se vuelve fácil de mantener, extender, probar y refactorizar sin ningún problema.



Publicaciones que pueden interesarte

    Deja un comentario

      tope
    Derechos Reservados, Merida Design 2017
    %d bloggers like this: