PRINCIPIOS EN EL DESARROLLO DE SOFTWARE

En los últimos años he visto diversos lenguajes de programación aparecer y otros tantos actualizarse, la industria cambia de forma constante, por lo cual durante un tiempo me enfoqué en aprender lo nuevo de “X” lenguaje y dejé de lado “buenas prácticas” del desarrollo de software, pero sentía que ese proceso no estaba bien, que la calidad de mi código no era buena, así que comencé a estudiar sobre principios en el desarrollo de software y aplicarlos en mis desarrollos con la finalidad de comprenderlos mejor y poder compartir mi aprendizaje.

Hoy puedo decir con base en mi experiencia que escribir código de calidad puede ser complejo, pero no por ello debemos dejar de lado las buenas prácticas, así que de forma personal y resumida les comparto un poco de lo aprendido.

DRY (Don’t repeat yourself)

No escribir código duplicado.

Problema

En trabajos colaborativos es común encontrar código duplicado, propenso a errores y difícil de mantener.

Solución

Extraer y encapsular código, de esta forma el cambio se centraliza en un solo punto


KISS (Keep It Simple Stupid)

Mantenlo simple

Problema

Se crea código general con la expectativa de solventar múltiples problemas a la vez, lo que ocasiona complejidad innecesaria cuando el código crece

Solución

Evita complejidad innecesaria, crea soluciones particulares que resuelvan problemas específicos


YAGNI (You ain’t gonna need it)

No implementar código si no estás seguro de necesitarlo

Problema

Cuando se crea código, tiendes a incluir funcionalidades que no es seguro que se vayan a necesitar, pero crees que pueden servir en algún momento, lo cual satura el código de funcionalidad innecesaria

Solución

Evita implementar código que no estés completamente seguro de que se vaya a utilizar, no te anticipes a situaciones futuras, ya que en la mayorías de los casos se vuelve código zombie


SoC (Separation of Concerns)

Identifica y separa los asuntos en diferentes secciones

Problema

Se escribe el código como un sólo bloque que contiene múltiples componentes en lugar de dividir en pequeños módulos

Solución

Dividir el código en bloques pequeños donde cada bloque sea capaz de ejecutar una sóla acción y diferente de las demás


The Boy Scout rule (Leave the code cleaner than how you found it)

Deja el código mejor de lo que lo encontraste.

  • Los Boy Scouts tienen una regla con respecto al campamento, que deben dejar el campamento más limpio de lo que lo encontraron.

Problema

Cuando el código crece en forma desmedida y se vuelve difícil de mantener a tal punto en el cual es mejor reescribir todo

Solución

Refactorizar con la finalidad de simplificar el código existente y tener mejora continua


LoD (Law of Demeter)

Un objeto debe conocer lo menos posible la estructura o propiedades de otros componentes

  • No hables con extraños

Problema

Cuando se invocan métodos o propiedades de un objeto devueltos por otro objeto. Un objeto de clase A puede solicitar un método de un objeto instanciado de clase B, pero no de forma directa

Solución

Enfocarse en mantener un bajo acoplamiento entre clases

HP (Hollywood Principle) Don’t call us, we’ll call you”.

Una clase debe obtener las referencias necesarias para su ejecución de forma externa, no debe crear sus propios recursos

  • No nos llame, nosotros le llamaremos

Problema

Existe demasiada relación y dependencia entre clases/módulos

Solución

Mantener bajo acoplamiento respecto de las demás clases y alta cohesión para sí misma, su enfoque debe ser particular y de único propósito.


SOLID

Single Responsibility Principle

Una clase debe tener una sóla responsabilidad, es decir, sólo debe hacer una cosa de forma simple y concreta; en caso contrario debemos dividirla

Open/Close Principle

Una clase debe ser abierta para la extensión y cerrada para su modificación, es decir el comportamiento de una clase puede ser extendido agregando código sin tener que modificar el código ya existe, salvo para corrección de errores

Liskov Substitution Principle

Los subtipos deben poder ser reemplazados por sus tipos base sin alterar el funcionamiento. Es decir, el comportamiento no debe verse afectado al sustituir una implementación concreta por otra. El código debe hacer referencia a abstracciones y no a implementaciones a fin de mantener la integridad del mismo

Interface Segregation Principle

Las interfaces deben tener de igual forma una sóla responsabilidad, es preferible dividir y tener múltiples interfaces específicas en lugar de crear una sola interfaz de propósito general, ya que esto obligaría a las clases a implementar métodos que no necesitan.

Dependency Inversion Principle

Debemos depender de abstracciones y no de implementaciones. Las dependencia directas entre clases deben ser sustituidas por abstracciones.

Problema

Cuando el desarrollo se conforma por diferentes módulos y múltiples colaboradores es susceptible de tener redundancias de código, clases cuya finalidad es realizar más de una tarea a la vez, código zombie debido a una mala abstracción de clases base, creación de recursos dentro de los propios componentes lo cual dificulta la realización de pruebas, entre otros.

Solución

Aprendizaje de los principios y comprensión de los mismos, tenerlos en cuenta durante el desarrollo e implementación de soluciones a fin de tener un buen diseño y que el mantenimiento sea sencillo.

Por último, desde un punto de vista personal

Los principios o “buenas prácticas” en el desarrollo de software no son complejos de “aprender”, lo complicado es poder implementarlos de forma correcta, esto requiere de experiencia, mucha práctica y sobre todo tener las ganas de mejorar y cambiar paradigmas.

[… si yo fuera objeto, sería objetivo; como soy sujeto, soy subjetivo… José Bergamín]
Written on May 8, 2020