Skip to content

Commit 000ecc6

Browse files
authored
Merge pull request mouredev#6262 from santyjL/main
#28 - Python
2 parents f969195 + a063f6f commit 000ecc6

File tree

2 files changed

+313
-0
lines changed

2 files changed

+313
-0
lines changed
+122
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
#28 SOLID: PRINCIPIO DE SUSTITUCIÓN DE LISKOV (LSP)
2+
"""
3+
/*
4+
* EJERCICIO:
5+
* Explora el "Principio SOLID de Sustitución de Liskov (Liskov Substitution Principle, LSP)"
6+
* y crea un ejemplo simple donde se muestre su funcionamiento
7+
* de forma correcta e incorrecta.
8+
*
9+
* DIFICULTAD EXTRA (opcional):
10+
* Crea una jerarquía de vehículos. Todos ellos deben poder acelerar y frenar, así como
11+
* cumplir el LSP.
12+
* Instrucciones:
13+
* 1. Crea la clase Vehículo.
14+
* 2. Añade tres subclases de Vehículo.
15+
* 3. Implementa las operaciones "acelerar" y "frenar" como corresponda.
16+
* 4. Desarrolla un código que compruebe que se cumple el LSP.
17+
*/
18+
"""
19+
20+
'''
21+
La L de SOLID alude al apellido de quien lo creó, Barbara Liskov, y dice que “las clases derivadas
22+
deben poder sustituirse por sus clases base”.
23+
'''
24+
25+
#Mal uso
26+
class Ave:
27+
def volar(self):
28+
return "El ave está volando"
29+
30+
class Pinguino(Ave):
31+
def volar(self):
32+
# Los pingüinos no pueden volar, pero al ser una subclase de Ave,
33+
# nos vemos obligados a implementar este método de una forma ilógica.
34+
raise Exception("Los pingüinos no pueden volar")
35+
36+
# Función que espera cualquier ave
37+
def mover_ave(ave: Ave):
38+
return ave.volar()
39+
40+
# Creamos un objeto de la clase Pinguino
41+
pinguino = Pinguino()
42+
43+
# Intentamos volar con el pingüino, pero causa un error
44+
print(mover_ave(pinguino)) # Error: Los pingüinos no pueden volar
45+
46+
#Buen uso
47+
class Ave:
48+
def mover(self):
49+
return "El ave se está moviendo"
50+
51+
class AveVoladora(Ave):
52+
def volar(self):
53+
return "El ave está volando"
54+
55+
class Pinguino(Ave):
56+
def mover(self):
57+
return "El pingüino está nadando"
58+
59+
class Aguila(AveVoladora):
60+
def volar(self):
61+
return "El águila está volando alto"
62+
63+
# Función que puede aceptar cualquier tipo de ave para moverse
64+
def mover_ave(ave: Ave):
65+
return ave.mover()
66+
67+
# Función específica para aves voladoras
68+
def volar_ave(ave: AveVoladora):
69+
return ave.volar()
70+
71+
# Creamos un pingüino y un águila
72+
pinguino = Pinguino()
73+
aguila = Aguila()
74+
75+
# Llamamos a la función mover para ambas aves
76+
print(mover_ave(pinguino)) # Salida: El pingüino está nadando
77+
print(mover_ave(aguila)) # Salida: El ave se está moviendo
78+
79+
# Llamamos a la función volar solo para aves voladoras
80+
print(volar_ave(aguila)) # Salida: El águila está volando alto
81+
82+
#Extra
83+
class Vehiculo:
84+
def acelerar():
85+
return f"El Vehiculo esta Acelerando"
86+
87+
def frenar():
88+
return f"El vehiculo esta Frenando"
89+
90+
class Moto(Vehiculo):
91+
def acelerar():
92+
return f"La Moto esta Acelerando"
93+
94+
def frenar():
95+
return f"La Moto esta Frenando"
96+
97+
class Carro(Vehiculo):
98+
def acelerar():
99+
return f"El Carro esta Acelerando"
100+
101+
def frenar():
102+
return f"El Carro esta Frenando"
103+
104+
class Bus(Vehiculo):
105+
def acelerar():
106+
return f"El Bus esta Acelerando"
107+
108+
def frenar():
109+
return f"El Bus esta Frenando"
110+
111+
moto = Moto
112+
carro = Carro
113+
bus = Bus
114+
115+
print(moto.acelerar())
116+
print(moto.frenar())
117+
118+
print(carro.acelerar())
119+
print(carro.frenar())
120+
121+
print(bus.acelerar())
122+
print(bus.frenar())
+191
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
#29 SOLID: PRINCIPIO DE SEGREGACIÓN DE INTERFACES (ISP)
2+
3+
"""
4+
/*
5+
* EJERCICIO:
6+
* Explora el "Principio SOLID de Segregación de Interfaces (Interface Segregation Principle, ISP)"
7+
* y crea un ejemplo simple donde se muestre su funcionamiento de forma correcta e incorrecta.
8+
*
9+
* DIFICULTAD EXTRA (opcional):
10+
* Crea un gestor de impresoras.
11+
* Requisitos:
12+
* 1. Algunas impresoras sólo imprimen en blanco y negro.
13+
* 2. Otras sólo a color.
14+
* 3. Otras son multifunción, pueden imprimir, escanear y enviar fax.
15+
* Instrucciones:
16+
* 1. Implementa el sistema, con los diferentes tipos de impresoras y funciones.
17+
* 2. Aplica el ISP a la implementación.
18+
* 3. Desarrolla un código que compruebe que se cumple el principio.
19+
*/
20+
"""
21+
from abc import ABC, abstractmethod
22+
23+
24+
# Interfaces pequeñas y específicas para cada tipo de vehículo
25+
class VehiculoTerrestre(ABC):
26+
@abstractmethod
27+
def conducir(self):
28+
pass
29+
30+
class VehiculoAereo(ABC):
31+
@abstractmethod
32+
def volar(self):
33+
pass
34+
35+
class VehiculoAcuatico(ABC):
36+
@abstractmethod
37+
def navegar(self):
38+
pass
39+
40+
# Clase Coche que solo necesita implementar la interfaz de Vehículo Terrestre
41+
class Coche(VehiculoTerrestre):
42+
def conducir(self):
43+
print("El coche está conduciendo.")
44+
45+
# Clase Avión que solo implementa la interfaz de Vehículo Aéreo
46+
class Avion(VehiculoAereo):
47+
def volar(self):
48+
print("El avión está volando.")
49+
50+
# Clase Barco que solo implementa la interfaz de Vehículo Acuático
51+
class Barco(VehiculoAcuatico):
52+
def navegar(self):
53+
print("El barco está navegando.")
54+
55+
# Crear instancias de los vehículos
56+
coche = Coche()
57+
avion = Avion()
58+
barco = Barco()
59+
60+
# Usar los métodos según las interfaces implementadas
61+
coche.conducir() # Salida: El coche está conduciendo.
62+
avion.volar() # Salida: El avión está volando.
63+
barco.navegar() # Salida: El barco está navegando.
64+
65+
#mal uso
66+
# Interfaz general que agrupa todas las funcionalidades para vehículos
67+
class Vehiculo(ABC):
68+
@abstractmethod
69+
def conducir(self):
70+
pass
71+
72+
@abstractmethod
73+
def volar(self):
74+
pass
75+
76+
@abstractmethod
77+
def navegar(self):
78+
pass
79+
80+
# Clase Coche que no necesita volar ni navegar, pero debe implementar los métodos
81+
class Coche(Vehiculo):
82+
def conducir(self):
83+
print("El coche está conduciendo.")
84+
85+
def volar(self):
86+
raise NotImplementedError("El coche no puede volar.") # Error
87+
88+
def navegar(self):
89+
raise NotImplementedError("El coche no puede navegar.") # Error
90+
91+
# Clase Avión que no necesita conducir ni navegar, pero debe implementar los métodos
92+
class Avion(Vehiculo):
93+
def conducir(self):
94+
raise NotImplementedError("El avión no puede conducir.") # Error
95+
96+
def volar(self):
97+
print("El avión está volando.")
98+
99+
def navegar(self):
100+
raise NotImplementedError("El avión no puede navegar.") # Error
101+
102+
# Clase Barco que no necesita conducir ni volar, pero debe implementar los métodos
103+
class Barco(Vehiculo):
104+
def conducir(self):
105+
raise NotImplementedError("El barco no puede conducir.") # Error
106+
107+
def volar(self):
108+
raise NotImplementedError("El barco no puede volar.") # Error
109+
110+
def navegar(self):
111+
print("El barco está navegando.")
112+
113+
coche = Coche()
114+
avion = Avion()
115+
barco = Barco()
116+
117+
# Usar los métodos según la interfaz grande
118+
coche.conducir() # Funciona correctamente: "El coche está conduciendo."
119+
coche.volar() # Error: El coche no puede volar.
120+
coche.navegar() # Error: El coche no puede navegar.
121+
122+
avion.volar() # Funciona correctamente: "El avión está volando."
123+
avion.conducir() # Error: El avión no puede conducir.
124+
avion.navegar() # Error: El avión no puede navegar.
125+
126+
barco.navegar() # Funciona correctamente: "El barco está navegando."
127+
barco.volar() # Error: El barco no puede volar.
128+
barco.conducir() # Error: El barco no puede conducir.
129+
130+
""" !!!EXTRA¡¡¡ """
131+
132+
# Interfaces (Clases Abstractas)
133+
class ImpresoraBlancoNegroInterfaz(ABC):
134+
@abstractmethod
135+
def impresion_en_blanco_y_negro(self):
136+
pass
137+
138+
class ImpresoraColorInterfaz(ABC):
139+
@abstractmethod
140+
def impresion_a_color(self):
141+
pass
142+
143+
class EscanerInterfaz(ABC):
144+
@abstractmethod
145+
def escanear(self):
146+
pass
147+
148+
class EnviarFaxInterfaz(ABC):
149+
@abstractmethod
150+
def enviar_fax(self):
151+
pass
152+
153+
# Clases concretas
154+
class ImpresoraBlancoNegro(ImpresoraBlancoNegroInterfaz):
155+
def impresion_en_blanco_y_negro(self):
156+
print("Se está imprimiendo el documento en blanco y negro")
157+
158+
class ImpresoraColor(ImpresoraColorInterfaz):
159+
def impresion_a_color(self):
160+
print("Se está imprimiendo el documento a color")
161+
162+
class ImpresoraMultifuncional(ImpresoraColorInterfaz, ImpresoraBlancoNegroInterfaz,
163+
EscanerInterfaz, EnviarFaxInterfaz):
164+
165+
def impresion_a_color(self):
166+
print("Se está imprimiendo el documento a color")
167+
168+
def impresion_en_blanco_y_negro(self):
169+
print("Se está imprimiendo el documento en blanco y negro")
170+
171+
def enviar_fax(self):
172+
print("La impresora está enviando un Fax")
173+
174+
def escanear(self):
175+
print("La impresora está escaneando para sacarle copia al documento")
176+
177+
# Crear instancias de las clases
178+
impresora_blanco_y_negro = ImpresoraBlancoNegro()
179+
impresora_color = ImpresoraColor()
180+
impresora_multifuncional = ImpresoraMultifuncional()
181+
182+
# Ejecución del código
183+
print("\nImpresora a color e impresora en blanco y negro:")
184+
impresora_blanco_y_negro.impresion_en_blanco_y_negro()
185+
impresora_color.impresion_a_color()
186+
187+
print("\nImpresora Multifuncional:")
188+
impresora_multifuncional.impresion_a_color()
189+
impresora_multifuncional.impresion_en_blanco_y_negro()
190+
impresora_multifuncional.enviar_fax()
191+
impresora_multifuncional.escanear()

0 commit comments

Comments
 (0)