Refactorizar: Mover código
Ejemplo de refactorización usando la técnica Mover código
Código sin refactorizar:
Python
class Cliente:
"""
Representa un cliente.
Atributos:
nombre: El nombre del cliente.
direccion: La dirección del cliente.
telefono: El teléfono del cliente.
compras: Una lista de diccionarios que representan las compras del cliente.
Métodos:
agregar_compra(producto, cantidad): Agrega una nueva compra al cliente.
calcular_total_compras(): Calcula el total de las compras del cliente.
"""
def __init__(self, nombre, direccion, telefono):
self.nombre = nombre
self.direccion = direccion
self.telefono = telefono
self.compras = []
def agregar_compra(self, producto, cantidad):
self.compras.append({"producto": producto, "cantidad": cantidad})
def calcular_total_compras(self):
total = 0
for compra in self.compras:
precio = compra["producto"]["precio"]
cantidad = compra["cantidad"]
subtotal = precio * cantidad
total += subtotal
return total
def generar_reporte_cliente(cliente):
"""
Genera un reporte en formato HTML con la información del cliente.
Args:
cliente: Un objeto de tipo Cliente.
Returns:
Una cadena de texto con el HTML del reporte.
"""
html = "<html><head><title>Reporte de cliente</title></head><body>"
html += "<h1>" + cliente.nombre + "</h1>"
html += "<ul>"
html += "<li>Dirección: " + cliente.direccion + "</li>"
html += "<li>Teléfono: " + cliente.telefono + "</li>"
html += "</ul>"
html += "<h2>Compras</h2>"
html += "<ul>"
for compra in cliente.compras:
producto = compra["producto"]["nombre"]
cantidad = compra["cantidad"]
html += "<li>" + producto + ": " + str(cantidad) + "</li>"
html += "</ul>"
html += "<h2>Total de compras: " + str(cliente.calcular_total_compras()) + "</h2>"
html += "</body></html>"
return html
cliente = Cliente("Juan Pérez", "Calle Mayor 123", "123456789")
cliente.agregar_compra({"nombre": "Camisa", "precio": 25.00}, 2)
cliente.agregar_compra({"nombre": "Pantalón", "precio": 35.00}, 1)
reporte = generar_reporte_cliente(cliente)
print(reporte)
Problema del código sin refactorizar:
- El método
generar_reporte_clientese encuentra en un archivo diferente al de la claseCliente. - El método
generar_reporte_clienteaccede a los atributos privados de la claseCliente(compras).
Refactorización utilizando la técnica Mover código:
Como notarás el método generar_reporte se mueve a la clase cliente.
Python
class Cliente:
"""
Representa un cliente.
Atributos:
nombre: El nombre del cliente.
direccion: La dirección del cliente.
telefono: El teléfono del cliente.
compras: Una lista de diccionarios que representan las compras del cliente.
Métodos:
agregar_compra(producto, cantidad): Agrega una nueva compra al cliente.
calcular_total_compras(): Calcula el total de las compras del cliente.
generar_reporte(): Genera un reporte en formato HTML con la información del cliente.
"""
def __init__(self, nombre, direccion, telefono):
self.nombre = nombre
self.direccion = direccion
self.telefono = telefono
self.compras = []
def agregar_compra(self, producto, cantidad):
self.compras.append({"producto": producto, "cantidad": cantidad})
def calcular_total_compras(self):
total = 0
for compra in self.compras:
precio = compra["producto"]["precio"]
cantidad = compra["cantidad"]
subtotal = precio * cantidad
total += subtotal
return total
def generar_reporte(self):
"""
Genera un reporte en formato HTML con la información del cliente.
Returns:
Una cadena de texto con el HTML del reporte.
"""
html = "<html><head><title>Reporte de cliente</title></head><body>"
html += "<h1>" + self.nombre + "</h1>"
html += "<ul>"
html += "<li>Dirección: " + cliente.direccion + "</li>"
html += "<li>Teléfono: " + cliente.telefono + "</li>"
html += "</ul>"
html += "<h2>Compras</h2>"
html += "<ul>"
for compra in cliente.compras:
producto = compra["producto"]["nombre"]
cantidad = compra["cantidad"]
html += "<li>" + producto + ": " + str(cantidad) + "</li>"
html += "</ul>"
html += "<h2>Total de compras: " + str(cliente.calcular_total_compras()) + "</h2>"
html += "</body></html>"
return html
cliente = Cliente("Juan Pérez", "Calle Mayor 123", "123456789")
cliente.agregar_compra({"nombre": "Camisa", "precio": 25.00}, 2)
cliente.agregar_compra({"nombre": "Pantalón", "precio": 35.00}, 1)
reporte = cliente.generar_reporte(cliente)
print(reporte)
Comentarios
Publicar un comentario