¿Qué importancia tienen los patrones de diseño en la programación?

19

Soy un estudiante universitario y acabo de comenzar a aprender sobre patrones de diseño y estoy luchando por comprender el propósito de ellos. He intentado investigarlos, pero todos los recursos que he encontrado parecen hablar de ellos de una manera académica, no profesional.

¿Cuál es su propósito y son importantes para aprender?

Roy James Schumacher
fuente
77
¡Es bueno saberlos para entrevistas de trabajo!
wim
55
Un patrón de diseño es solo una forma nombrada, comúnmente recurrente, de resolver problemas. Por lo general, surgen de deficiencias en los idiomas.
Jon Purdy
77
Comprender el propósito de los patrones de diseño requiere comprender los problemas que resuelven. Comprender estos problemas requiere experiencia para hacerlo de la manera difícil :)
MattDavey

Respuestas:

36

Los patrones de diseño son excelentes para comunicar su intención muy rápidamente: todos saben lo que es una Fábrica.

Lo que es realmente malo , realmente malo, es comenzar a tratar de ajustar su código a los patrones, o separar las responsabilidades de acuerdo con los patrones, o algo así. Una cosa es decir "Este objeto es una Fábrica" ​​y otra decir "Este objeto debe ser exclusivamente una Fábrica".

DeadMG
fuente
1
Entonces, todos ustedes son para patrones, pero en realidad no son para su código. Sí, son buenos para comunicar ideas, pero son aún mejores cuando puede ver el patrón en el código real.
Newtopian
3
¿Por qué votos negativos? Esta es realmente la mejor respuesta en mi humilde opinión. La codificación es de sentido común y, a veces, puede usar rápidamente patrones que encajan bien para resolver el problema. Pero una vez que la gente comienza a abusar de ellos en todas partes, se convierte en un desastre.
Codificador
1
Cada código contiene algún patrón, incluso si no lo conoce. Los patrones de diseño de los que habla solo se reagrupan y nombran un conjunto de patrones ampliamente utilizados y útiles. Cuando los conoces, puedes pensar en ellos de una manera más consciente. Si llama a una de sus clases "ControlDispenser", probablemente nadie sabrá lo que se supone que debe hacer. Sin embargo, si conoce el patrón de fábrica, lo llamará "ControlFactory" y otros lo entenderán de inmediato.
Olivier Jacot-Descombes
44
Si sirve para otro propósito, debería ser otra clase ... separación de preocupaciones.
Nate
2
@Nate: Un propósito puede ser varios patrones. No hay razón para que una clase deba involucrar solo un patrón. Los patrones no son responsabilidades "atómicas". Una sola responsabilidad puede requerir varios patrones.
DeadMG
26

Del artículo de Wikipedia sobre Patrones de diseño :

La utilidad de hablar de patrones es tener una terminología común para discutir las situaciones que los diseñadores ya ven una y otra vez.

Durante mucho tiempo hemos tenido un problema grave en la ingeniería de software: contrata a un recién llegado a un proyecto, y no importa qué tan bien conozcan el lenguaje de programación, les lleva meses actualizarse sobre cómo se hacen las cosas en su proyecto. proyecto antes de que puedan ser productivos. En ingeniería de hardware, resolvieron este problema hace mucho tiempo: tienen una terminología común llamada 'diagramas esquemáticos'. Contratas a un ingeniero de hardware, les das los esquemas de tu proyecto de hardware por la mañana, dejas que los estudien y, al anochecer, antes de que sea hora de llamarlo, pueden recoger el arma de soldadura y ser productivos. Hemos estado tratando de encontrar formas de mejorar en eso; la estandarización de los lenguajes de programación era unidireccional; las bibliotecas estándar (bibliotecas de clases hoy en día) han sido de otra manera; Pero una de las formas más importantes ha sido quizás los patrones de diseño. Entonces, ¿son importantes? Usted apuesta!

