Skip to content

Patrones de Diseño

Un patrón de diseño es una solución documentada y probada para un problema recurrente en el diseño de software. No es un fragmento de código que se copia: es una descripción de cómo resolver un tipo de problema de forma que el resultado sea mantenible, extensible y comprensible por cualquier miembro del equipo.

Los patrones de diseño son el vocabulario compartido del equipo de ingeniería de GM Transport. Cuando un desarrollador dice “usé un Repository pattern para abstraer la persistencia”, cualquier otro desarrollador entiende exactamente la estructura resultante, sus responsabilidades y sus límites, independientemente del lenguaje o servicio en cuestión.

Categorías de patrones

Patrones creacionales

Los patrones creacionales se ocupan de cómo se crean los objetos. Su propósito es desacoplar el código que crea objetos del código que los usa, de forma que cambiar la implementación concreta no requiera modificar el código que la consume.

Los patrones creacionales más relevantes en el stack de GM Transport son:

PatrónUso principal en GM Transport
Factory MethodCreación de instancias de casos de uso en el composition root
Dependency InjectionNestJS @Module providers, Riverpod providers en Flutter
BuilderConstrucción de entidades complejas con validación en el dominio

Patrones estructurales

Los patrones estructurales se ocupan de cómo se componen las clases y objetos para formar estructuras más grandes. Permiten que partes incompatibles de un sistema colaboren a través de interfaces comunes.

PatrónUso principal en GM Transport
AdapterAnti-Corruption Layer entre el dominio y sistemas externos (SAT, Hades)
DecoratorMiddleware en NestJS (@UseGuards, @UseInterceptors)
FacadeGateway que agrupa múltiples llamadas externas en una interfaz simple
RepositoryAbstracción de persistencia en todas las capas de dominio

Patrones de comportamiento

Los patrones de comportamiento se ocupan de cómo los objetos se comunican y distribuyen responsabilidades entre sí.

PatrónUso principal en GM Transport
Observer / Event BusEventos de dominio publicados tras completar un caso de uso
StrategyAlgoritmos intercambiables de conciliación o cálculo fiscal
CommandObjetos de comando inmutables que encapsulan la intención del caso de uso
ProviderGestión de estado en Flutter con Riverpod

Patrones de arquitectura

Los patrones de arquitectura definen la organización a nivel de sistema o de servicio. Son el nivel más alto de aplicación de patrones y tienen el mayor impacto en la mantenibilidad y escalabilidad a largo plazo.

Los patrones de arquitectura documentados en esta sección son:

  • MVC — Separación en Model, View, Controller para servicios web tradicionales
  • VIPER — View, Interactor, Presenter, Entity, Router para aplicaciones Flutter/Dart
  • Clean Architecture — Cuatro capas con la regla de dependencias hacia el dominio
  • Arquitectura Hexagonal — Ports & Adapters para aislar el dominio de la infraestructura
  • Domain-Driven Design (DDD) — Diseño centrado en el dominio de negocio

Relación con los principios SOLID

Los patrones de diseño son la aplicación práctica de los principios SOLID:

  • El Repository pattern aplica DIP: el dominio define la interfaz; la infraestructura la implementa.
  • El Strategy pattern aplica OCP: se agrega un nuevo algoritmo sin modificar el código existente.
  • Separar en Command, Handler y Repository aplica SRP: cada clase tiene una sola razón para cambiar.
  • Interfaces segregadas por caso de uso aplican ISP: los repositorios de lectura y escritura son interfaces distintas.

Ningún patrón es universal. La decisión de aplicar un patrón siempre parte de un problema concreto identificado en el diseño, no de una preferencia estética.

Resumen

  • Los patrones de diseño son el vocabulario técnico compartido del equipo. Su uso reduce la ambigüedad en las revisiones de código y en el diseño.
  • Existen cuatro categorías: creacionales (cómo se crean), estructurales (cómo se componen), de comportamiento (cómo se comunican) y de arquitectura (cómo se organiza el sistema).
  • Los patrones de arquitectura más relevantes en GM Transport son VIPER (Flutter), Clean Architecture y Arquitectura Hexagonal (Go, NestJS).
  • Los patrones son herramientas, no obligaciones. Se aplican donde resuelven un problema real, no para demostrar conocimiento.

