Tres hábitos que te ayudarán a entender los patrones de diseño de software

Igual que los escenarios posibles, las opciones de patrones de diseño son múltiples. Aunque no es imposible conocerlos todos para una mente persistente, no podemos esperar dominarlos de inmediato. No puedo ofrecer en este espacio una reseña comprehensiva de los mismos que les haga justicia. Pero a manera de resumen y para introducir el tema, diré que los patrones de diseño se usan para crear componentes de software como clases, objetos y su interacción entre ellos (no confundir con patrones arquitectónicos, que buscan soluciones generales y reutilizables con elementos como el número de capas, repositorios de datos, microservicios, etc.). Normalmente los patrones de diseño se dividen en tres grandes grupos:

  1. Patrones creacionales: Se trata de modos de crear objetos que aumenten la flexibilidad y capacidad de reutilización del código existente. Por ejemplo, el patrón Singleton se utiliza para garantizar que solo exista una instancia de una clase en todo el sistema; un caso de uso común es la conexión a una base de datos o el registro de eventos en una aplicación. En este grupo también tenemos Factory Method, que crea objetos sin especificar la clase exacta del objeto que se creará, y que se puede aplicar para sistemas de pedidos en línea.
     
  2. Patrones estructurales: Aquí la idea es ensamblar objetos y clases en nuevas estructuras mayores, manteniendo flexibilidad y eficiencia. Entre los patrones estructurales se encuentra Adapter, que se utiliza para convertir la interfaz de una clase existente en otra interfaz esperada. Los sistemas de procesamiento de pagos como PayPal y de integración de aplicaciones como Zapier hacen uso de Adapter.
     
  3. Patrones de comportamiento: Se centran en algoritmos y asignación de responsabilidades entre objetos, como Strategy, que se usa para permitir que un objeto tenga un comportamiento intercambiable en tiempo de ejecución. Un caso de uso común es permitir que el usuario seleccione diferentes algoritmos de procesamiento para un mismo conjunto de datos.

Si quieres profundizar en los distintos patrones de diseño te invito a visitar Refactoring Guru: Design Patterns in C#. Mi intención aquí no es sobrecargarte con datos sobre los patrones de software. Más bien quiero contribuir a que alcances claridad sobre dicha información lo antes posible. Para ello, hay tres hábitos esenciales que estoy convencido de que te van a empoderar.

Proactividad

Por distintas razones, a veces los programadores volvemos a examinar un código que desarrollamos hace tiempo. Cuando eso ocurre hay dos tipos de reacciones: una es ver el código sin que nos inspire a cambiarlo; otra es buscar qué se puede hacer mejor con base a lo aprendido. ¿Hay fragmentos de código repetido que podrían ahorrarse? ¿Puede hacerse el código más fácilmente mantenible? ¿Se encuentran todos los posibles errores controlados?

La segunda actitud se trata de ser proactivo en relación a tu aprendizaje y crecimiento profesional, así como crítico de los componentes que tú mismo creaste. Recuerda que si no practicas la autocrítica, probablemente nadie haga este favor por ti.

Las oportunidades de mejorar siempre están ahí; yo te recomiendo que investigues cuáles son. Dicho de otro modo, no te conformes con ser un obrero del software. Aspira a ser un ingeniero, o mejor aún, un científico de la programación; un profesional que esté en constante descubrimiento acerca de lo que puede hacerse mejor.

Buenas prácticas

En artículos anteriores he mencionado la importancia de las buenas prácticas. En efecto, no desestimemos los fallos y aciertos de quienes antes de nosotros se enfrentaron a problemas similares y aprendieron qué hábitos daban mejores resultados. ¿Para qué reinventar el agua tibia?

Seguramente habrás oído mencionar varios de estos principios. Algunos llevan acrónimos de una frase en inglés que los hacen fáciles de recordar, como el principio DRY, “don’t repeat yourself”, o “no te repitas”, para evitar en la medida de lo posible líneas de código iguales; el principio YAGNI, o “you ain’t gonna need it”, o “no lo vas a necesitar”, que recomienda no escribir código que en el momento no es requerido, aunque pueda ser útil en el futuro. O un favorito personal, KISS, o “keep it simple stupid”, para mantener la cuestión lo más sencilla que se pueda.

