Escribe codigo limpio usando las mejoras prácticas

Yo Quiero Programar #YQP

Cultivar la maestría en la confección de código pulcro se convierte en una competencia vital para cualquier profesional inmerso en el vasto terreno del desarrollo de software. El código meticulosamente organizado no solo simplifica el mantenimiento y la comprensión de la base de código, sino que también despierta la sinergia colaborativa entre los integrantes del equipo. En este minucioso análisis, exploramos con profundidad qué implica exactamente el concepto de código limpio, por qué ostenta una trascendencia ineludible, y proporcionaremos un compendio exhaustivo de las mejores prácticas y principios para guiarle en la creación de código nítido y de mantenimiento sencillo.

¿Que es un código limpio?

El código limpio se define por su legibilidad, comprensión y adaptabilidad sin complicaciones. Este código evita la complejidad, las redundancias y las confusiones innecesarias. El código limpio adhiere rigurosamente a un conjunto de convenciones y mejores prácticas que garantizan su coherencia, facilitando la colaboración de diversos desarrolladores en un mismo proyecto sin dificultades.

¿Por qué es importante?

Veamos la relevancia del código limpio, antes de sumergirnos en diversas estrategias sugeridas y principios que te orientarán en la creación de código limpio. 

Hay 5 razones por la cuales es importante:

  1. Legibilidad, El código nítido se caracteriza por su facilidad de lectura, lo cual señala que cualquier persona, incluyendo tu futuro yo, puede comprenderlo con rapidez. Esta disminución en el tiempo requerido para entender la funcionalidad del código conduce a un desarrollo y depuración más expeditos.
  2. Mantenibilidad, La inspección del código es una práctica más frecuente que su creación. Al elaborar código cristalino, se facilita enormemente la tarea de mantener y expandir la aplicación a lo largo del tiempo. Este aspecto se convierte en un elemento crucial en el ciclo de vida del desarrollo de software, donde los proyectos tienden a experimentar evolución y expansión continuas.
  3. Colaboración, La claridad en el código actúa como catalizador para la colaboración. Cuando el código es transparente y tiene una organización precisa, otros miembros del equipo pueden sumarse al trabajo de manera eficiente. Esto agiliza la asignación de tareas y facilita el trabajo simultáneo en distintas partes del código base.
  4. Reducción de errores, La transparencia en el código reduce la probabilidad de cometer errores. El código que resulta difícil de comprender tiene mayores posibilidades de contener errores durante las modificaciones o mejoras.
  5. Eficiencia, la claridad en el código se traduce en eficiencia. Por lo general, su ejecución es más veloz y consume menos recursos al evitar operaciones superfluas y complejidades.

Lineamientos sugeridos y pilares esenciales para la creación de código límpido.

Nombres significativos de variables y funciones

Optemos por denominaciones descriptivas al designar variables, funciones, clases y demás identificadores. La elección reflexiva de nombres tiene el poder de expresar de manera nítida el propósito de la entidad, elevando así la compresibilidad del código. Abstenerse de usar nombres de variables compuestos por una sola letra o abreviaturas crípticas.

# Bad variable name
x = 5

# Good variable name
total_score = 5

Asegúrese de que las funciones y los métodos sean breves.

Es esencial que las funciones y los métodos sean concisos y se centren en una sola tarea. Según el Principio de Responsabilidad Única (SRP), una función debe realizar una tarea específica y hacerlo de manera eficaz. Las funciones más cortas son más accesibles en términos de comprensión, prueba y mantenimiento. En caso de que una función se vuelva demasiado extensa o compleja, se sugiere dividirla en funciones más pequeñas y manejables.

// Long and complex function
function processUserData(user) {
    // Many lines of code...
}

// Refactored into smaller functions
function validateUserInput(userInput) {
    // Validation logic...
}

function saveUserToDatabase(user) {
    // Database operation...
}

Comentarios y documentación

Utiliza los comentarios con moderación y, cuando lo hagas, asegúrate de que sean informativos. Se busca que el código sea autoexplicativo en la mayor medida posible. La documentación, que incluye comentarios en línea y archivos README, auxilia a otros desarrolladores en comprender el propósito y la utilización de tu código. Asegúrate de documentar de manera detallada algoritmos complejos, decisiones no triviales y API públicas

