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.
Síguenos con el tutorial
Section titled “Síguenos con el tutorial”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 🏗️”¿Por qué Refactorizar?
Section titled “¿Por qué Refactorizar?”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.
El Código Refactorizado
Section titled “El Código Refactorizado”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.
app.py
Section titled “app.py”Este es el archivo principal. Observa cómo importa las funciones necesarias de los módulos registro
y parsers_date
.
from modules.parsers_date import parse_dateimport 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()
modules/parsers_date.py
Section titled “modules/parsers_date.py”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
.
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
modules/registro.py
Section titled “modules/registro.py”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.
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
Referencias Complementarias
Section titled “Referencias Complementarias”- Documentación Oficial de Python sobre Módulos: Profundiza en el concepto de módulos y paquetes en Python.
- PEP 8 — Guía de Estilo para Código Python: Un documento esencial sobre las buenas prácticas de estilo en el código de Python.
- QuePasaLinux: No olvides revisar mi canal para más contenido.