Mike Nakis
fuente
3
Comparar el desarrollo de software con la ingeniería eléctrica es casi tan preciso como comparar un cohete Saturno con una bicicleta. Ambos métodos de transporte (yendo del punto A al punto B) pero lo hacen de maneras completamente diferentes y no compatibles.
jer
3
@jer Hmmm, tu analogía es pobre. Ambos son disciplinas de ingeniería. Incluso si sus similitudes terminaran allí, todavía, por definición, tendrían mucho en común. No esperamos igualarlos, pero uno tiene mucho que aprender del otro.
Mike Nakis
66
@ Mike: no es una diferencia fundamental: los circuitos eléctricos están limitadas por los límites físicos duros. Los sistemas de software están limitados por los límites difusos del intelecto humano.
Kevin Cline
3
En primer lugar, no dije que no hay grandes diferencias. En segundo lugar, su declaración tampoco es correcta. El software obedece a restricciones estrictas, las establecidas por la sintaxis de un lenguaje. Y el número de permutaciones en las que el intelecto humano puede interconectar componentes electrónicos también es ilimitado. Pero, de nuevo, no estoy tratando de igualar los dos, o incluso decir que hay una gran similitud. Solo digo que uno tiene mucho que aprender del otro .
Mike Nakis
3
Dado que el software tiene que ver con el diseño, una analogía similar de ingeniería eléctrica sería la discusión del "espejo actual" y la "retroalimentación negativa" en un circuito amplificador. Estos no son componentes discretos en un esquema, sino más bien una disposición de varios componentes que cumple un cierto propósito. Saber cómo conectar los componentes sin conocer sus propósitos no permitirá que una nueva persona haga un nuevo diseño. (es decir, es un paso adelante en la comprensión)
rwong
9

Realmente hay dos razones diferentes y sustanciales para la existencia de patrones.

El primero ya se ha explicado bastante bien: el uso de patrones lubrica la comunicación entre los desarrolladores. Si usted y yo entendemos que cuando digo 'Observador' estoy hablando de una estructura de código muy específica, entonces puedo describir muy rápidamente cómo funciona un fragmento de código que usa ese patrón. La alternativa es describir completamente la solución, que lleva mucho tiempo y es propensa a errores. ("Bueno, creé esta clase virtual pura que describe e interactúa para objetos de consumo, y luego creé una clase que mantiene una lista de consumidores activos, que ...")

El segundo beneficio de los patrones es que son formas de solución estándar para formas de problemas comunes. Si conoce sus patrones y, por ejemplo, encuentra un problema en el que necesita encontrar una buena manera de obtener información de (posiblemente múltiples) objetos productores a múltiples objetos consumidores, sin introducir un acoplamiento innecesario entre clases, reconocerá "esto es un trabajo para un observador! " e inmediatamente sabrá cómo resolver su problema.

Estos beneficios también se refuerzan mutuamente. Le permiten resolver rápidamente ciertas clases comunes de problemas, y luego, cuando haya terminado, puede comunicar rápidamente cómo resolvió el problema.

Contrasta esto con un mundo donde los patrones "no existen". Te encuentras con una de estas clases de problemas, que generalmente no son problemas de diseño triviales, y pasas bastante tiempo buscando una buena solución (que, por cierto, es muy probable que se parezca mucho al patrón apropiado). Entonces, su compañero de trabajo aparece y quiere saber cómo lo resolvió, y pasa una hora discutiendo cómo y por qué.

Todo esto está asociado con una advertencia que debería parecer bastante obvia: no intente forzar problemas en patrones que no encajan. Si el patrón no encaja con el problema, entonces la solución terminará siendo complicada y perderá el beneficio de reducción de esfuerzo de los patrones. Además, dado que su trabajo ya no se ajustará a la comprensión de sus compañeros de trabajo sobre el significado del patrón, perderá el costo del beneficio de comunicación. De hecho, es probable que aumente el costo de la comunicación más allá del costo sin patrones, porque el mal uso del patrón le dará a sus compañeros de trabajo una falsa comprensión de la solución, lo cual es peor que no tener ninguna comprensión.

Ipeet
fuente
2
Es un error pensar que los patrones de diseño son una solución estándar. Son "PATRONES", esto no siempre se traduce en código.
Martin York
Erm, un patrón siempre se traduce en código, eso es casi un hecho, lo que es un problema es que no siempre encajan en el código que tienes o la arquitectura que tienes o las restricciones con las que estás trabajando. es decir, solo porque puede ajustarse un patrón que no necesariamente significa que puede usarlo. Uno podría suponer que eso es lo que quiso decir (pero no me gusta hacer suposiciones).
Murph
5

Los patrones tratan sobre la reutilización de ideas y conceptos y sobre el establecimiento de una plataforma común / consistente para la comunicación de los mismos.

Todos estamos de acuerdo (!) En que, en teoría, la reutilización de código es algo bueno, pero resulta ser más difícil de lo que nos gustaría hacerlo prácticamente (en algunos aspectos esto está cambiando, pero siempre será un desafío ) Pero en realidad, mucho de lo que queremos reutilizar es una forma de hacer las cosas, usar una especie de plantilla para construir una solución a un problema en particular: estos son Patrones. Entonces llega a un caso en el que dice que un buen enfoque para resolver el problema X es usar el Patrón Y y sabemos que los elementos del patrón Y son a, byc y listo. Debido a que los patrones son ampliamente entendidos, no tiene que explicar en profundidad cuál es el beneficio de las comunicaciones.

