Skip to content

Commit 80b8137

Browse files
committed
#29 - python
1 parent 4dfd04e commit 80b8137

File tree

1 file changed

+191
-0
lines changed

1 file changed

+191
-0
lines changed
+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)