Qué es el principio Don't Repeat Yourself y su importancia en programación
Es uno de los principios fundamentales en diseño de software y se conoce con las siglas DRY. Te explicaremos en qué consiste y qué debes hacer para no caer en malas prácticas a la hora de escribir el código de tus aplicaciones.
¿Qué es el principio Don’t Repeat Yourself?
Dentro de todos los conocimientos que debes tener en cuenta para mejorar el diseño del software uno de los más sencillos es el principio Don’t Repeat Yourself, conocido muy frecuentemente con el acrónimo DRY. Se basa simplemente en escribir el mismo código una única vez, evitando duplicidad que pueda acarrear dificultades importantes a la hora de mantener los programas.
Este término fue propuesto por Andy Hunt y Dave Thomas en su libro The Pragmatic Programmer, y dice exactamente que «cada pieza de conocimiento debe tener una única y definitiva representación en el sistema». De modo que, en lugar de repetir el código y promover el copia-pega, el principio fomenta la reutilización de las piezas de software como clases o funciones.
Beneficios de aplicar el principio DRY en el desarrollo de software
Veamos ahora una serie de beneficios básicos de la aplicación del principio DRY y la reutilización del código.
Reducción de la redundancia de código
Aplicando el principio DRY estaremos evitando la redundancia del código. Es muy importante que una misma lógica no se repita en varios puntos de la aplicación, ya que dificulta tareas de mantenimiento, escalabilidad, corrección de errores y otras cosas que vamos a mencionar en los siguientes puntos.
Facilita el mantenimiento del código
Cuando una lógica está solo localizada en un artefacto del software, el mantenimiento de las aplicaciones se realiza de una manera más fácil, ya que solamente habrá que modificar una parte concreta del código para poder corregir posibles errores o realizar modificaciones al software.
Por el contrario, si una lógica se ha copiado y pegado en numerosos sitios del programa, cuando tengamos que hacer mantenimiento sobre ella será necesario actualizar el código en varios lugares, lo que multiplica el trabajo que tendremos que invertir para conseguir el objetivo.
Mejora la escalabilidad del software
Igual que ocurre con el mantenimiento, la escalabilidad del software también se ve beneficiada sensiblemente gracias al principio DRY. Si no hay duplicidad, cuando necesitamos actualizar el software para añadir funcionalidades solo tendremos que hacerlo en las piezas de software relacionadas con aquella funcionalidad que estamos añadiendo. Esto permite que el software crezca con menos esfuerzo, comparativamente a si hubiésemos colocado la misma lógica en varios lugares distintos.
Incrementa la legibilidad y comprensión del código
Generalmente un código que no repite la misma lógica en varios lugares tiende a ser más fácilmente entendible, ya que generalmente los nombres de las clases o las funciones / métodos donde se ha colocado ese código nos dirán mucho acerca de su utilidad.
Fomenta la cohesión y modularidad del código
Este principio de diseño de software generalmente ayudará también a la hora de crear código más cohesivo y modular, ya que generalmente se traducirá en extraer funcionalidades a piezas de software que se encargarán de una cosa muy específica, creando funciones y módulos bien definidos que realizan una única tarea bien definida.
Cómo implementar el principio DRY en programación
Con un poco de sentido común podemos entender cómo se debe aplicar el principio DRY en el desarrollo del software. No obstante, vamos a ver las mejores prácticas en los siguientes puntos.
Identificar patrones de código repetitivo
Para evitar duplicar el código debemos identificar qué partes del programa son repetitivas y podrían llegar a realizarse mediante una misma lógica. Esta es una tarea que debemos hacer de manera consciente y constante durante nuestro trabajo de programación.
Abstracción de código en funciones y métodos reutilizables
Una vez que hemos identificado un código repetitivo a otro ya desarrollado, debemos extraerlo en piezas de software reutilizables, como clases, métodos o simples funciones. Esto es lo que se llama crear una nueva abstracción.
Uso de herencia y polimorfismo
En el paradigma de la programación orientada a objetos existen algunos mecanismos básicos para conseguir mejorar la reutilización del código, como es el caso de la herencia. Asimismo, técnicas como el polimorfismo serán también esenciales para que diferentes clases respondan de manera personalizada a la misma interfaz o mensaje.
Creación de componentes y módulos
A la hora de crear nuestras aplicaciones debemos siempre pensar en cómo organizar el código en componentes o módulos. Tener bien estructurado el código ayudará en la aplicación del principio DRY, ya que éstos encapsulan funcionalidad específica y pueden ser reutilizados en diferentes partes del sistema.
Implementación de patrones de diseño
Por último, te recomendamos estudiar acerca de patrones de diseño, ya que te ofrecerán una formación práctica con herramientas muy útiles para aplicar DRY y otros principios de desarrollo de software.
Ejemplos de aplicación del principio Don’t Repeat Yourself
Existen miles de ejemplos donde puedes aplicar el principio DRY en tu día a día como programador. De hecho, si te ves a ti mismo copiando y pegando un pedazo de código en otro lugar de tu aplicación, tendrás seguramente un claro ejemplo de aplicación de DRY.
Vamos a ver ahora algunos claros ejemplos donde puedes aplicar el principio Don’t Repeat Yourself.
Validación de formularios
En lugar de colocar la lógica de validación de los campos de formulario en cada página, puedes crear un módulo de validación que aglutine las distintas funciones que usas a lo largo de toda la página web. Así podrás utilizar esa lógica centralizada en todo el proyecto, incluso la podrás reutilizar a lo largo de distintos proyectos.
Trabajo con fechas
Seguramente habrás tenido que realizar cálculos con fechas y horas en muchas aplicaciones. Si aplicas DRY correctamente tendrás un módulo donde se realicen todos esos cálculos de manera centralizada. Sí recuerdas el famoso efecto 2000 encontrarás que no es más que un fallo introducido en el software por no haber aplicado correctamente DRY.
Consultas con bases de datos
A menudo mezclamos el código de consulta con bases de datos con el código de operaciones o presentación de la información. Esto produce que tengamos el mismo código para selección de registros u otras operaciones contra la base de datos repetido en numerosos puntos del código. Aplicando DRY lo lógico sería centralizar todo el código de acceso a datos en un mismo módulo. Ese módulo es al que se suele llamar modelo en el patrón MVC.
En fin, existen muchos otros ejemplos habituales de aplicación de DRY, como la gestión de errores centralizada, las tareas de construcción de objetos, la creación y uso de interfaces de usuario, generación de reportes, etc. que puedes detectar en tu trabajo diario.
Consejos para mantener el código limpio
Aplicar DRY es un buen recurso para mantener el código limpio, pero hay mucho más que puedes hacer como programador.
Nombrar variables y funciones de forma descriptiva
Nombrado de variables, funciones, clases o métodos es extremadamente importante para conseguir un código limpio y descriptivo. Evita usar nombres genéricos como x o v1. En lugar de ello usa nombres que describan bien el objetivo de esa pieza de software.
Aplicar principios de diseño y buenas prácticas de programación
Documéntate acerca de otros principios de diseño de software como el principio de única responsabilidad (cohesión), KISS (Keep It Simple, Stupid, o simplemente mantenerlo sencillo) o YAGNI (You Ain’t Gonna Need It). Lee acerca de los smell codes y trata de ser consciente cuando programes para no cometerlos.
Comentar el código de manera efectiva
Debemos de evitar siempre introducir comentarios en el código. En lugar de ello debemos procurar hacer código auto-explicativo, usando buenos nombres y una correcta modularización. Cuando estás colocando un comentario en tu código en realidad lo que estás queriendo decir al mundo es que no has conseguido mejorarlo para que pueda ser entendible para cualquier lector. Reserva los comentarios para lugares donde realmente los necesites, como por ejemplo describir el funcionamiento de una expresión regular.
Realizar pruebas unitarias y revisión de código
Realizar pruebas unitarias puede resultar en mayor carga de trabajo, que se compensa a lo largo del tiempo en el que vamos a tener que mantener el software, evitando introducción de errores accidentales y pruebas manuales.
Otra buena práctica es realizar la revisión del código por otros desarrolladores antes de incorporar las modificaciones a la rama principal del software.
Mantener la consistencia en el estilo y la estructura del código
Para conseguir un código suficientemente claro es también muy importante mantener la consistencia. Esto es, aplicar un mismo estilo y decisiones sistemáticamente parecidas durante la programación. También es importante vigilar la estructura del código, tanto en la forma como en la organización, procurando que sea clara, consistente y con un estilo homogéneo. Esto es especialmente importante en los proyectos de los que participen varios desarrolladores.