Mejores Prácticas
Principios de Diseño Modular
1. Principio de Responsabilidad Única
## Mal ejemplo: Múltiples responsabilidades
class UserManager:
def create_user(self, username, password):
## Lógica de creación de usuario
self.validate_password(password)
self.save_to_database()
self.send_welcome_email()
## Buen ejemplo: Responsabilidades separadas
class UserValidator:
def validate_password(self, password):
## Lógica de validación de contraseña
pass
class UserRepository:
def save_user(self, user):
## Lógica de guardado en base de datos
pass
class NotificationService:
def send_welcome_email(self, user):
## Lógica de envío de correo de bienvenida
pass
Gestión de Dependencias
Inyección de Dependencias
graph TD
A[Módulo de Alto Nivel] -->|Depende de una Abstracción| B[Interfaz de Abstracción]
C[Implementación Concreta 1] -.-> B
D[Implementación Concreta 2] -.-> B
from abc import ABC, abstractmethod
class DatabaseConnector(ABC):
@abstractmethod
def connect(self):
pass
class MySQLConnector(DatabaseConnector):
def connect(self):
## Lógica de conexión específica de MySQL
pass
class PostgreSQLConnector(DatabaseConnector):
def connect(self):
## Lógica de conexión específica de PostgreSQL
pass
class DataProcessor:
def __init__(self, connector: DatabaseConnector):
self._connector = connector
def process_data(self):
connection = self._connector.connect()
## Procesar datos utilizando la conexión
Manejo de Errores y Registro (Logging)
Manejo Integral de Errores
import logging
from typing import Optional
class CustomError(Exception):
"""Clase base de error personalizado"""
pass
def configure_logging():
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filename='application.log'
)
return logging.getLogger(__name__)
def safe_division(a: float, b: float) -> Optional[float]:
logger = configure_logging()
try:
result = a / b
logger.info(f"División exitosa de {a} entre {b}")
return result
except ZeroDivisionError:
logger.error(f"División por cero: {a} / {b}")
raise CustomError("No se puede dividir por cero")
Métricas de Calidad del Código
| Práctica |
Descripción |
Beneficio |
| Anotaciones de Tipo (Type Hinting) |
Utilizar anotaciones de tipo |
Mejora la legibilidad del código |
| Cadenas de Documentación (Docstrings) |
Documentación integral |
Mejor comprensión |
| Pruebas Unitarias |
Amplia cobertura de pruebas |
Reducción de la introducción de errores |
| Análisis Estático de Código (Code Linting) |
Análisis estático del código |
Calidad consistente del código |
Optimización de Rendimiento
Carga Perezosa (Lazy Loading) y Generadores
def large_file_processor(filename):
def line_generator():
with open(filename, 'r') as file:
for line in file:
## Procesar línea de forma perezosa
yield line.strip()
for processed_line in line_generator():
## Procesamiento eficiente en memoria
process(processed_line)
Patrones de Diseño
Patrón Método Fábrica (Factory Method Pattern)
class DatabaseFactory:
@staticmethod
def get_database(db_type: str):
if db_type == 'mysql':
return MySQLDatabase()
elif db_type == 'postgresql':
return PostgreSQLDatabase()
else:
raise ValueError(f"Tipo de base de datos no soportado: {db_type}")
Consideraciones de Seguridad
Validación de Entrada
import re
from typing import Optional
def validate_email(email: str) -> Optional[str]:
email_pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
if re.match(email_pattern, email):
return email
else:
raise ValueError("Formato de correo electrónico inválido")
Recomendaciones de Integración Continua
- Utilizar entornos virtuales
- Implementar pruebas automatizadas
- Utilizar control de versiones (Git)
- Configurar pipelines de CI/CD
LabEx enfatiza que seguir estas mejores prácticas mejorará significativamente la mantenibilidad, legibilidad y calidad general de su proyecto de Python.