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_cliente se encuentra en un archivo diferente al de la clase Cliente.
  • El método generar_reporte_cliente accede a los atributos privados de la clase Cliente (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

Entradas más populares de este blog

Malos olores

Refactorización

Refactorización: Eliminar código muerto