Skip to content

Commit 4f4cb1d

Browse files
committed
30 - js - SOLID DIP
1 parent beefd0f commit 4f4cb1d

File tree

1 file changed

+159
-0
lines changed

1 file changed

+159
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
/*
2+
_____________________________________
3+
https://github.com/kenysdev
4+
2024 - JavaScript
5+
_______________________________________________________
6+
#30 SOLID: PRINCIPIO DE INVERSIÓN DE DEPENDENCIAS (DIP)
7+
-------------------------------------------------------
8+
* EJERCICIO:
9+
 * Explora el "Principio SOLID de Inversión de Dependencias (Dependency Inversion
10+
 * Principle, DIP)" y crea un ejemplo simple donde se muestre su funcionamiento
11+
 * de forma correcta e incorrecta.
12+
 *
13+
 * DIFICULTAD EXTRA (opcional):
14+
 * Crea un sistema de notificaciones.
15+
 * Requisitos:
16+
 * 1. El sistema puede enviar Email, PUSH y SMS (implementaciones específicas).
17+
 * 2. El sistema de notificaciones no puede depender de las implementaciones específicas.
18+
 * Instrucciones:
19+
 * 1. Crea la interfaz o clase abstracta.
20+
 * 2. Desarrolla las implementaciones específicas.
21+
 * 3. Crea el sistema de notificaciones usando el DIP.
22+
 * 4. Desarrolla un código que compruebe que se cumple el principio.
23+
*/
24+
// ________________________________________________________
25+
// SIN APLICAR DIP
26+
// ---------------
27+
// Clase concreta
28+
class FileStorage_ {
29+
save(data) {
30+
console.log(`Datos guardados en archivo: ${data}`);
31+
}
32+
}
33+
34+
// Clase de alto nivel
35+
class DataManager_ {
36+
constructor() {
37+
// Dependencia directa de la clase concreta.
38+
this.fileStorage = new FileStorage_();
39+
}
40+
41+
storeData(data) {
42+
this.fileStorage.save(data);
43+
}
44+
}
45+
46+
// ________________________________________________________
47+
// APLICANDO DIP
48+
// ---------------
49+
// Abstracción
50+
class AbcStorage {
51+
save(data) {
52+
throw new Error("El método 'save' debe ser implementado.");
53+
}
54+
}
55+
56+
// Implementación concreta
57+
class FileStorage extends AbcStorage {
58+
save(data) {
59+
console.log(`Guardado en archivo: ${data}`);
60+
}
61+
}
62+
63+
// Implementación concreta
64+
class DatabaseStorage extends AbcStorage {
65+
save(data) {
66+
console.log(`Guardado en base de datos: ${data}`);
67+
}
68+
}
69+
70+
// Clase de alto nivel
71+
class DataManager {
72+
constructor(storage) {
73+
// Dependencia de la abstracción
74+
if (!(storage instanceof AbcStorage)) {
75+
throw new Error("La dependencia debe implementar AbcStorage");
76+
}
77+
this.storage = storage;
78+
}
79+
80+
storeData(data) {
81+
this.storage.save(data);
82+
}
83+
}
84+
85+
// Uso
86+
const dataToStore = "Ejemplo de datos x";
87+
const fileStorage = new FileStorage();
88+
const dataManagerFile = new DataManager(fileStorage);
89+
dataManagerFile.storeData(dataToStore);
90+
const databaseStorage = new DatabaseStorage();
91+
const dataManagerDatabase = new DataManager(databaseStorage);
92+
dataManagerDatabase.storeData(dataToStore);
93+
94+
// ________________________________________________________
95+
// DIFICULTAD EXTRA
96+
// ----------------
97+
98+
// Abstracción
99+
class AbcMessageService {
100+
send(to, message) {
101+
throw new Error("El método 'send' debe ser implementado.");
102+
}
103+
}
104+
105+
// Implementación: Email
106+
class EmailService extends AbcMessageService {
107+
send(to, message) {
108+
console.log("Correo enviado a:", to);
109+
console.log("Mensaje:", message);
110+
}
111+
}
112+
113+
// Implementación: PUSH
114+
class PUSHService extends AbcMessageService {
115+
send(to, message) {
116+
console.log("Notificación PUSH enviada a:", to);
117+
console.log("Mensaje:", message);
118+
}
119+
}
120+
121+
// Implementación: SMS
122+
class SMSService extends AbcMessageService {
123+
send(to, message) {
124+
console.log("Mensaje SMS enviado a:", to);
125+
console.log("Mensaje:", message);
126+
}
127+
}
128+
129+
// Módulo de alto nivel
130+
class NotificationSystem {
131+
constructor(service) {
132+
if (!(service instanceof AbcMessageService)) {
133+
throw new Error("La dependencia debe implementar AbcMessageService");
134+
}
135+
this.service = service;
136+
}
137+
138+
notify(to, message) {
139+
this.service.send(to, message);
140+
}
141+
}
142+
143+
// Inyección de dependencias
144+
function testNotificationSystem(to, message, service) {
145+
const serviceNotifier = new NotificationSystem(service);
146+
serviceNotifier.notify(to, message);
147+
}
148+
149+
console.log("\nDIFICULTAD EXTRA");
150+
151+
// Asignación
152+
const emailService = new EmailService();
153+
const pushService = new PUSHService();
154+
const smsService = new SMSService();
155+
156+
// Comprobación:
157+
testNotificationSystem("[email protected]", "abcdsf", emailService);
158+
testNotificationSystem("user01", "123456", pushService);
159+
testNotificationSystem(123456789, "aeiou", smsService);

0 commit comments

Comments
 (0)