Laboratorios de infra con Docker Compose y Python
Registros de Ubuntu: Verificar y configurar archivos de logs

Clean Code básico en Python

clean code

Escribir clean code (código limpio) es una habilidad fundamental para todo desarrollador de software. El clean code no solo hace que tu base de código sea más mantenible y fácil de entender, sino que también fomenta la colaboración entre los miembros del equipo. En este artículo completo, exploraremos qué es el clean code, por qué es importante y te proporcionaremos un conjunto de mejores prácticas y principios para ayudarte a escribir código limpio y mantenible.

¿Qué es el clean code?

El clean code es código que es fácil de leer, entender y modificar. Es un código libre de complejidad innecesaria, redundancia y confusión. El clean code sigue un conjunto de convenciones y mejores prácticas que lo hacen más consistente, facilitando que múltiples desarrolladores trabajen en el mismo proyecto sin problemas.

Código Espagueti, el «anti patrón» de programación

Estándares de codificación

Case styles: Convenciones de nomenclatura en programación

Code Cleanup en la wikipedia en inglés

¿Por qué es Importante el clean code?

  1. Legibilidad: El clean code es fácil de leer, lo que significa que cualquiera, incluido tú mismo en el futuro, puede entenderlo rápidamente. Esto reduce el tiempo necesario para comprender la funcionalidad del código, lo que lleva a un desarrollo y depuración más rápidos.
  2. Mantenibilidad: El código se lee más a menudo de lo que se escribe. Cuando escribes clean code, se vuelve más fácil mantener y extender la aplicación con el tiempo. Esto es crucial en el ciclo de vida del desarrollo de software, donde los proyectos a menudo evolucionan y crecen.
  3. Colaboración: El clean code fomenta la colaboración. Cuando tu código es limpio y está bien organizado, otros miembros del equipo pueden trabajar en él de manera efectiva. Esto facilita dividir tareas y trabajar en diferentes partes de la base de código simultáneamente.
  4. Reducción de Errores: El clean code reduce la probabilidad de introducir errores. El código que es difícil de entender es más propenso a errores durante las modificaciones o mejoras.
  5. Eficiencia: El clean code es código eficiente. Normalmente se ejecuta más rápido y utiliza menos recursos porque evita operaciones y complejidades innecesarias.
  6. Profesionalismo: Escribir clean code demuestra profesionalismo y atención al detalle. Muestra que te importa la calidad de tu trabajo y te esfuerzas por producir software de alta calidad.

Mejores Prácticas y Principios para Escribir Código Limpio

Vamos a explorar algunas de las mejores prácticas y principios para escribir código limpio y mantenible. Estas prácticas se aplican a la mayoría de los lenguajes de programación y pueden ayudarte a mejorar la calidad de tu código y a convertirte en un desarrollador más eficiente y competente.

1. Nombres Significativos para Variables y Funciones

Usa nombres descriptivos para variables, funciones, clases y otros identificadores. Un nombre bien elegido puede transmitir el propósito de la entidad, haciendo que el código sea más comprensible. Evita nombres de variables de una sola letra o abreviaturas crípticas.

# Mal nombre de variable
x = 5

# Buen nombre de variable
puntuacion_total = 5

2. Mantén las Funciones y Métodos Cortos

Las funciones y métodos deben ser concisos y centrarse en una sola tarea. El Principio de Responsabilidad Única (SRP) establece que una función debe hacer una cosa y hacerla bien. Las funciones más cortas son más fáciles de entender, probar y mantener. Si una función se vuelve demasiado larga o compleja, considera dividirla en funciones más pequeñas y manejables.

# Función larga y compleja
def procesar_datos_usuario(usuario):
# Muchas líneas de código...
pass

# Refactorizada en funciones más pequeñas
def validar_entrada_usuario(entrada_usuario):
# Lógica de validación...
pass

def guardar_usuario_en_base_de_datos(usuario):
# Operación en la base de datos...
pass

3. Comentarios y Documentación

Usa comentarios con moderación y, cuando lo hagas, que sean significativos. El código debe ser autoexplicativo siempre que sea posible. La documentación, como los comentarios en línea y los archivos README, ayuda a otros desarrolladores a entender el propósito y uso de tu código. Documenta algoritmos complejos, decisiones no triviales y APIs públicas.

