Skip to content

Commit 61c7872

Browse files
authored
Merge pull request mouredev#4889 from Jesusway69/main
#28 - Python
2 parents b3e3c37 + a247706 commit 61c7872

File tree

1 file changed

+148
-0
lines changed

1 file changed

+148
-0
lines changed
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
import os, platform
2+
from math import pi
3+
from abc import ABC
4+
if (platform.platform().startswith("macOS") or platform.platform().startswith("Linux")):
5+
os.system('clear')
6+
else:
7+
os.system('cls')
8+
9+
"""
10+
* EJERCICIO:
11+
* Explora el "Principio SOLID de Sustitución de Liskov (Liskov Substitution Principle, LSP)"
12+
* y crea un ejemplo simple donde se muestre su funcionamiento
13+
* de forma correcta e incorrecta.
14+
*
15+
"""
16+
17+
class Figure1:
18+
def __init__(self, base, height) -> None:
19+
self.base = base
20+
self.height = height
21+
def calculate_area(self):
22+
return self.base * self.height
23+
24+
class Rectangle1(Figure1):
25+
def __init__(self, base, height) -> None:
26+
super().__init__(base, height)
27+
def calculate_area(self):
28+
return super().calculate_area()
29+
30+
class Square1(Figure1):
31+
def __init__(self, base, height) -> None:
32+
super().__init__(base, height)
33+
self.height = base
34+
def calculate_area(self):
35+
return super().calculate_area()
36+
37+
rectangle1 = Rectangle1(2,5).calculate_area()
38+
square1 = Square1(2,5).calculate_area()
39+
print(rectangle1)
40+
print(square1)
41+
42+
"""
43+
El Principio de Sustitución de Liskov establece que las subclases deben ser sustituibles por sus clases base.
44+
En el caso de no se cumple este principio porque para calcular el área de un cuadrado es innecesario
45+
el aporte de 2 argumentos (base y altura) aunque en este caso concreto hemos "trampeado" la clase para que tome sólo
46+
un valor e ignore el otro, aun así siguen siendo obligatorios los 2 argumentos aunque el 2do sea innecesario, además
47+
al tener la misma fórmula de multiplicación simple para calcular el área el método calculate_area nos valdría pero si
48+
quisiéramos ampliar el programa y añadir una clase que cree objetos circulares y calcular su área ya no nos serviría
49+
la clase padre y llamar a su método calculate_area """
50+
51+
52+
class Figure2(ABC):
53+
def __init__(self) -> None:
54+
pass
55+
def calculate_area(self):
56+
return "Figura no definida"
57+
58+
class Rectangle2(Figure2):
59+
def __init__(self, arg1, arg2) -> None:
60+
self.arg1 = arg1
61+
self.arg2 = arg2
62+
def calculate_area(self):
63+
return f"El área del rectángulo con base {self.arg1} y altura {self.arg2} es: {self.arg1 * self.arg2}"
64+
65+
class Square2(Figure2):
66+
def __init__(self, side) -> None:
67+
self.side = side
68+
def calculate_area(self):
69+
return f"El área del cuadrado con lado {self.side} es: {self.side ** 2}"
70+
71+
class Circle2(Figure2):
72+
def __init__(self, radius) -> None:
73+
self.radius = radius
74+
def calculate_area(self):
75+
return f"El área del círculo con radio {self.radius} es: {round((self.radius ** 2 * pi),2)}"
76+
77+
rectangle2 = Rectangle2(2,5).calculate_area()
78+
square2 = Square2(5).calculate_area()
79+
circle2 = Circle2(5).calculate_area()
80+
figure2 = Figure2().calculate_area()
81+
82+
print(rectangle2)
83+
print(square2)
84+
print(circle2)
85+
print(figure2)
86+
print()
87+
88+
"""En este caso creamos una clase abstracta con ABC que defina los métodos a usar en las subclases
89+
de esta manera podemos seguir creando sublases con diferentes formas geométricas aplicando a cada una
90+
de ellas las funcionalidades concretas de esos métodos tanto los argumentos requeridos al iniciar la instancia
91+
como el cálculo del área para cada forma y así respetamos el LSP aunque la clase padre sea sólamente una especie de
92+
interface (en python no se pueden declarar como tal) que sirva como plantilla para el resto de clases"""
93+
94+
95+
96+
"""
97+
* DIFICULTAD EXTRA (opcional):
98+
* Crea una jerarquía de vehículos. Todos ellos deben poder acelerar y frenar, así como
99+
* cumplir el LSP.
100+
* Instrucciones:
101+
* 1. Crea la clase Vehículo.
102+
* 2. Añade tres subclases de Vehículo.
103+
* 3. Implementa las operaciones "acelerar" y "frenar" como corresponda.
104+
* 4. Desarrolla un código que compruebe que se cumple el LSP."""
105+
106+
107+
class Vehicle:
108+
name = "vehículo en general"
109+
def accelerate(self):
110+
return True
111+
def brake(self):
112+
return True
113+
114+
class Car(Vehicle):
115+
name = "coche"
116+
def accelerate(self):
117+
return super().accelerate()
118+
def brake(self):
119+
return super().brake()
120+
121+
class Motorbike(Vehicle):
122+
name = "moto"
123+
def accelerate(self):
124+
return super().accelerate()
125+
def brake(self):
126+
return super().brake()
127+
128+
class Truck(Vehicle):
129+
name = "camión"
130+
def accelerate(self):
131+
return super().accelerate()
132+
def brake(self):
133+
return super().brake()
134+
135+
vehicle = Vehicle()
136+
car = Car()
137+
truck = Truck()
138+
motorbike = Motorbike()
139+
140+
def lsp(object):
141+
print(f"¿El vehículo '{object.name}' acelera? : {object.accelerate()}")
142+
print(f"¿El vehículo '{object.name}' frena? : {object.brake()}")
143+
144+
lsp(vehicle)
145+
lsp(car)
146+
lsp(truck)
147+
lsp(motorbike)
148+

0 commit comments

Comments
 (0)