Skip to content

Commit aca40a3

Browse files
authored
Merge pull request mouredev#4939 from bytecodesky/main
#29 - Python
2 parents 2464471 + 2402fa2 commit aca40a3

File tree

1 file changed

+117
-0
lines changed

1 file changed

+117
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
# * EJERCICIO:
2+
# * Explora el "Principio SOLID de Segregación de Interfaces (Interface Segregation Principle, ISP)"
3+
# * y crea un ejemplo simple donde se muestre su funcionamiento de forma correcta e incorrecta.
4+
# *
5+
6+
#El principio de segregación de interfaces establece que un cliente no debe ser forzado a depender de interfaces que no utiliza.
7+
#En otras palabras, no se debe obligar a una clase a implementar interfaces que no necesita.
8+
# En lugar de eso, se deben dividir las interfaces en interfaces más pequeñas y específicas, de modo que las clases solo implementen las interfaces que son de su interés.
9+
#De esta forma, se evita que las clases tengan que implementar métodos que no necesitan, lo que puede llevar a una mayor complejidad y a un código más difícil de mantener.
10+
11+
#ejemplo incorrecto donde se viola el principio de segregación de interfaces
12+
class IShape:
13+
def draw(self):
14+
pass
15+
16+
def calculate_area(self):
17+
pass
18+
19+
class Circle(IShape):
20+
def draw(self):
21+
print("Circle Drawn")
22+
23+
def calculate_area(self):
24+
print("Circle Area Calculated")
25+
26+
class Square(IShape):
27+
def draw(self):
28+
print("Square Drawn")
29+
30+
def calculate_area(self):
31+
print("Square Area Calculated")
32+
33+
#En el ejemplo anterior, la interfaz IShape tiene dos métodos: draw() y calculate_area().
34+
#Las clases Circle y Square implementan esta interfaz, pero no necesitan ambos métodos.
35+
#Circle solo necesita el método draw() y Square solo necesita el método calculate_area().
36+
#Esto viola el principio de segregación de interfaces, ya que las clases están obligadas a implementar métodos que no necesitan.
37+
38+
#ejemplo correcto donde se cumple el principio de segregación de interfaces
39+
class IDrawable:
40+
def draw(self):
41+
pass
42+
43+
class ICalculatable:
44+
def calculate_area(self):
45+
pass
46+
47+
class Circle(IDrawable):
48+
def draw(self):
49+
print("Circle Drawn")
50+
51+
class Square(ICalculatable):
52+
def calculate_area(self):
53+
print("Square Area Calculated")
54+
55+
#En el ejemplo anterior, se han dividido las interfaces en IDrawable e ICalculatable, de modo que las clases solo implementan las interfaces que necesitan.
56+
#Circle implementa la interfaz IDrawable y Square implementa la interfaz ICalculatable,lo que evita que tengan que implementar métodos que no necesitan. Esto cumple con el principio de segregación de interfaces.
57+
58+
# * DIFICULTAD EXTRA (opcional):
59+
# * Crea un gestor de impresoras.
60+
# * Requisitos:
61+
# * 1. Algunas impresoras sólo imprimen en blanco y negro.
62+
# * 2. Otras sólo a color.
63+
# * 3. Otras son multifunción, pueden imprimir, escanear y enviar fax.
64+
# * Instrucciones:
65+
# * 1. Implementa el sistema, con los diferentes tipos de impresoras y funciones.
66+
# * 2. Aplica el ISP a la implementación.
67+
# * 3. Desarrolla un código que compruebe que se cumple el principio.
68+
69+
from abc import ABC, abstractmethod
70+
71+
class Impresora(ABC):
72+
@abstracmethod
73+
def imprimir(self, documento):
74+
pass
75+
76+
class ImpresoraBN(Impresora):
77+
def imprimir(self, documento):
78+
print(f"Se ha impreso el {documento} a blanco y negro")
79+
80+
class ImpresoraColor(Impresora):
81+
def imprimir(self, documento):
82+
print(f"Se ha impreso el {documento} a color")
83+
84+
class ImpresoraMul(Impresora):
85+
def imprimir(self, documento):
86+
print(f"Se ha impreso {documento} en multifuncion")
87+
88+
def scanner(self, documento):
89+
print(f"Se escaneo el {documento}")
90+
91+
def fax(self, documento, nfax):
92+
print(f"Se envio el {documento} por fax con el numero {nfax}")
93+
94+
95+
class GesImpresoras:
96+
def __init__(self):
97+
self.impresoras = []
98+
99+
def agg_impresoras(self, impresora):
100+
self.impresoras.append(impresora)
101+
102+
def imp_doc(self, documento, tipo_impresora=None):
103+
for impresora in self.impresoras:
104+
if tipo_impresora is None or isinstance(impresora, tipo_impresora):
105+
impresora.imprimir(documento)
106+
break
107+
else:
108+
print('No se encontro la impresora')
109+
110+
gestor = GesImpresoras()
111+
gestor.agg_impresoras(ImpresoraBN())
112+
gestor.agg_impresoras(ImpresoraColor())
113+
gestor.agg_impresoras(ImpresoraMul())
114+
115+
gestor.imp_doc('documento', ImpresoraBN)
116+
gestor.imp_doc('documento', ImpresoraColor)
117+
gestor.imp_doc('documento', ImpresoraMul)

0 commit comments

Comments
 (0)