Patrones de diseño en Python

Los patrones de diseño son un tema muy importante en la ingeniería de software. En este artículo, analizaremos qué son y qué no, y nos sumergiremos en algunas de las categorías más importantes de patrones de diseño en Python.

Introducción

Los patrones de diseño son modelos reutilizables para resolver problemas conocidos y comunes en la arquitectura de software.

Se describen mejor como plantillas para hacer frente a una determinada situación habitual. Un arquitecto puede tener una plantilla para diseñar ciertos tipos de marcos de puertas que encaja en muchos de sus proyectos, y un ingeniero de software, o arquitecto de software, debe conocer plantillas para resolver desafíos de programación frecuentes.

Una buena presentación de un patrón de diseño debe incluir:

  • Nombre
  • Problema motivador
  • Solución
  • Consecuencias

Problemas equivalentes

Si estabas pensando que ese es un concepto bastante difuso, tendrías razón. Por ejemplo, podríamos decir que el siguiente "patrón" resuelve todos tus problemas:

  1. Obtener y preparar los datos necesarios y otros recursos
  2. Haz los cálculos necesarios y realiza el trabajo necesario
  3. Haz registros de lo que estás haciendo
  4. Liberar todos los recursos
  5. ???
  6. Beneficio

Este es un ejemplo de pensamiento demasiado abstracto. Realmente no puedes llamar a esto un patrón porque no es realmente un buen modelo para resolver ningún problema, a pesar de ser técnicamente aplicable a cualquiera de ellos (incluida la preparación de la cena).

En el otro extremo, puede tener soluciones que son demasiado concretas para llamarlas patrón. Por ejemplo, te podrías preguntar si Ordenación rápida es un patrón para resolver el problema de sorting.

Ciertamente es un problema de programación común y QuickSort es una buena solución para ello. Sin embargo, se puede aplicar a cualquier problema de clasificación con poca o ninguna modificación.

Una vez que lo tiene en una biblioteca y puede llamarlo, su único trabajo real es hacer que su objeto sea comparable de alguna manera, realmente no tiene que lidiar con la esencia del mismo para modificarlo para que se ajuste a su problema particular.

Los problemas equivalentes se encuentran en algún lugar entre estos conceptos. Son problemas diferentes que son lo suficientemente similares como para aplicarles un mismo modelo, pero lo suficientemente diferentes como para que este modelo tenga que personalizarse considerablemente para que sea aplicable en cada caso.

Los patrones que podrían aplicarse a este tipo de problemas son lo que podemos denominar significativamente patrones de diseño.

¿Por qué usar patrones de diseño? {#por qué usar patrones de diseño}

Probablemente ya esté familiarizado con algunos patrones de diseño a través de la práctica de escribir código. Muchos buenos programadores finalmente gravitan hacia ellos incluso sin que se les haya enseñado explícitamente o simplemente los toman de los seniors en el camino.

Las motivaciones para crear, aprender y utilizar patrones de diseño son múltiples. Son una forma de dar nombres a conceptos abstractos complejos para permitir la discusión y la enseñanza.

Hacen que la comunicación dentro de los equipos sea más rápida, porque alguien puede simplemente usar el nombre del patrón en lugar de sacar una pizarra. Le permiten aprender de las experiencias de las personas que lo precedieron, en lugar de tener que reinventar la rueda pasando por todo el crisol de mejorar gradualmente las prácticas usted mismo (y tener que encogerse constantemente de su antiguo código).

Las malas soluciones que tienden a inventarse comúnmente porque parecen lógicas a primera vista a menudo se denominan [anti-patrones] (https://en.wikipedia.org/wiki/Anti-pattern). Para que algo se llame justamente un antipatrón, debe reinventarse comúnmente y debe haber un patrón para el mismo problema que lo resuelva mejor.

A pesar de la utilidad obvia en la práctica, los patrones de diseño también son útiles para el aprendizaje. Le presentan muchos problemas que quizás no haya considerado y le permiten pensar en escenarios con los que quizás no haya tenido experiencia práctica en profundidad.

Son imprescindibles para todos, y son un recurso de aprendizaje excepcionalmente bueno para todos los aspirantes a arquitectos y desarrolladores que pueden estar al comienzo de sus carreras y carecen de la experiencia de primera mano para lidiar con varios problemas de la industria. proporciona.

Patrones de diseño en Python

Tradicionalmente, los patrones de diseño se han clasificado en tres categorías principales: Creativo, Estructural y Comportamental. Hay otras categorías, como patrones arquitectónicos o simultaneidad, pero están más allá del alcance de este artículo.

También hay patrones de diseño específicos de Python que se crean específicamente en torno a los problemas que proporciona la estructura del lenguaje en sí o que tratan los problemas de formas especiales que solo están permitidas debido a la estructura del lenguaje.

Patrones de diseño creativo se ocupan de la creación de clases u objetos. Sirven para abstraer los detalles específicos de las clases para que seamos menos dependientes de su implementación exacta, o para que no tengamos que lidiar con construcciones complejas cada vez que las necesitemos, o para que aseguremos algunos propiedades especiales de instanciación. Son muy útiles para bajar los niveles de dependencia y controlar cómo interactúa el usuario con nuestras clases.

Patrones de diseño estructural se ocupan de ensamblar objetos y clases en estructuras más grandes, manteniendo esas estructuras flexibles y eficientes. Tienden a ser realmente útiles para mejorar la legibilidad y la capacidad de mantenimiento del código, garantizar que las funcionalidades estén separadas y encapsuladas correctamente y que haya interfaces mínimas efectivas entre cosas interdependientes.

Patrones de diseño de comportamiento se ocupan de los algoritmos en general y la asignación de responsabilidad entre los objetos que interactúan. Por ejemplo, son buenas prácticas en los casos en los que puede verse tentado a implementar una solución ingenua, como ocupado esperando, o cargar sus clases con código innecesario. para un propósito específico que no es el núcleo de su funcionalidad.

Patrones de diseño creativo {#patrones de diseño creativo}

Patrones de diseño estructural {#patrones de diseño estructural}

Patrones de diseño de comportamiento

¡Próximamente, en breve, pronto!

  • Cadena de Responsabilidad
  • Dominio
  • Iterador
  • Mediador
  • Recuerdo
  • Observador
  • Estado
  • Estrategia
  • Visitante

Patrones de diseño específicos de Python {#patrones de diseño específicos de Python}

¡Próximamente, en breve, pronto!

  • Patrón de objeto global
  • Patrón de método preencuadernado
  • Patrón de objeto centinela

Ver también {#ver también}