Skip to content

Commit 6b90b23

Browse files
authored
Merge pull request mouredev#4700 from Kenysdev/27.py
#27 - Python
2 parents 9b831a0 + c1da6c6 commit 6b90b23

File tree

1 file changed

+133
-0
lines changed

1 file changed

+133
-0
lines changed
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
# ╔═════════════════════════════════════╗
2+
# ║ Autor: Kenys Alvarado ║
3+
# ║ GitHub: https://github.com/Kenysdev ║
4+
# ║ 2024 - Python ║
5+
# ╚═════════════════════════════════════╝
6+
7+
# -------------------------------------------------
8+
# * SOLID: PRINCIPIO ABIERTO-CERRADO (OCP)
9+
# -------------------------------------------------
10+
# - Una entidad de software debería estar abierta a extensión pero cerrada a
11+
# modificación, esto significa que debemos poder extender el comportamiento de
12+
# una clase sin necesidad de modificar su código fuente original.
13+
14+
"""
15+
* EJERCICIO #1:
16+
* Explora el "Principio SOLID Abierto-Cerrado (Open-Close Principle, OCP)"
17+
* y crea un ejemplo simple donde se muestre su funcionamiento
18+
* de forma correcta e incorrecta.
19+
"""
20+
21+
# ABC (Abstract Base Class):
22+
# Para establecer contratos entre clases base y sus 'subclases'.
23+
# https://www.geeksforgeeks.org/abstract-classes-in-python/
24+
from abc import ABC, abstractmethod
25+
26+
# Clase base
27+
class Product(ABC):
28+
def __init__(self, name, price):
29+
self.name = name
30+
self.price = price
31+
32+
@abstractmethod
33+
def apply_discount(self):
34+
pass
35+
36+
def final_price(self):
37+
return self.price - self.apply_discount()
38+
39+
# Clases concretas (Nuevas extenciones)
40+
class ElectronicsProduct(Product):
41+
def apply_discount(self):
42+
return self.price * 0.05 # Descuento del 5%
43+
44+
class ClothingProduct(Product):
45+
def apply_discount(self):
46+
if self.price > 50:
47+
return 10
48+
else:
49+
return 0
50+
51+
def process_product(product):
52+
print(f"Producto: {product.name}, Precio final: {product.final_price()}")
53+
54+
laptop = ElectronicsProduct("Laptop", 700)
55+
pants = ClothingProduct("Pants", 55)
56+
57+
process_product(laptop) # Output: Producto: Laptop, Precio final: 665.0
58+
process_product(pants) # Output: Producto: Pants, Precio final: 45
59+
60+
"""
61+
* EJERCICIO #2:
62+
* Desarrolla una calculadora que necesita realizar diversas operaciones matemáticas.
63+
* Requisitos:
64+
* - Debes diseñar un sistema que permita agregar nuevas operaciones utilizando el OCP.
65+
* Instrucciones:
66+
* 1. Implementa las operaciones de suma, resta, multiplicación y división.
67+
* 2. Comprueba que el sistema funciona.
68+
* 3. Agrega una quinta operación para calcular potencias.
69+
* 4. Comprueba que se cumple el OCP.
70+
"""
71+
72+
# Clase base
73+
class Calculator(ABC):
74+
def __init__(self, a, b):
75+
if isinstance(a, (int, float)) and isinstance(b, (int, float)):
76+
self.a = a
77+
self.b = b
78+
else:
79+
self.a = None
80+
self.b = None
81+
print("Operación invalida.")
82+
83+
@abstractmethod
84+
def math_operation(self):
85+
pass
86+
87+
def print_result(self):
88+
if self.a is not None and self.b is not None:
89+
print(f"Es: {self.math_operation()}")
90+
else:
91+
print("Campos incorrectos.")
92+
93+
# Clases concretas
94+
class Sum(Calculator):
95+
def math_operation(self):
96+
print(f"\nSuma de {self.a} + {self.b}:")
97+
return self.a + self.b
98+
99+
class Subtraction(Calculator):
100+
def math_operation(self):
101+
print(f"\nResta de {self.a} - {self.b}:")
102+
return self.a - self.b
103+
104+
class Multiplication(Calculator):
105+
def math_operation(self):
106+
print(f"\nMultiplicación de {self.a} * {self.b}:")
107+
return self.a * self.b
108+
109+
class Division(Calculator):
110+
def math_operation(self):
111+
print(f"\nDivisión de {self.a} / {self.b}:")
112+
return self.a / self.b
113+
114+
class Pow(Calculator):
115+
def math_operation(self):
116+
print(f"\nPotencia de {self.a} ^ {self.b}:")
117+
return self.a ** self.b
118+
119+
sum_ = Sum(2, 2)
120+
sum_.print_result()
121+
122+
subtraction = Subtraction(2, 2)
123+
subtraction.print_result()
124+
125+
multip = Multiplication(2, 2)
126+
multip.print_result()
127+
128+
div = Division(2, 2)
129+
div.print_result()
130+
131+
pow_ = Pow(2, 2)
132+
pow_.print_result()
133+

0 commit comments

Comments
 (0)