You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
#28 SOLID: PRINCIPIO DE SUSTITUCIÓN DE LISKOV (LSP)
2
+
3
+
# * EJERCICIO:
4
+
# * Explora el "Principio SOLID de Sustitución de Liskov (Liskov Substitution Principle, LSP)"
5
+
# * y crea un ejemplo simple donde se muestre su funcionamiento
6
+
# * de forma correcta e incorrecta.
7
+
8
+
#El principio LSP establece que los objetos de un programa deben ser reemplazables por instancias de sus subtipos sin alterar la corrección del programa.
9
+
#En otras palabras, si S es un subtipo de T, entonces los objetos de tipo T en un programa pueden ser reemplazados por objetos de tipo S sin alterar el comportamiento del programa.
10
+
11
+
12
+
# Ejemplo de código que viola el principio LSP:
13
+
14
+
classBird :
15
+
def__init__(self, name):
16
+
self.name=name
17
+
18
+
deffly(self):
19
+
print(f"{self.name} is flying")
20
+
21
+
classOstrich(Bird):
22
+
deffly(self):
23
+
raiseException("Ostriches can't fly")
24
+
25
+
defmake_bird_fly(bird):
26
+
bird.fly()
27
+
28
+
bird=Bird("Bird")
29
+
ostrich=Ostrich("Ostrich")
30
+
31
+
make_bird_fly(bird)
32
+
make_bird_fly(ostrich)
33
+
#En este ejemplo, el método fly() de la clase Ostrich viola el principio LSP, ya que el método fly() de la clase Bird lanza una excepción en lugar de volar.
34
+
#Por lo tanto, el objeto de tipo Ostrich no puede reemplazar al objeto de tipo Bird sin alterar el comportamiento del programa.
35
+
36
+
# Ejemplo de código que cumple con el principio LSP:
37
+
38
+
classBird:
39
+
def__init__(self, name):
40
+
self.name=name
41
+
42
+
deffly(self):
43
+
print(f"{self.name} is flying")
44
+
45
+
classOstrich:
46
+
def__init__(self, name):
47
+
self.name=name
48
+
49
+
deffly(self):
50
+
print(f"{self.name} can't fly")
51
+
52
+
defmake_bird_fly(bird):
53
+
bird.fly()
54
+
55
+
bird=Bird("Bird")
56
+
ostrich=Ostrich("Ostrich")
57
+
58
+
make_bird_fly(bird)
59
+
make_bird_fly(ostrich)
60
+
#En este ejemplo, el método fly() de la clase Ostrich no viola el principio LSP, ya que el método fly() de la clase Ostrich simplemente imprime que el avestruz no puede volar.
61
+
#Por lo tanto, el objeto de tipo Ostrich puede reemplazar al objeto de tipo Bird sin alterar el comportamiento del programa.
62
+
63
+
# * DIFICULTAD EXTRA (opcional):
64
+
# * Crea una jerarquía de vehículos. Todos ellos deben poder acelerar y frenar, así como
65
+
# * cumplir el LSP.
66
+
# * Instrucciones:
67
+
# * 1. Crea la clase Vehículo.
68
+
# * 2. Añade tres subclases de Vehículo.
69
+
# * 3. Implementa las operaciones "acelerar" y "frenar" como corresponda.
70
+
# * 4. Desarrolla un código que compruebe que se cumple el LSP.
71
+
72
+
classVehicle:
73
+
def__init__(self, name):
74
+
self.name=name
75
+
76
+
defaccelerate(self):
77
+
raiseNotImplementedError
78
+
79
+
defbrake(self):
80
+
raiseNotImplementedError
81
+
82
+
classCar(Vehicle):
83
+
defaccelerate(self):
84
+
print(f"{self.name} is accelerating")
85
+
86
+
defbrake(self):
87
+
print(f"{self.name} is braking")
88
+
89
+
classBicycle(Vehicle):
90
+
defaccelerate(self):
91
+
print(f"{self.name} is pedaling faster")
92
+
93
+
defbrake(self):
94
+
print(f"{self.name} is braking")
95
+
96
+
classPlane(Vehicle):
97
+
defaccelerate(self):
98
+
print(f"{self.name} is taking off")
99
+
100
+
defbrake(self):
101
+
print(f"{self.name} is landing")
102
+
103
+
defoperate_vehicle(vehicle):
104
+
vehicle.accelerate()
105
+
vehicle.brake()
106
+
107
+
car=Car("Car")
108
+
bicycle=Bicycle("Bicycle")
109
+
plane=Plane("Plane")
110
+
111
+
operate_vehicle(car)
112
+
operate_vehicle(bicycle)
113
+
operate_vehicle(plane)
114
+
115
+
#En este ejemplo, la clase Vehicle define los métodos accelerate() y brake() como métodos abstractos que deben ser implementados por las subclases. Las clases Car, Bicycle y Plane implementan estos métodos de acuerdo con el comportamiento esperado de cada vehículo. Por lo tanto, el principio LSP se cumple en este caso, ya que los objetos de las subclases pueden reemplazar a los objetos de la superclase sin alterar el comportamiento del programa.
0 commit comments