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
, usauserAge
si representa la edad de un usuario, y en lugar decalculate
, 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;
}
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;
}
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;
}
}
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();
}
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");
}
6. Comentarios: Comenta solo cuando sea necesario y evita explicaciones obvias.
-
Ejemplo: En lugar de
// Increase salary by 10%
, nombra tu funciónincreaseSalaryByPercentage(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);
}
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}`);
}
}
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);
});
});
¿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));
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)