# Bad comment
x = x + 1  # Increment x

# Good comment
# Calculate the total score by incrementing x
total_score = x + 1

Formato y sangría coherentes

Conserva un estilo de codificación y sangría uniformes para garantizar que la base de código luzca limpia y organizada. La mayoría de los lenguajes de programación cuentan con estándares de codificación respaldados por la comunidad (como PEP 8 para Python, esLint para JavaScript) que se espera que sigas. La coherencia también se extiende a las convenciones de nomenclatura, el espaciado y la estructura del código.

// Inconsistent formatting
if(condition){
    doSomething();
  } else {
      doSomethingElse();
}

// Consistent formatting
if (condition) {
    doSomething();
} else {
    doSomethingElse();
}

Principio DRY (Don’t Repeat Yourself) 

Evite la redundancia de código. La repetición de código complica su mantenimiento y aumenta el riesgo de inconsistencias. Abstraiga las funcionalidades comunes en funciones, métodos o clases para fomentar la reutilización del código. Cuando necesite realizar un cambio, sólo deberá hacerlo en un único lugar.

Imaginemos que está desarrollando una aplicación en JavaScript que calcula el precio total de los artículos en un carrito de compras. Inicialmente, dispone de 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 una computadora portátil. A continuación, se presenta el código inicial:

function calculateBookPrice(quantity, price) {
    return quantity * price;
}

function calculateLaptopPrice(quantity, price) {
    return quantity * price;
}

Aunque estas funciones cumplen su propósito, contravienen el principio DRY, ya que la lógica para calcular el precio total se repite para distintos tipos de artículos. Si se presentan más tipos de elementos para calcular, existe el riesgo de duplicar esta lógica. Para seguir el principio DRY y mejorar la capacidad de mantenimiento del código, se puede llevar a cabo una refactorización de la siguiente manera:

unction calculateItemPrice(quantity, price) {
    return quantity * price;
}

const bookQuantity = 3;
const bookPrice = 25;

const laptopQuantity = 2;
const laptopPrice = 800;

const bookTotalPrice = calculateItemPrice(bookQuantity, bookPrice);
const laptopTotalPrice = calculateItemPrice(laptopQuantity, laptopPrice);

En este código revisado, se encuentra una sola función, calculateItemPrice, encargada de calcular el precio total de cualquier tipo de artículo en función de la cantidad y el precio proporcionados como argumentos. Esto se ajusta al principio DRY, ya que la lógica de cálculo ya no se duplica.

Ahora, es posible calcular de manera directa el precio total de libros, portátiles o cualquier otro tipo de artículo llamando a calculateItemPrice con los valores correspondientes de cantidad y precio. Este enfoque promueve la reutilización, mejora la legibilidad y facilita el mantenimiento del código, reduciendo así el riesgo de errores derivados de la duplicación de código.

Usar espacios en blanco significativos

Aplique un formato apropiado al código mediante la inclusión de espacios y saltos de línea. Esto realza la legibilidad. Haga uso de espacios en blanco para distinguir las secciones lógicas del código. Un código bien estructurado resulta más sencillo de inspeccionar, aliviando así la carga cognitiva de los lectores.

// Poor use of whitespace
const sum=function(a,b){return a+b;}

// Improved use of whitespace
const sum = function (a, b) {
    return a + b;
}

Manejo de errores

Maneja los errores con elegancia. Introduce bloques try-catch o los mecanismos de control de errores pertinentes en el código. Esto impide bloqueos inesperados y provee información valiosa para la depuración. Evita la supresión de errores o simplemente registrarlos sin una respuesta adecuada.

// Inadequate error handling
try {
    result = divide(x, y);
} catch (error) {
    console.error("An error occurred");
}

// Proper error handling
try {
    result = divide(x, y);
} catch (error) {
    if (error instanceof ZeroDivisionError) {
        console.error("Division by zero error:", error.message);
    } else if (error instanceof ValueError) {
        console.error("Invalid input:", error.message);
    } else {
        console.error("An unexpected error occurred:", error.message);
    }
}

