-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdependency_inversion_principle.php
57 lines (43 loc) · 1.97 KB
/
dependency_inversion_principle.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/*
*
*
*
*
Dependency inversion principle
Las entidades deben depender de abstracciones no de concreciones. El módulo de alto nivel no debe depender del módulo de bajo nivel, pero deben depender de abstracciones.
Cambiamos ahora el ejemplo por uno relacionado con bases de datos:
class PasswordReminder
{
private $dbConnection;
public function __construct(MySQLConnection $dbConnection)
{
$this->dbConnection = $dbConnection;
}
}
MySQLConnection es el módulo de bajo nivel, mientras que PasswordReminder es de alto nivel. Este ejemplo no respeta el principio SOLID de dependency inversion ya que se está forzando a la clase PasswordReminder a depender en la clase MySQLConnection.
Si después quieres cambiar el motor de base de datos tendrás que cambiar la clase PasswordReminder también, lo que viola el principio open-closed.
A la clase PasswordReminder no debería importarle que base de datos emplea tu aplicación, y para solucionarlo empleamos una interface:
interface DBConnectionInterface
{
public function connect();
}
La interface tiene un método connect y la clase MySQLConnection implementa esta interface. En lugar de hacer type hinting con la clase MySQLConnection en PasswordReminder, lo hacemos con la interface, de forma que no importa el tipo de base de datos que empleemos, que PasswordReminder conectará a la base de datos sin problemas:
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;
}
}
Ahora podemos ver que tanto los niveles altos como los bajos dependen de abstracciones.
*/