DRY - Don't repeat yourself

Original
This publication's author has indicated that the content is his/her own.
Your avatar
by
Buenas Prácticas
Your avatar
by
Buenas Prácticas
DRY - Don't repeat yourself

Hola! Antes de entrar en materia, dejad que me presente brevemente y os explique un poco la motivación que me ha llevado a empezar a crear este contenido.

Soy desarrollador de software desde hace más de 15 años, orientado sobre todo al ámbito de la web.  He pasado tanto por consultorías como por empresas de producto y ahora aquí me tenéis en Mamby tratando de divulgar algo del conocimiento y la experiencia que mi carrera profesional me ha permitido adquirir.

A lo largo de mi carrera he coincidido con compañeros a los que les costaba mucho hacer código que fuese mantenible. En muchas ocasiones hacían algo que a los pocos días de haberlo hecho, no podían entender su funcionamiento.Este es un problema real del día a día de los desarrolladores de software, si no se aplican una serie de buenas prácticas, a medio-largo plazo cualquier proyecto puede convertirse en una pesadilla de mantener.

Un gran operario de tornos vale varias veces más que un operario medio, pero un gran escritor de código vale 10.000 veces el precio de un desarrollador medio- Bill Gates

Me gustaría que mi contenido sirviese a aquellos desarrolladores con poca experiencia (o no tan poca) para mejorar sus habilidades con la programación. Para ello iré añadiendo contenido de nivel básico para poco a poco ir aumentando la complejidad.

En este primer capítulo, hablaremos sobre la duplicidad de código o más bien, de cómo evitarla.

El problema

Si alguno de vosotros ha trabajado en alguna consultoría de desarrollo, os habréis encontrado seguramente con código repetido en dos o más lugares del proyecto, debido a diferentes factores como por ejemplo, la falta de tiempo, falta de experiencia o simplemente pereza de la persona que duplicó en lugar de fomentar el uso de las buenas prácticas.

El hecho de tener código duplicado en tu proyecto no en todos los contextos es una mala práctica, aunque por norma general así suele serlo.

Uno de los principales problemas que conlleva duplicar código es que en caso de tener que modificarlo, el trabajo es doble, triple o tantas veces como copias de ese código tengas en tu proyecto. Por lo que un cambio en el código, requerirá de más esfuerzo y tiempo por vuestra parte.

Otro de los problemas más importantes es que la superficie de vuestra aplicación vulnerable a fallo se va a multiplicar. 

El ejemplo

Supongamos que trabajáis para una tienda online. Llega vuestro superior un dia y nos pide que desarrollemos una nueva funcionalidad para el carrito de compra.Quiere aumentar la conversión de clientes potenciales introduciendo cupones descuento. Para ello nos pide que en los pasos 1, 3 y 5 del carro de la compra, aparezca un campo de texto que permita al cliente introducir un texto que abarate el precio de la cesta.

¿Cómo abordariamos esta funcionalidad?

Según mi experiencia, el desarrollador medio, este sería el posible resultado de la funcionalidad. 

# Ejemplo en PHP

class CartController extends Controller {
    public function stepOne(Request $request): Response {
        $discountCoupon = $request->get('discount_coupon');

        if ($discountCoupon) {
            // Lógica para aplicar o desconto
        }

        return new Response(...)
    }
    
    public function stepThree(Request $request): Response {
        $discountCoupon = $request->get('discount_coupon');

        if ($discountCoupon) {
            // Lógica para aplicar o desconto
        }

        return new Response(...)
    }
    
    public function stepFive(Request $request): Response {
        $discountCoupon = $request->get('discount_coupon');

        if ($discountCoupon) {
            // Lógica para aplicar o desconto
        }

        return new Response(...)
    }
}

Como se aprecia, hay código repetido tres veces dentro de este controlador que se encarga de mantener el carrito de nuestra tienda online. Este código es perfectamente funcional y podría funcionar durante años sin problema.Pero a las dos semanas, vuelve a llegar nuestro superior y nos pide que todos los cupones deben comenzar ahora con un prefijo 'CUP' y si no es así, debemos mostrar al cliente un mensaje de error.

Llegados a este punto y con el código que hemos desarrollado, deberíamos escribir nuestro código en uno de los pasos y copiarlo nuevamente en los dos casos adicionales. Siendo muy optimistas, este cambio lo realizará el mismo desarrollador que implementó la funcionalidad en primera instancia y se acordará de que al menos duplicó el código una vez, por lo que copia el código en los pasos uno y cinco, dejando el tres sin modificar.Al cabo de unos dias empiezan a aplicarse descuentos con cupones sin prefijo y el lío está asegurado.

¿Cómo evitamos este problema?

Si todo ese código para aplicar un descuento estuviese centralizado, este problema no se hubiese producido.

Con una simple abstracción (Qué es la abstracción) podríamos haber evitado esta situación.

# Ejemplo en PHP

class CartController extends Controller {
    public function stepOne(Request $request): Response {
        $discountCoupon = $request->get('discount_coupon');

        if ($discountCoupon) {
            $this->aplicaDescuento($discountCoupon);
        }

        return new Response(...)
    }

    public function stepThree(Request $request): Response {
        $discountCoupon = $request->get('discount_coupon');

        if ($discountCoupon) {
            $this->aplicaDescuento($discountCoupon);
        }

        return new Response(...)
    }

    public function stepFive(Request $request): Response {
        $discountCoupon = $request->get('discount_coupon');

        if ($discountCoupon) {
            $this->aplicaDescuento($discountCoupon);
        }

        return new Response(...)
    }
    
    private function aplicaDescuento(string $discountCoupon): void {
        // Lógica para aplicar descuento
    }
}

Ahora disponemos de la lógica para aplicar cupones en un único lugar, por lo que si añadiésemos las modificaciones para comprobar que el cupón tiene un prefijo, afectaría a todos los pasos en los que el cliente puede meter un cupón descuento.

Haremos puntualizaciones sobre DRY en futuras publicaciones matizando en que contextos es viable duplicar código, ya que este principio, choca a veces con otros y está en nuestra mano, tomar la decisión más acertada para cada etapa de nuestros proyectos.

El próximo capitulo abordaremos otro de los errores que mayormente cometemos en nuestras primeras fases como desarrolladores. Complicar en exceso nuestro código. Veremos como evitarlo con ejemplos haciendo uso del principio KISS (Keep it super simple).

9
programacion
Aprenderaprogramar
goodpractices
buenaspracticas
DRY
DontRepeatYourself
KISS
6.59€
Activate your creator plan and start monetizing like this post
Donate
Cheer up, leave your comment