Skip to content

Python de Cero a Pro - Cap.9 Cambiando Estructura de Proyecto

¡Hola! En este capítulo, aprenderemos a cómo transformar un script desordenado en un proyecto limpio y profesional. Refactorizar nuestro código es una habilidad fundamental que nos permite crear aplicaciones más fáciles de entender, mantener y colaborar.

Volver a Página Principal

Ver Codigo en GitLab


Módulo 9: Cambiando Estructura de Proyecto 🏗️

Section titled “Módulo 9: Cambiando Estructura de Proyecto 🏗️”

En capítulos anteriores, hemos trabajado con un solo archivo app.py. A medida que un proyecto crece, tener todo el código en un único archivo se vuelve inmanejable. La refactorización es el proceso de reestructurar el código existente sin cambiar su comportamiento externo. Esto nos permite:

  • Mejorar la legibilidad: El código se vuelve más fácil de leer y entender.
  • Aumentar la modularidad: Separamos las responsabilidades en diferentes módulos.
  • Fomentar la reutilización: Las funciones de un módulo pueden ser usadas en otros proyectos.
  • Simplificar la colaboración: Diferentes desarrolladores pueden trabajar en módulos distintos sin pisarse el código.

Estructura de nuestro Proyecto Refactorizado

Section titled “Estructura de nuestro Proyecto Refactorizado”

Hemos transformado nuestro proyecto monolítico a una estructura modular. Ahora, la lógica de nuestro programa está organizada en tres archivos principales:

.
├── modules/
│ ├── __init__.py
│ ├── parsers_date.py
│ └── registro.py
└── app.py
  • app.py: Este es ahora el punto de entrada de la aplicación. Solo contiene la lógica principal, llamando a las funciones de otros módulos.
  • modules/registro.py: Contiene todas las funciones relacionadas con la interacción con el usuario, como pedir datos e imprimir resultados.
  • modules/parsers_date.py: Se encarga exclusivamente de la lógica para validar y convertir fechas.

A continuación, puedes ver cómo se ve ahora cada uno de los archivos. Verás que cada módulo tiene un propósito claro y definido.

Este es el archivo principal. Observa cómo importa las funciones necesarias de los módulos registro y parsers_date.

app.py
from modules.parsers_date import parse_date
import modules.registro as Registro
def main():
name = Registro.Pedir_Nombre()
while not name:
print("No has ingresado un nombre válido.")
name = Registro.Pedir_Nombre()
birth = Registro.Pedir_Fecha_Nacimiento()
parser_date = parse_date(birth)
while parser_date is None:
print("No has ingresado una fecha de nacimiento válida.")
birth = Registro.Pedir_Fecha_Nacimiento()
parser_date = parse_date(birth)
age = Registro.Calcular_Edad(parser_date)
Registro.Imprimir_Data(name, age)
if __name__ == "__main__":
main()

Este módulo se especializa en la validación y conversión de fechas. Su única responsabilidad es procesar cadenas de texto para convertirlas en objetos de tipo datetime.

modules/parsers_date.py
from datetime import datetime
def parse_date(input_date):
"""
Convierte una cadena de texto a un objeto de tipo datetime,
validando múltiples formatos de fecha.
"""
formats_availaible = [
"%Y-%m-%d", # YYYY-MM-DD
"%d-%m-%Y", # DD-MM-YYYY
"%m/%d/%Y", # MM/DD/YYYY
"%Y/%m/%d" # YYYY/MM/DD
]
for formato in formats_availaible:
try:
date_parse = datetime.strptime(input_date, formato)
return date_parse
except ValueError:
pass
return None

Este módulo contiene todas las funciones que interactúan directamente con el usuario para obtener datos, calcular la edad e imprimir el resultado final.

modules/registro.py
from datetime import datetime
def Imprimir_Data(name, age):
"""Imprime el mensaje de bienvenida y la edad del usuario."""
print(f"Bienvenido {name}, Tu edad es: {age} años")
def Pedir_Nombre():
"""Solicita el nombre al usuario."""
print("Bienvenido a nuestra app")
name = input("Cuál es tu nombre: ")
return name
def Pedir_Fecha_Nacimiento():
"""Solicita la fecha de nacimiento al usuario."""
print("Gracias por Darnos tu Nombre.")
birth = input("Cuál es tu fecha de nacimiento: ")
return birth
def Calcular_Edad(birthday):
"""Calcula la edad del usuario a partir de su fecha de nacimiento."""
fecha_actual = datetime.now()
edad = fecha_actual.year - birthday.year - ((fecha_actual.month, fecha_actual.day) < (birthday.month, birthday.day))
return edad