Skip to content

Commit dd2be53

Browse files
#29 - javascript
1 parent f28b8e4 commit dd2be53

File tree

1 file changed

+181
-0
lines changed

1 file changed

+181
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
//#29 - Principio SOLID de Segregación de Interfaces (Interface Segregation Principle (ISP))
2+
/*
3+
* EJERCICIO:
4+
* Explora el "Principio SOLID de Segregación de Interfaces (Interface Segregation Principle, ISP)", y crea un ejemplo
5+
* simple donde se muestre su funcionamiento de forma correcta e incorrecta.
6+
*
7+
* DIFICULTAD EXTRA (opcional):
8+
* Crea un gestor de impresoras.
9+
* Requisitos:
10+
* 1. Algunas impresoras sólo imprimen en blanco y negro.
11+
* 2. Otras sólo a color.
12+
* 3. Otras son multifunción, pueden imprimir, escanear y enviar fax.
13+
* Instrucciones:
14+
* 1. Implementa el sistema, con los diferentes tipos de impresoras y funciones.
15+
* 2. Aplica el ISP a la implementación.
16+
* 3. Desarrolla un código que compruebe que se cumple el principio.
17+
*/
18+
//Bibliografy: The Web Development Glossary (Jens Oliver Meiert) (Z-Library)
19+
//GPT
20+
21+
/* Interface Segregation Principle
22+
The principle that no client should be forced to depend on methods it does
23+
not use. ISP splits interfaces that are very large into smaller and more
24+
specific ones so that clients will only have to know about the methods that
25+
are of interest to them. Such shrunken interfaces are also called role
26+
interfaces. ISP is intended to keep a system decoupled and thus easier to
27+
refactor, change, and redeploy. */
28+
29+
let log = console.log;
30+
31+
window.addEventListener('load', ()=>{
32+
const body = document.querySelector('body');
33+
const title = document.createElement('h1');
34+
35+
body.style.setProperty('background', '#000');
36+
body.style.setProperty('text-align', 'center');
37+
38+
title.textContent = 'Retosparaprogramadores #29.';
39+
title.style.setProperty('font-size', '3.5vmax');
40+
title.style.setProperty('color', '#fff');
41+
title.style.setProperty('line-height', '100vh');
42+
43+
body.appendChild(title);
44+
45+
setTimeout(()=>{
46+
alert('Retosparaprogramadores #29. Please open the Browser Developer Tools.');
47+
}, 2000);
48+
log( 'Retosparaprogramadores #29');
49+
});
50+
51+
// Incorrect Example
52+
class PaymentService {
53+
processCreditCardPayment(amount) {}
54+
processPayPalPayment(amount) {}
55+
processBitcoinPayment(amount) {}
56+
}
57+
58+
class CreditCardPayment extends PaymentService {
59+
processCreditCardPayment(amount) {
60+
log(`Processing credit card payment of ${amount}`);
61+
}
62+
63+
processPayPalPayment(amount) {
64+
throw new Error("This payment method does not support PayPal payments");
65+
}
66+
67+
processBitcoinPayment(amount) {
68+
throw new Error("This payment method does not support Bitcoin payments");
69+
}
70+
}
71+
72+
class PayPalPayment extends PaymentService {
73+
processCreditCardPayment(amount) {
74+
throw new Error("This payment method does not support credit card payments");
75+
}
76+
77+
processPayPalPayment(amount) {
78+
log(`Processing PayPal payment of ${amount}`);
79+
}
80+
81+
processBitcoinPayment(amount) {
82+
throw new Error("This payment method does not support Bitcoin payments");
83+
}
84+
}
85+
86+
class BitcoinPayment extends PaymentService {
87+
processCreditCardPayment(amount) {
88+
throw new Error("This payment method does not support credit card payments");
89+
}
90+
91+
processPayPalPayment(amount) {
92+
throw new Error("This payment method does not support PayPal payments");
93+
}
94+
95+
processBitcoinPayment(amount) {
96+
log(`Processing Bitcoin payment of ${amount}`);
97+
}
98+
}
99+
100+
101+
const creditCardPayment = new CreditCardPayment();
102+
creditCardPayment.processCreditCardPayment(250); // Processing credit card payment of 250
103+
//creditCardPayment.processPayPalPayment(87); // This will throw an error
104+
//Error: This payment method does not support PayPal payments at CreditCardPayment.processPayPalPayment
105+
106+
// Correct Example
107+
class CreditCardPaymentService {
108+
processCreditCardPayment(amount) {
109+
log(`Processing credit card payment of ${amount}`);
110+
}
111+
}
112+
113+
class PayPalPaymentService {
114+
processPayPalPayment(amount) {
115+
log(`Processing PayPal payment of ${amount}`);
116+
}
117+
}
118+
119+
class BitcoinPaymentService {
120+
processBitcoinPayment(amount) {
121+
log(`Processing Bitcoin payment of ${amount}`);
122+
}
123+
}
124+
125+
126+
const creditCardPayment1 = new CreditCardPaymentService();
127+
creditCardPayment1.processCreditCardPayment(400); // Processing credit card payment of 400
128+
129+
const payPalPayment = new PayPalPaymentService();
130+
payPalPayment.processPayPalPayment(130); // Processing PayPal payment of 130
131+
132+
const bitcoinPayment = new BitcoinPaymentService();
133+
bitcoinPayment.processBitcoinPayment(0.020); // Processing Bitcoin payment of 0.02
134+
135+
136+
//Extra Dificulty Exercise
137+
138+
class BlackAndWhitePrinter{
139+
print(doc){
140+
log(`Printing: ${doc} in Black & White`);
141+
}
142+
}
143+
144+
class ColorPrinter{
145+
print(doc){
146+
log(`Printing: ${doc} in Color`);
147+
}
148+
}
149+
150+
class MultiFunctionPrinter{
151+
152+
printInBlackAndWhite(doc){
153+
log(`Printing: ${doc} in Black & White`);
154+
}
155+
156+
print(doc){
157+
log(`Printing: ${doc} in Color`);
158+
}
159+
160+
fax(doc){
161+
log(`Faxing: ${doc}`);
162+
}
163+
164+
scan(doc){
165+
log(`Scanning: ${doc}`);
166+
}
167+
}
168+
169+
let book = 'vuelointemporal.odt';
170+
171+
const bw_printer = new BlackAndWhitePrinter();
172+
bw_printer.print(book); // Printing: vuelointemporal.odt in Black & White
173+
174+
const c_printer = new ColorPrinter();
175+
c_printer.print(book); // vuelointemporal.odt in Color
176+
177+
const m_printer = new MultiFunctionPrinter();
178+
m_printer.printInBlackAndWhite(book); // vuelointemporal.odt in Black & White
179+
m_printer.print(book); // Printing: vuelointemporal.odt in Color
180+
m_printer.fax(book); // Faxing: vuelointemporal.odt
181+
m_printer.scan(book); // Scanning: vuelointemporal.odt

0 commit comments

Comments
 (0)