# Mal comentario
x = x + 1  # Incrementa x

# Buen comentario
# Calcula la puntuación total incrementando x
puntuacion_total = x + 1

4. Formato e Indentación Consistentes

Adhiérete a un estilo de codificación y una indentación consistentes. Esto hace que la base de código se vea limpia y organizada. La mayoría de los lenguajes de programación tienen estándares de codificación aceptados por la comunidad (por ejemplo, PEP 8 para Python) que debes seguir. La consistencia también se aplica a las convenciones de nomenclatura, espaciado y estructura del código.

# Formato inconsistente
if condicion:
hacer_algo()
else:
hacer_otra_cosa()

# Formato consistente
if condicion:
hacer_algo()
else:
hacer_otra_cosa()

5. Principio DRY (Don’t Repeat Yourself)

Evita duplicar código. El código repetido es más difícil de mantener y aumenta el riesgo de inconsistencias. Extrae la funcionalidad común en funciones, métodos o clases para promover la reutilización del código. Cuando necesites hacer un cambio, solo tendrás que hacerlo en un lugar.

Supongamos que estás trabajando en una aplicación de Python que calcula el precio total de artículos en un carrito de compras. Inicialmente, tienes dos funciones separadas para calcular el precio de cada tipo de artículo: una para calcular el precio de un libro y otra para calcular el precio de un portátil. Aquí está el código inicial:

def calcular_precio_libro(cantidad, precio):
return cantidad * precio

def calcular_precio_portatil(cantidad, precio):
return cantidad * precio

Aunque estas funciones funcionan, violan el principio DRY porque la lógica para calcular el precio total se repite para diferentes tipos de artículos. Si tienes más tipos de artículos para calcular, terminarás duplicando esta lógica. Para seguir el principio DRY y mejorar la mantenibilidad del código, puedes refactorizar el código de la siguiente manera:

def calcular_precio_articulo(cantidad, precio):
return cantidad * precio

cantidad_libros = 3
precio_libro = 25

cantidad_portatiles = 2
precio_portatil = 800

precio_total_libros = calcular_precio_articulo(cantidad_libros, precio_libro)
precio_total_portatiles = calcular_precio_articulo(cantidad_portatiles, precio_portatil)

En este código refactorizado, tenemos una sola función calcular_precio_articulo que calcula el precio total para cualquier tipo de artículo basado en la cantidad y el precio proporcionados como argumentos. Esto se adhiere al principio DRY porque la lógica de cálculo ya no está duplicada.

Ahora, puedes calcular fácilmente el precio total para libros, portátiles o cualquier otro tipo de artículo llamando a calcular_precio_articulo con los valores de cantidad y precio apropiados. Este enfoque promueve la reutilización, legibilidad y mantenibilidad del código, al tiempo que reduce el riesgo de errores causados por código duplicado.

6. Usa Espacios en Blanco Significativos

Da formato a tu código adecuadamente con espacios y saltos de línea. Esto mejora la legibilidad. Usa espacios en blanco para separar secciones lógicas de tu código. El código bien formateado es más fácil de escanear, reduciendo la carga cognitiva de los lectores.

# Mal uso de espacios en blanco
suma = lambda a,b: a+b

# Mejor uso de espacios en blanco
suma = lambda a, b: a + b

7. Manejo de Errores

Maneja los errores de manera adecuada. Usa bloques try-except o mecanismos de manejo de errores apropiados en tu código. Esto previene caídas inesperadas y proporciona información valiosa para la depuración. No suprimas errores ni los registres sin una respuesta adecuada.

# Manejo de errores inadecuado
try:
resultado = dividir(x, y)
except Exception:
print("Ocurrió un error")

# Manejo de errores adecuado
try:
resultado = dividir(x, y)
except ZeroDivisionError as error:
print("Error de división por cero:", str(error))
except ValueError as error:
print("Entrada no válida:", str(error))
except Exception as error:
print("Ocurrió un error inesperado:", str(error))

8. Pruebas

Escribe pruebas unitarias para verificar la corrección de tu código. El desarrollo guiado por pruebas (TDD) puede ayudarte a escribir código más limpio al obligarte a considerar casos límite y comportamiento esperado desde el principio. El código bien probado es más confiable y fácil de refactorizar.