Lo divertido de los patrones es que los lenguajes y los marcos están evolucionando para proporcionar un mejor soporte para patrones comunes con el efecto neto de que estamos obteniendo más y mejor reutilización de código (¡más y mejores ladrillos de lego!) Debido a la forma en que creamos aplicaciones (implementando patrones ) facilita la reutilización.

Murph
fuente
4

Los patrones de diseño son ladrillos conocidos sobre los que se basa cualquier solución de software. Son importantes debido a las siguientes razones:

  1. Son agnósticos del lenguaje. Una vez que sepa qué patrón de diseño es apropiado para un problema / arquitectura / tarea dada, puede implementarlo en cualquier lenguaje multi-paradigmático (sea C #, Java o Python), la solución será la misma en la mayoría de los casos, solo tiene para adaptar la sintaxis. Esto significa que puede transferir su experiencia de programación en un idioma a otros idiomas siempre que permanezca dentro del mismo dominio problemático (y tal vez incluso a través de dominios).

  2. A pesar del hecho de que los patrones de diseño están vinculados al paradigma de programación , lo que significa que los patrones de diseño para la programación orientada a objetos (los más famosos, también conocidos como patrones "Gang of Four" ). Los patrones le permiten comprender cuál es el mejor paradigma y lo ayudan a ir más allá de la sintaxis.Por ejemplo, he visto muchas implementaciones en C # y Java donde las personas simplemente programaron la forma en que lo hicieron en Basic o Fortran: tienen una mente imperativa perfecta para resolver problemas y usan OOP solo para brindar esta solución, sin herencia , sin polimorfismo, todos los métodos son públicos, etc. Los patrones de diseño te ayudan a mirar detrás de estos conceptos y ver cómo funcionan en la vida real. Lo mismo se aplica al patrón de diseño en otros paradigmas, como la programación funcional.

  3. Los patrones son generalmente una forma práctica de representar ideas y llegaron a la informática desde la arquitectura. Una vez que comprenda la idea detrás de cierto "patrón", puede reconocer fácilmente este patrón en algún otro problema y resolverlo usando este patrón (probablemente ligeramente modificado para abordar mejor su problema). Hay toneladas de patrones diferentes: en la integración de software empresarial , en las pruebas de código fuente, etc. Simplemente busque patrones en los libros de informática.

  4. Además de adquirir buenas prácticas aprendiendo patrones , puede aprender fácilmente cómo evitar errores tontos en su código mediante el estudio de antipatrones . Hay muchos libros con errores comunes en diferentes dominios en forma de antipatrones que son muy entretenidos y al mismo tiempo educativos. ¡Me encantan los nombres de estos antipatrones, por cierto!

Alexander Galkin
fuente
2

Puede pensar en un patrón como una forma comprobada de resolver un problema que usted y otros desarrolladores entienden. Por ejemplo, el problema es crear una lista ordenada de datos, luego puede optar por usar una lista vinculada o poner los datos en un vector y ordenar. Probablemente comprenda ambas opciones porque es posible que ya conozca el patrón de lista vinculada o el patrón de vector de carga y clasificación. Puede conocer los pros y los contras de cada uno y no necesita ver la implementación para comprender lo que está sucediendo.

adam f
fuente
1

Creo que eres un principiante para la programación, no te sugiero que aprendas el patrón de diseño temprano. El patrón de diseño de aprendizaje y comprensión debe basarse en la experiencia del desarrollo de software. Debe tener más práctica para codificar y encontrar qué estilo de código es malo y luego aprender el patrón de diseño para mejorar el diseño.

Mark xie
fuente
1

La utilidad de un patrón de diseño depende del idioma que elija. Cuanto más potente sea el lenguaje que elija, menos necesitará para comprender e implementar patrones de diseño. Un patrón de diseño puede ser una señal de que su lengua chupa no se encuentra una característica incorporada.

Joe Gregorio hizo una gran charla sobre la falta de patrones de diseño en Python

Cesar Canassa
fuente
Gracias por el enlace sobre la falta de patrones de diseño en Python. Editar: ¡Uy! ¡El video ha sido eliminado de esa ubicación! :(
Saurabh Patil
0

Los patrones de diseño son soluciones a problemas comunes encontrados en el desarrollo de software. Siempre hay más de una solución para algunos problemas, y los patrones de diseño lo ayudan a decidir qué solución es la mejor al proporcionarle un conjunto de buenas soluciones a estos problemas comunes.

Mansuro
fuente