DEV Community

The Eagle 🦅
The Eagle 🦅

Posted on

Clean Code vs Mejores Prácticas: ¿Cuál es la Diferencia?

En el desarrollo de software, "Clean Code" y "Mejores Prácticas" son dos conceptos importantes. A veces podrías escuchar comentarios como "Buen trabajo, tu código se ve limpio" o "Aplica mejores prácticas para evitar la deuda técnica la próxima vez". Aunque se superponen, cada uno juega un papel único en la creación de software de alta calidad y mantenible. Vamos a desglosar lo que significa cada término, explorar algunos ejemplos ilustrativos y ver cómo difieren.

¿Qué es "Clean Code"? 📚

"Clean Code" es un libro de Robert C. Martin (Uncle Bob) que proporciona directrices para escribir código que sea fácil de leer, entender y mantener. Aquí hay ocho principios clave que debes conocer:

1. Nombres Significativos: Los nombres deben describir claramente lo que hace una variable, función o clase.

  • Ejemplo: En lugar de x, usa userAge si representa la edad de un usuario, y en lugar de calculate, escribe lo que calcula la función.
 // Malo function calculate(x: number): number { return x * 12; } // Bueno function calculateUserAgeInMonths(userAge: number): number { return userAge * 12; } 
Enter fullscreen mode Exit fullscreen mode

2. Regla del Boy Scout: Deja el código mejor de lo que lo encontraste. Refactoriza y mejora a medida que avanzas.

  • Ejemplo: Si corriges un error y ves código desordenado, límpialo antes de hacer el commit.
 // Antes function fetchUserData(userId: string): any { const data = getDataFromDatabase(userId); return data; } // Después function fetchUserData(userId: string): User { return getDataFromDatabase(userId).user; } 
Enter fullscreen mode Exit fullscreen mode

3. Reducir el Acoplamiento: Minimiza las dependencias entre clases para hacer tu base de código más modular.

  • Ejemplo: Usa inyección de dependencias en lugar de codificar las dependencias directamente.
 // Malo class UserService { private database: Database; constructor() { this.database = new Database(); } } // Bueno class UserService { private database: Database; constructor(database: Database) { this.database = database; } } 
Enter fullscreen mode Exit fullscreen mode

4. Sé el Autor: Escribe código como si contaras una historia. Las funciones deben ser pequeñas y enfocadas.

  • Ejemplo: Piensa en ello como hacer un batido. En lugar de una función gigante que elige frutas, mezcla y sirve, divídela en funciones más pequeñas y enfocadas.
 // Antes function makeSmoothie(fruit: string, liquid: string): void { console.log(`Choosing ${fruit}`); console.log(`Blending ${fruit} with ${liquid}`); console.log(`Pouring the smoothie into a glass`); } // Después function chooseFruit(fruit: string): void { console.log(`Choosing ${fruit}`); } function blend(fruit: string, liquid: string): void { console.log(`Blending ${fruit} with ${liquid}`); } function pourIntoGlass(): void { console.log(`Pouring the smoothie into a glass`); } function makeSmoothie(fruit: string, liquid: string): void { chooseFruit(fruit); blend(fruit, liquid); pourIntoGlass(); } 
Enter fullscreen mode Exit fullscreen mode

5. DRY (No te Repitas): Evita duplicar código creando componentes reutilizables.

  • Ejemplo: Crea una función auxiliar en lugar de copiar y pegar bloques de código.
 // Antes function makeDogSound(): string { return "The dog says: Woof!"; } function makeCatSound(): string { return "The cat says: Meow!"; } // Después function makeAnimalSound(animal: string, sound: string): string { return `The ${animal} says: ${sound}!`; } function makeDogSound(): string { return makeAnimalSound("dog", "Woof"); } function makeCatSound(): string { return makeAnimalSound("cat", "Meow"); } 
Enter fullscreen mode Exit fullscreen mode

6. Comentarios: Comenta solo cuando sea necesario y evita explicaciones obvias.

  • Ejemplo: En lugar de // Increase salary by 10%, nombra tu función increaseSalaryByPercentage(10).
 // Antes function increaseSalary(employee: Employee): void { // Increase salary by 10% employee.salary *= 1.10; } // Después function increaseSalaryByPercentage(employee: Employee, percentage: number): void { employee.salary *= (1 + percentage / 100); } 
Enter fullscreen mode Exit fullscreen mode

7. Manejo de Errores: Maneja los errores de manera clara e inmediata, con mensajes específicos.

  • Ejemplo: Si un archivo no se puede abrir, lanza una excepción con un mensaje sobre la ruta del archivo y el error.
 // Antes function readFile(filePath: string): string { const file = fs.readFileSync(filePath, 'utf8'); return file; } // Después function readFile(filePath: string): string { try { return fs.readFileSync(filePath, 'utf8'); } catch (e) { throw new Error(`Failed to open file ${filePath}: ${e.message}`); } } 