Además, tenemos las buenas prácticas relativas a las pruebas de código, que deben considerar todos los escenarios posibles; y el control de versiones, facilitado por herramientas, plataformas y repositorios como GitHub o DevOps.

También están las guías de estilo y convenciones correspondientes a lenguajes en específico; así como recomendaciones de diseñar antes de escribir código; no publicar demasiadas herramientas o características a la vez; mantener ambientes de desarrollo, pruebas y producción; y llevar a cabo revisiones de código. Para una explicación a detalle de estos puntos te recomiendo el artículo de Weronika Wlodarczyk, 10 Software Development Practices that Can Positively Impact Your Project.

Ocurre que los patrones de diseño en sí son buenas prácticas y van de la mano de los puntos mencionados arriba. Por lo tanto, seguir buenas prácticas nos lleva a descubrir nuevos patrones. Estos principios se van aprendiendo con la autocrítica mencionada arriba y la crítica de los demás, que te sugiero que solicites activamente.

Pero es importante saber cuándo implementar un patrón de diseño. Podemos caer en el error del sobreuso de patrones, donde queremos implementar un puñado de patrones en toda oportunidad. La abstracción en exceso puede hacer las cosas más complejas de lo que es necesario (en contra de KISS), lo que le va a restar mantenibilidad al producto. Además, si otros toman tu código, van a pasar por una curva de aprendizaje pronunciada, lo que va a consumir horas. Por ello, lo ideal sería equilibrar las buenas prácticas de implementar patrones ya existentes con la buena práctica de mantener el sistema simple.

Búsqueda de experiencia (de calidad)

Quizás estés pensando, “la experiencia está muy bien, pero uno no puede hacerla llegar; simplemente se va adquiriendo con el paso del tiempo, ¿cómo puede ser un hábito?”. Pero yo me estoy refiriendo específicamente a la experiencia de calidad, la cual sí puedes buscar activamente.

La experiencia de calidad no está necesariamente en proporción directa a los años de trabajo como desarrollador. Más bien se obtiene con la variedad de proyectos en los que has trabajado. Si sólo has trabajado con Sistemas Pato 2000, veinte años te van a dar mucha experiencia... redundante. En cambio, si en cinco años tienes diversos proyectos en tu portafolio, más experiencia de calidad vas a tener. El cerebro humano se desarrolla cuando crea nuevas conexiones neuronales, y esto se logra exponiéndolo a situaciones y conceptos nuevos. Insistir sobre la misma ruta neuronal una y otra vez tiene beneficios, pero son limitados.

Si desarrollas en monolítico, vas a sufrir un choque cuando te confrontes con nuevos paradigmas. Por otro lado, mientras más experiencia variada tengas, más versátil será tu mente para entender patrones nuevos.

Entonces, en términos prácticos ¿qué puedes hacer? Si trabajas profesionalmente, procura involucrarte en áreas distintas a la tuya si ya dominas lo que te compete. Comunícate y aprende de quienes saben más. Si no trabajas aún, no te conformes con un solo lenguaje o tecnología y aprende de otros que comparten sus obras o experiencia en línea, como en foros de programación. ¡La colaboración y la comunicación llevan a la innovación!

En breve: Busca el entendimiento, no la acumulación de datos

No te dejes intimidar por la cantidad de información en torno a los patrones de diseño. Considera que en tu carrera vas a enfrentarte a uno, dos o tres proyectos a la vez, de modo que no tienes que tener todos los modelos posibles presentes en cada momento.

Del mismo modo, no desesperes si no tienes suficiente experiencia para entender los patrones; el entendimiento va a venir poco a poco con la misma.

En lugar de ello, procura ser proactivo, sigue las buenas prácticas y busca oportunidades que enriquezcan la variedad de tu experiencia. Esto te traerá la comprensión que buscas, y a medida que esto ocurra, el resto se acomodará solo.

Espero que este artículo te haya sido útil y te haya dado una mejor comprensión del tema. Si tienes alguna pregunta o comentario, no dudes en ponerte en contacto conmigo. Me gustaría ayudarte a alcanzar tus objetivos de tecnología de la información y a brindarte soluciones innovadoras y eficaces para tus proyectos. ¡Gracias por leerme!