# Ejemplo usando Python y el marco de pruebas unittest
import unittest

def suma(a, b):
return a + b

class TestSuma(unittest.TestCase):
def test_suma_correcta(self):
    self.assertEqual(suma(2, 3), 5)
    self.assertEqual(suma(-1, 1), 0)
    self.assertEqual(suma(0, 0), 0)

if __name__ == '__main__':
unittest.main()

9. Refactorización

Refactoriza tu código regularmente. A medida que cambian los requisitos y tu comprensión del dominio del problema se profundiza, ajusta tu código en consecuencia. La refactorización ayuda a mantener el código limpio a medida que el proyecto evoluciona. No tengas miedo de revisar y mejorar el código existente cuando sea necesario.

Supongamos que tienes una función que calcula el precio total de los artículos en un carrito de compras con un porcentaje de descuento fijo:

def calcular_precio_total(cart_items):
precio_total = 0
for item in cart_items:
    precio_total += item['precio']
return precio_total - (precio_total * 0.1)  # Aplica un descuento del 10%

Inicialmente, esta función calcula el precio total y aplica un descuento fijo del 10%. Sin embargo, a medida que el proyecto evoluciona, te das cuenta de que necesitas admitir descuentos variables. Para refactorizar el código y hacerlo más flexible, puedes introducir un parámetro de descuento:

def calcular_precio_total(cart_items, porcentaje_descuento):
if porcentaje_descuento < 0 or porcentaje_descuento > 100:
    raise ValueError("El porcentaje de descuento debe estar entre 0 y 100.")

precio_total = 0
for item in cart_items:
    precio_total += item['precio']

descuento = (precio_total * porcentaje_descuento) / 100
return precio_total - descuento

En este código refactorizado:

  • Hemos agregado un parámetro porcentaje_descuento a la función calcular_precio_total, permitiendo especificar el porcentaje de descuento al llamar a la función.
  • Realizamos una validación del parámetro porcentaje_descuento para asegurarnos de que esté dentro de un rango válido (0 a 100%). Si no está dentro del rango, lanzamos un error.
  • El cálculo del descuento ahora se basa en el porcentaje_descuento proporcionado, haciendo que la función sea más flexible y adaptable a los cambios de requisitos.

Al refactorizar el código de esta manera, has mejorado su flexibilidad y mantenibilidad. Puedes adaptar fácilmente la función para manejar diferentes escenarios de descuento sin tener que reescribir toda la lógica. Esto demuestra la importancia de la refactorización regular del código a medida que tu proyecto evoluciona y cambian los requisitos.

10. Control de Versiones

Usa sistemas de control de versiones como Git para rastrear los cambios en tu código. Esto te permite colaborar eficazmente con los miembros del equipo, revertir a versiones anteriores si es necesario y mantener un historial limpio del desarrollo de tu proyecto. Git proporciona herramientas para revisión de código, ramificación y fusión, facilitando la colaboración y la limpieza del código.

Conclusión

Escribir clean code no es solo un conjunto de reglas, sino una mentalidad y una disciplina. Se trata de crear software que sea fácil de leer, mantener y extender. Al seguir estas mejores prácticas y principios, puedes convertirte en un desarrollador más competente que produce código de alta calidad.

Invertir tiempo en examinar meticulosamente el código de otros ingenieros, particularmente en proyectos de código abierto, puede ser una experiencia reveladora. A través de esta exploración, obtienes valiosas perspectivas sobre diversos estilos y estrategias de codificación. Esta exposición te permite destilar la esencia de escribir bases de código limpias y sostenibles.

Recuerda que el código limpio es un viaje continuo, y con la práctica, se convierte en una segunda naturaleza, llevando a un desarrollo de software más eficiente y agradable.

Más apuntes

Invítame a un café con bitcoins:
1QESjZDPxWtZ9sj3v5tvgfFn3ks13AxWVZ

Bitcoins para café
También puedes invitarme a algo para mojar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Rellena este campo
Rellena este campo
Por favor, introduce una dirección de correo electrónico válida.
Tienes que aprobar los términos para continuar