Clean Code and Quality Code - alfonsogastalverllamas/documentation GitHub Wiki
🧼 Clean Code
El concepto de Clean Code fue popularizado por Robert C. Martin (Uncle Bob) en su libro “Clean Code: A Handbook of Agile Software Craftsmanship”. Su objetivo es escribir código que sea fácil de leer, entender, modificar y mantener por cualquier desarrollador, no solo por su autor original.
✅ ¿Por qué es importante el Clean Code?
Razón
Explicación
👁️ Legibilidad
Código claro permite entender rápidamente qué hace una función o clase.
🔁 Mantenibilidad
Facilita hacer cambios sin introducir errores.
🤝 Colaboración
Cualquiera del equipo puede trabajar sobre el mismo código sin confusión.
🐛 Menos bugs
El código claro es menos propenso a errores.
📈 Escalabilidad
Proyectos bien estructurados son más fáciles de escalar en complejidad.
💸 Ahorro de costes
Se reduce el tiempo de desarrollo, mantenimiento y depuración.
🧱 Pilares Fundamentales del Clean Code
Pilar
Descripción
Ejemplo
Nombres significativos
Usa nombres que expresen intención.
calculateTotal() es mejor que calc()
Funciones pequeñas
Cada función debe hacer una sola cosa.
sendEmail() no debería también validar datos
Evita comentarios innecesarios
El código debe explicarse solo. Los comentarios solo si aportan valor.
Mejorar el nombre en vez de comentar algo obvio
Evita duplicación
Reutiliza lógica común en funciones o clases.
isValidEmail() en vez de validar varias veces
Código expresivo
El código debe contar una historia clara.
if user.isAdmin() vs if u.flag == 1
Manejo de errores limpio
Usa excepciones, evita if-else anidados complejos.
try-except bien estructurado
Menos dependencias
Clases/módulos poco acoplados.
Separar lógica de negocio de UI
Formateo consistente
Sigue convenciones de estilo.
Indentación clara, uso de linters
🔑 Conceptos Clave
Concepto
Descripción
SRP (Single Responsibility Principle)
Cada módulo o clase debe tener una única responsabilidad.
DRY (Don't Repeat Yourself)
No dupliques lógica. Extrae a funciones reutilizables.
KISS (Keep It Simple, Stupid)
No compliques el código innecesariamente.
YAGNI (You Aren’t Gonna Need It)
No implementes cosas que aún no necesitas.
Refactorización continua
Mejora progresivamente el código sin cambiar su comportamiento.
📌 Ejemplos específicos de Clean Code vs Dirty Code
defprocess_order(order):
# validateifnotorder.items:
raiseException("No items")
iforder.total<=0:
raiseException("Total must be positive")
# calculate taxestax=order.total*0.2# save to dbsave_to_database(order, tax)
# send confirmationsend_confirmation_email(order)
✅ Clean Code
defprocess_order(order):
validate_order(order)
tax=calculate_tax(order.total)
save_to_database(order, tax)
send_confirmation_email(order)
defvalidate_order(order):
ifnotorder.items:
raiseException("No items in order")
iforder.total<=0:
raiseException("Total must be positive")
defcalculate_tax(amount: float) ->float:
returnamount*0.2
Quality Code va más allá de que el código se vea limpio: asegura que funcione correctamente, sea seguro, mantenible, escalable y probado. Es un conjunto de prácticas que garantizan que el software no solo sea entendible, sino también confiable y robusto.
✅ ¿Por qué es importante escribir código de calidad?
Beneficio
Explicación
🔒 Mayor seguridad
Previene vulnerabilidades desde el código mismo.
🧪 Mejor testabilidad
Código bien diseñado se puede probar fácilmente y con precisión.
🔄 Facilidad de mantenimiento
Facilita aplicar cambios, correcciones o mejoras.
🚀 Mejor rendimiento
Mejores prácticas conducen a ejecución más eficiente.
🤝 Colaboración efectiva
Cualquier miembro del equipo puede entenderlo y trabajar sobre él.
💼 Calidad profesional
Refleja buenas prácticas de ingeniería, no solo funcionalidad.
🧱 Componentes Clave del Quality Code
Componente
Descripción
Legibilidad
Claridad en estructuras, nombres, comentarios útiles.
Modularidad
Código dividido en partes reutilizables y separadas.
defis_valid_credentials(username: str, password: str) ->bool:
# Nunca se deben hardcodear credencialesifnotusernameornotpassword:
raiseValueError("Credenciales incompletas")
returnauthenticate_user(username, password)
defauthenticate_user(username: str, password: str) ->bool:
# Validación real contra una base de datos segurareturnuser_repo.check_password(username, password)
📌 Ejemplos específicos de Quality Code
🔐 Ejemplo 1: Seguridad
❌ Inseguro: susceptible a inyección SQL
defget_user(email):
query=f"SELECT * FROM users WHERE email = '{email}'"db.execute(query)
✅ Seguro: evita inyecciones
defget_user(email: str):
query="SELECT * FROM users WHERE email = %s"db.execute(query, (email,))
🧪 Ejemplo 2: Testabilidad
❌ Difícil de testear (función con lógica y efectos colaterales)
defget_usernames():
users=db.query("SELECT * FROM users")
return [user['name'] foruserinusers]
✅ Fácil de testear (separación de responsabilidades)
defget_usernames():
returndb.query("SELECT name FROM users")
🧼 Guía Práctica de Quality Code
✅ Buenas Prácticas de Quality Code
Escribir código de calidad no solo se trata de que funcione, sino de que sea seguro, mantenible, escalable y confiable. A continuación, algunas de las mejores prácticas para garantizarlo:
🔐 Seguridad
Valida todas las entradas del usuario.
Usa consultas parametrizadas (evita SQL injection).
Maneja errores con excepciones controladas, no con mensajes genéricos.