Aplicar DRY, KISS y YAGNI en proyectos con Java exige equilibrio. Una interpretación extrema puede generar el efecto contrario: duplicaciones innecesarias, código críptico o funcionalidades recortadas sin validar que eran requeridas. Este capítulo recopila los tropiezos más habituales y ofrece recomendaciones para evitarlos.
El objetivo es detectar a tiempo si estamos tergiversando la idea original del principio y corregir el rumbo antes de introducir deuda técnica.
Veamos cómo una abstracción exagerada puede complicar un simple cálculo de impuestos. El equipo extrajo una clase genérica sin considerar que cada país requiere reglas distintas.
// DRY mal aplicado: abstracción genérica difícil de mantener
class TaxCalculator<T> {
private final Function<T, BigDecimal> baseExtractor;
private final Function<T, BigDecimal> rateExtractor;
TaxCalculator(Function<T, BigDecimal> baseExtractor,
Function<T, BigDecimal> rateExtractor) {
this.baseExtractor = baseExtractor;
this.rateExtractor = rateExtractor;
}
BigDecimal calculate(T item) {
return baseExtractor.apply(item).multiply(rateExtractor.apply(item));
}
}
En la práctica solo existen dos tipos de impuestos y las reglas cambian con frecuencia. Una solución específica, pero clara, simplifica el mantenimiento.
// Solución pragmática: lógica clara y extensible cuando aparezcan nuevos casos
final class ImpuestoService {
BigDecimal calcularIva(Pedido pedido) {
return pedido.subtotal().multiply(new BigDecimal("0.21"));
}
BigDecimal calcularIngresosBrutos(Pedido pedido) {
return pedido.subtotal().multiply(new BigDecimal("0.035"));
}
}
Si surge otro tipo de impuesto, se incorporará con evidencia. Mientras tanto, el código permanece legible y fácil de probar.
Identificar y corregir estos errores mantiene a DRY, KISS y YAGNI como aliados para construir software de calidad, en lugar de transformarlos en reglas rígidas que frenan la entrega de valor.