Enter fullscreen mode Exit fullscreen mode

8. Pruebas Limpias: Asegúrate de que tus pruebas sean rápidas, independientes, repetibles, auto-validables y oportunas.

  • Ejemplo: Escribe pruebas unitarias que se concentren en un aspecto de la funcionalidad a la vez.
 // Ejemplo de prueba para una función describe('calculateCircleArea', () => { it('should correctly calculate the area of a circle', () => { expect(calculateCircleArea(5)).toBeCloseTo(78.54); }); }); describe('calculateCylinderArea', () => { it('should correctly calculate the area of a cylinder', () => { expect(calculateCylinderArea(5, 10)).toBeCloseTo(471.23); }); }); 
Enter fullscreen mode Exit fullscreen mode

¿Qué son las "Mejores Prácticas"? 🛠️

Las "Mejores Prácticas" son métodos y técnicas probados para mejorar diversos aspectos del desarrollo de software. Aquí hay seis ejemplos clave que también deberías conocer:

1. Pruebas de Código: Prueba tu código regularmente para detectar errores temprano.

  • Ejemplo: Usa herramientas como Jest para JavaScript o JUnit para Java para automatizar tus pruebas.

2. Legibilidad: Escribe código que sea fácil de leer y entender.

  • Ejemplo: Usa convenciones de nombres consistentes y una clara indentación.

3. Arquitectura: Diseña tu software con una estructura clara.

  • Ejemplo: Aplica patrones como MVC (Modelo-Vista-Controlador) para separar preocupaciones.

4. Patrones de Diseño: Usa patrones establecidos para resolver problemas comunes.

  • Ejemplo: El patrón Singleton asegura que una clase tenga solo una instancia, lo que lo hace ideal para mantener una conexión de base de datos única y eficiente en toda la aplicación. Te dejo un ejemplo en caso de que tengas curiosidad sobre este patrón.
 import { Client } from 'pg'; // Ejemplo con PostgreSQL class DatabaseConnection { private static instance: DatabaseConnection; private client: Client; // Constructor privado para evitar instanciación directa private constructor() { this.client = new Client({ connectionString: process.env.DATABASE_URL, }); this.client.connect(); } // Método estático para obtener la única instancia de la clase public static getInstance(): DatabaseConnection { if (!DatabaseConnection.instance) { // Crear la instancia si no existe DatabaseConnection.instance = new DatabaseConnection(); } return DatabaseConnection.instance; } public async query(text: string, params?: any[]): Promise<any> { return this.client.query(text, params); } } // Ejemplo de uso de la conexión a base de datos singleton const db = DatabaseConnection.getInstance(); // Obtener la única instancia de la conexión a base de datos db.query('SELECT * FROM users WHERE id = $1', [1]) .then(res => console.log(res.rows)) .catch(err => console.error('Database query error:', err)); 
Enter fullscreen mode Exit fullscreen mode

5. Sistemas de Control de Versiones (VCS): Gestiona los cambios de código con herramientas como Git.

  • Ejemplo: Sigue los principios ACID para commits: Atomicidad, Consistencia, Aislamiento y Durabilidad.

6. DRY y KISS: Aplica Don’t Repeat Yourself (DRY) y Keep It Simple and Stupid (KISS).

  • Ejemplo: Simplifica funciones complejas y evita el código redundante.

Diferencias Clave 🔍

  • Alcance: "Clean Code" se enfoca en escribir código limpio y mantenible. En contraste, las "Mej

ores Prácticas" abarcan una gama más amplia de técnicas y estrategias para diversos aspectos del desarrollo de software.

  • Aplicación: "Clean Code" proporciona directrices específicas para mejorar la calidad del código, mientras que las "Mejores Prácticas" ofrecen un enfoque más integral para mejorar la efectividad general del proyecto.

Conclusión 🎯

"Clean Code" es una parte crucial de las Mejores Prácticas, enfocándose en crear código legible y mantenible. Las Mejores Prácticas, por otro lado, abarcan una amplia gama de técnicas para mejorar diferentes aspectos del desarrollo de software. Usar ambos puede mejorar significativamente la calidad y eficiencia de tus proyectos.

¿Cuáles son tus mejores prácticas favoritas para escribir código limpio y gestionar proyectos? Comparte tus consejos y experiencias a continuación—¡ayudémonos mutuamente a evitar esos "dolores de cabeza" y "WTFs" en nuestros viajes de desarrollo! 💬

Top comments (0)