➿Principio DRY
El principio DRY, acrónimo de "Don't Repeat Yourself" (No te Repitas), es un concepto fundamental en el desarrollo de software que enfatiza la reducción de la duplicación en el código. La idea detrás de DRY es que cada pieza de conocimiento en un sistema debe tener una única, inequívoca y autoritativa representación dentro de dicho sistema.
Objetivos Principales del Principio DRY:
Evitar la Redundancia: Asegurarse de que no hay bloques de código idénticos o muy similares en diferentes partes del sistema. Si una pieza de lógica necesita cambiar, solo debería necesitar ser actualizada en un lugar, reduciendo el riesgo de inconsistencias y errores.
Facilitar el Mantenimiento: Al tener una sola representación de cada pieza de conocimiento, el mantenimiento y la actualización del código se simplifican, ya que solo hay un lugar donde hacer cambios.
Mejorar la Claridad: El código sin duplicaciones es generalmente más fácil de entender y de seguir. Esto hace que sea más sencillo para los desarrolladores, tanto para los creadores originales como para los nuevos en el proyecto, trabajar con el código.
Optimizar la Reutilización: Fomentar la reutilización de código a través de funciones, módulos, clases, y otros mecanismos de abstracción que encapsulan comportamientos o lógicas que se repiten.
🧱 Clase Básica sin Aplicar DRY
class Product {
constructor(public name: string, public price: number = 0, public size: string = '') {}
toString() {
if (!this.name) throw new Error("name is empty");
if (!this.price) throw new Error("price is zero");
if (!this.size) throw new Error("size is empty");
return `${this.name} - $${this.price}, Size: ${this.size}`;
}
}
🔄 Refactorización para Cumplir con DRY
constructor(public name: string = '', public price: number = 0, public size: string = '') {}
private validateProperty(property: any, propertyName: string): void {
switch (typeof property) {
case 'string':
if (property.length === 0) {
throw new Error(`${propertyName} is empty`);
}
break;
case 'number':
if (property <= 0) {
throw new Error(`${propertyName} is zero or negative`);
}
break;
//Los demas case para cada tipo soportado
default:
throw new Error(`Type of ${propertyName} is not supported for validation`);
}
}
isProductReady(): boolean {
this.validateProperty(this.name, 'name');
this.validateProperty(this.price, 'price');
this.validateProperty(this.size, 'size');
return true;
}
toString(): string {
if (!this.isProductReady()) return "Product is not ready";
return `${this.name} - $${this.price}, Size: ${this.size}`;
}
}
Otro Ejemplo :
🧱 Funciones sin aplicar DRY
function discountForBooks(quantity, price) {
let discount = 0.1; // 10% de descuento para libros
return quantity * price - quantity * price * discount;
}
function discountForGames(quantity, price) {
let discount = 0.15; // 15% de descuento para juegos
return quantity * price - quantity * price * discount;
}
function discountForClothes(quantity, price) {
let discount = 0.2; // 20% de descuento para ropa
return quantity * price - quantity * price * discount;
}
🔄 Refactorización para Cumplir con DRY
function calculateDiscount(quantity, price, discountRate) {
return quantity * price - quantity * price * discountRate;
}
// Uso de la función refactorizada
const booksDiscount = calculateDiscount(10, 100, 0.1); // 10 libros a $100 cada uno con 10% de descuento
const gamesDiscount = calculateDiscount(5, 60, 0.15); // 5 juegos a $60 cada uno con 15% de descuento
const clothesDiscount = calculateDiscount(3, 50, 0.2); // 3 prendas de ropa a $50 cada una con 20% de descuento
Última actualización