Pruebas

Redacta pruebas unitarias para asegurar la corrección de tu código. La metodología del desarrollo guiado por pruebas (TDD) puede ayudarte a producir un código más pulcro al forzarte a contemplar casos límite y comportamientos esperados desde el principio. Un código exhaustivamente probado es más fiable y más sencillo de refactorizar.

// Example using JavaScript and the Jest testing framework
test('addition works correctly', () => {
    expect(add(2, 3)).toBe(5);
    expect(add(-1, 1)).toBe(0);
    expect(add(0, 0)).toBe(0);
});

Refactorización

Realiza la refactorización de tu código de forma regular. A medida que cambien los requisitos y profundices en tu comprensión del dominio del problema, ajusta el código en consecuencia. La refactorización es clave para mantener un código claro a medida que evoluciona el proyecto. No temas revisar y mejorar el código existente cuando sea necesario.

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

function calculateTotalPrice(cartItems) {
    let totalPrice = 0;
    for (const item of cartItems) {
        totalPrice += item.price;
    }
    return totalPrice - (totalPrice * 0.1); // Apply a 10% discount
}

Inicialmente, esta función calcula el precio total y aplica un descuento fijo del 10%. Sin embargo, a medida que el proyecto evoluciona, te percatas de la necesidad de admitir descuentos variables. Con el objetivo de refactorizar el código y proporcionarle mayor flexibilidad, puedes introducir un parámetro de descuento:

function calculateTotalPrice(cartItems, discountPercentage) {
    if (discountPercentage < 0 || discountPercentage > 100) {
        throw new Error("Discount percentage must be between 0 and 100.");
    }

    let totalPrice = 0;
    for (const item of cartItems) {
        totalPrice += item.price;
    }

    const discountAmount = (totalPrice * discountPercentage) / 100;
    return totalPrice - discountAmount;
}

En el código refactorizado:

  • Incorporamos un parámetro discountPercentage en la función calculateTotalPrice, lo que te posibilita especificar el porcentaje de descuento al invocar la función.
  • Realizamos la validación del parámetro discountPercentage para asegurarnos de que se ubique dentro de un rango válido (del 0 al 100 %). Si está fuera de este rango, lanzamos un error.
  • La determinación del descuento ahora se basa en el discountPercentage proporcionado, otorgando así mayor flexibilidad y adaptabilidad a la función frente a requisitos cambiantes.

Al reestructurar el código de esta forma, has mejorado su flexibilidad y capacidad de mantenimiento. Puedes ajustar fácilmente la función para manejar diversos escenarios de descuento sin necesidad de reescribir la lógica completa. Esto subraya la importancia de la refactorización regular del código conforme el proyecto progresa y los requisitos experimentan cambios

Control de Versiones

Adopta sistemas de control de versiones como Git para rastrear las modificaciones en el código. Esto te posibilita colaborar de manera efectiva con los miembros del equipo, regresar a versiones anteriores si es preciso y mantener un historial ordenado del desarrollo de tu proyecto. Git ofrece herramientas para revisar, bifurcar y fusionar código, simplificando así la colaboración y elevando la calidad del código.

Conclusiones

Adoptar la filosofía de escribir código limpio es más que seguir reglas; implica asumir una mentalidad y disciplina. El propósito es desarrollar software fácil de leer, mantener y expandir. Al abrazar estas prácticas recomendadas y principios, puedes transformarte en un desarrollador más competente, capaz de producir código de alta calidad. Tomarte el tiempo para analizar minuciosamente las bases de código de otros ingenieros, especialmente en proyectos de código abierto, puede ser una experiencia reveladora. A través de esta exploración, obtendrás información valiosa sobre diversos estilos y estrategias de codificación. Este proceso te permite destilar la esencia de escribir bases de código limpias y sostenibles. Recuerda que la búsqueda del código limpio es un viaje continuo y, con la práctica, se convierte en una segunda naturaleza, conduciendo a un desarrollo de software más eficiente y gratificante.

0 0 votos
Valora la Publicación
Suscribirse
Notificarme de
guest
0 Comentarios
Más votados
Nuevos Viejos
Feedback en línea
Ver todos los Comentarios