alt text

Por favor, entendamos como patrones de diseño a las soluciones a problemas comunes en el desarrollo de software. No sea arrogante y asuma que puede resolver todos los problemas por sí mismo o que su forma de solucionar las cosas es la mejor para usted, piense en equipo, piense en la comunidad, piense en el futuro.

No reinvente la rueda, use patrones de diseño.

Es facil asumir que su lógica es la mejor, pero recuerde que la lógica de su equipo es la que importa, si habla expresandose como:

“Implemente un sistema de cambiar el tema que ni yo mismo se como funciona, pero funciona.”

Entonces, no es un buen código, no es un buen sistema, no es un buen equipo. Piense en el futuro, piense en el equipo, piense en la comunidad. Usted debe hablar de la siguiente manera:

“Implemente un Provider para cambiar el tema porque solo requiero controlar el estado.”.

Esto si es una buena respuesta, esto es un buen código, esto es un buen sistema, esto es un buen equipo. Piense en el futuro, piense en el equipo, piense en la comunidad.

Patrones creacionales

Los patrones creacionales se utilizan para la creación de objetos. Estos patrones proporcionan una forma de encapsular la creación de objetos, permitiendo que el código sea independiente de la forma en que se crean los objetos.

Existen casos en los que la creación de objetos puede ser compleja o costosa, y los patrones creacionales proporcionan una forma de abstraer esta complejidad y reducir el acoplamiento entre las clases. Los patrones son indiferentes a la forma en que se crean los objetos, lo que permite que el código sea más flexible y fácil de mantener. Ademas de ignorar el lenguaje de programación, los patrones creacionales también ignoran la plataforma de desarrollo.

Patrones estructurales

Los patrones estructurales se utilizan para definir la estructura de las clases y objetos. Estos patrones permiten que las clases y objetos se compongan en estructuras más grandes, facilitando la creación de sistemas complejos.

Los patrones estructurales se utilizan para definir cómo las clases y objetos se relacionan entre sí, y cómo se pueden combinar para formar estructuras más complejas. Estos patrones permiten que los desarrolladores creen sistemas que sean fáciles de entender y mantener, y que puedan adaptarse a los cambios en los requisitos del sistema.

Patrones de comportamiento

Los patrones de comportamiento se utilizan para definir cómo los objetos interactúan entre sí. Estos patrones permiten que los objetos se comuniquen de manera eficiente, facilitando la creación de sistemas que respondan a eventos y cambios en el entorno.

Los patrones de comportamiento se utilizan para definir cómo los objetos se comunican entre sí, y cómo pueden responder a eventos y cambios en el entorno. Estos patrones permiten que los desarrolladores creen sistemas que sean fáciles de entender y mantener, y que puedan adaptarse a los cambios en los requisitos del sistema.

Patrones de arquitectura

Los patrones de arquitectura son patrones de diseño de alto nivel que se utilizan para definir la estructura general de un sistema. Estos patrones proporcionan una forma de organizar y coordinar los componentes de un sistema, facilitando la creación de sistemas complejos y escalables.

Los patrones de arquitectura se utilizan para definir la estructura general de un sistema, y cómo los componentes de ese sistema se relacionan entre sí. Estos patrones permiten que los desarrolladores creen sistemas que sean fáciles de entender y mantener, y que puedan adaptarse a los cambios en los requisitos del sistema.

Patrones de diseño y principios SOLID

Los patrones de diseño y los principios SOLID son herramientas poderosas que los desarrolladores pueden utilizar para crear sistemas de software de alta calidad. Los patrones de diseño proporcionan soluciones a problemas comunes en el desarrollo de software, mientras que los principios SOLID proporcionan pautas para escribir código limpio y mantenible.

Referencias