Neuralpin Logo

Código Limpio y Principios de diseño de software

Escribir código limpio y seguir buenas prácticas nos ayuda en el proceso de desarrollar y mantener software a lo largo del tiempo, nos ahorra tiempo y bugs, así como simplifica las pruebas y hace más fácil el trabajo en equipo.

Principios KISS, DRY y YAGNI

El código limpio tiene como uno de sus pilares el “menos es más” de toda la vida y se aplica a diferentes aspectos, y los desarrolladores tenemos algunos acrónimos para algunos de los principios del código limpio.

Principio KISS - Keep It Simple, Stupid

Evitar la complejidad innecesaria en el código, optar por una documentación simple y concisa, así como optar por interfaces de usuario limpias y claras.

Este principio también abarca el usar nombres claros para nuestras entidades (variables, métodos, interfaces, funciones, clases, etc), y esos nombres deberían significar una sola cosa siempre.

Además al separar nuestro software en capas, cada una debe tener responsabilidades bien definidas.

Principio DRY - Don’t Repeat Yourself

No debes tener código duplicado, duplicar hace que el código sea más complejo y extenso, y cuando sea necesario cambiar alguna parte de este, será necesario cambiar el mismo código en múltiples lugares, dando lugar a trabajo extra y posibles errores.

Este principio incluye copiar y pegar código ya existente para reutilizarlo, pero también incluye en pensar y construir código nuevo teniendo en cuenta su posible reutilización.

Y por último también hay que tener cuidado del código que puede estar en múltiples lugares y que puede lucir diferente, pero que al final de cuentas hace exactamente el mismo funcionamiento.

Principio YAGNI - You Ain’t Gonna Need It

De la mano de todo lo anterior, este principio habla sobre no crear características innecesarias.

Evitar implementar funcionalidades solo porque piensas que posiblemente algún día podrías necesitarlas, en su lugar podríamos optar por implementarlas cuando realmente sean requeridas.

El principio KISS habla sobre evitar la complejidad innecesaria, YAGNI habla sobre enfocarnos en evitar lógica y funcionalidad innecesaria y remover características que no se usen o que sean redundantes.

Siempre será bueno dejar el código mejor de lo que lo encontramos. Cuando nos encontremos con código que no sea muy claro y no cumpla con los principios anteriormente descritos siempre podemos dedicar al menos unos minutos para corregirlo.

Principios SOLID

Este acrónimo por Robert C. Martin, engloba otros 5 principios de diseño de software enfocados al código limpio en la programación orientada a objetos, pero incluso va más allá y apuntan al código flexible, fácil de entender, extender y mantener.

Aunque antes de explicar los principios solid primero hay que tener en cuenta tres cosas:

  • Cada clase que creemos debe servir para un único objetivo claro y bien definido
  • Asegurarnos que las clases interactúan entre sí mediante interfaces
  • Diseñar interfaces pequeñas y las clases solo deben implementar las interfaces que requieran

S - Single responsibility principle

Cada clase debe tener una única responsabilidad. Entre más responsabilidades tenga una clase, más seguido será necesario cambiarla, además de que generará más dependencia en otras clases. Teniendo clases dependientes genera el problema de que muchas salgan afectadas al hacer un solo cambio.

O - Open-Closed principle

Este principio habla sobre que las entidades en nuestro código deben estar abiertas a ser extendidas, pero cerradas a ser modificadas. Debemos crear código modular que pueda ser extendido sin requerir modificaciones.

Esto se consigue mediante abstracción, herencia e interfaces por ejemplo.

L - Liskov substitution principle

Este principio establece que una subclase debe poder sustituir a la clase base de la que hereda sin que el código se rompa.

Por ejemplo, teniendo una función que acepta como argumento objetos de una clase A, esta función debería ser capaz de aceptar también objetos de una clase B que extienden a la clase A y todo debería seguir funcionando correctamente.

I - interface Segregation principle

El principio de segregación de interfaces establece que múltiples interfaces específicas son mejores que una única interfaz de propósito general.

En este principio se tiene en cuenta también que una interfaz debe depender más del código cliente que la llama que del código que la implementa y no debemos obligar al cliente a depender de interfaces innecesarias.

Por lo tanto, una clase debe implementar diferentes interfaces creadas en función de los diferentes clientes.

D - Dependency inversion principle

Finalmente tenemos la inversión de dependencias, que es el principio que establece que las clases deben comunicarse por medio de Interfaces.

El código debe depender de abstracciones y no de implementaciones concretas.