¿Qué sucede si no usaré patrones de diseño de software? [cerrado]

17

¿Qué tipo de problemas puedo enfrentar si no uso los patrones de diseño de software? ¿Puede contarme sobre los problemas de abordar el diseño utilizando técnicas estándar orientadas a objetos?

Yo, estudiante
fuente
24
Algunos patrones de diseño de software son bastante obvios. Tendrías que conocerlos muy bien para asegurarte de que no los estás usando, ¡probablemente lo suficientemente bien como para que puedas usarlos!
James McLeod
18
Como punto secundario de @JamesMcLeod, muchos "Patrones de diseño" son muy obvios y cosas que todos harían de todos modos. ¿Por qué les damos nombres, entonces? A los efectos de la comunicación. "Estoy usando el patrón X" tiene una densidad semántica mucho mayor que explicar su solución con la esperanza de que el otro extremo diga "¡Oh, sí! También lo he hecho, excepto que llamé a mis variables ...".
Phoshi
66
@AJMansfield Algunos de los peores códigos que he visto involucraban demasiado entusiasmo por los patrones de diseño.
Erik Reppen
55
@ErikReppen la culpa del uso excesivo de los patrones de diseño debe atribuirse a la persona que lo hace. Desde mi perspectiva, el problema central no está en los patrones de diseño en sí, sino en la generalización excesiva (en parte debido a la falta de supervisión arquitectónica) y la ingeniería excesiva (a veces por comités de ingenieros).
rwong
55
"Patrones de diseño" es un léxico, no una técnica.
Kaz Dragon

Respuestas:

76

Te estás perdiendo el punto.

Los patrones de diseño existen inherentemente cuando se hace el diseño de software, al igual que los patrones estructurales existen en el mundo. Incluso si no conoce el nombre de las cosas, eventualmente encontrará que ciertas estructuras físicas son adecuadas para ciertos problemas. Encontrará que una forma de triángulo de madera / barras de metal / etc. es una estructura muy estable, pero solo en un plano. Encontrarás que los ladrillos cuadrados tienen ciertas ventajas sobre los redondos ...

Del mismo modo, ciertas estructuras de software son de alguna manera únicas u óptimas. Eventualmente los encontrará y los usará independientemente de si conoce los nombres de ellos. Ese es el núcleo de lo que son los patrones de diseño: son nombres para estas estructuras que los programadores experimentados conocen y usan de todos modos. Brinda a los programadores la capacidad de comunicarse de manera mucho más uniforme y sucinta. También permite a los programadores pensar en el concepto de patrones de manera más consciente.

Entonces, los dos puntos clave que estoy tratando de hacer:

  1. No se puede no utilizar patrones de diseño.
  2. Al no saber los nombres de las cosas que está utilizando, tendrá dificultades para trabajar en equipo.
Telastyn
fuente
12
+1: absolutamente correcto. Comencé el desarrollo OO antes de que los patrones de diseño se hicieran conocidos o populares. Sí, también inventamos cosas como fábricas, singletons y algo que, al mirarlo con una luz brillante, se parece al patrón de Estrategia. El punto ahora es que conozco patrones de diseño, sé que las fábricas estaban bien, pero podrían haberse hecho mejor, los Singleton estaban mal hechos y lo que podría haber sido un patrón de Estrategia hubiera sido mucho mejor si realmente hubiera sido un patrón de Estrategia.
Binario Worrier
3
... Aprender sobre los patrones de diseño y aprender a usarlos correctamente le ahorra tanto tiempo que es menos probable que intente reinventar la rueda, le impide conducir por un camino hacia un mal diseño y construir malas soluciones. Respire y aprenda los patrones, úselos cuando funcionen para usted y no los use cuando no lo hagan.
Binario Worrier
1
Y esto resume exactamente mis puntos de vista sobre los patrones. Son herramientas maravillosas para comunicar lo que estás haciendo con otras personas. Sin embargo, nunca los construyes exactamente porque cada problema es diferente. Pero son una esencia, una dirección y un conjunto aproximado de pautas a seguir, y hace que sea fácil explicar a los demás qué diablos estás haciendo.
Matt D
+1 para la comparación con estructuras físicas. Agregaría que ayuda a construir una casa si ya sabe que una "armadura" es una buena estructura para soportar la carga de un techo, en lugar de experimentar y esperar que no se derrumbe.
kdgregory
39

Los que no pueden recordar el pasado están condenados a repetirlo.

No enfrentará ningún problema específico que no sean los planteados por su diseño. Y con el tiempo terminarás usando los patrones sin darte cuenta, solo pasaste tiempo descubriéndolos por ti mismo. Conocer los patrones de antemano los hace más fáciles de detectar en el diseño y tiene la gran ventaja de que son probados por varias personas.

Todo lo que se está desarrollando hoy se basa en gran medida en el conocimiento previo, no tendría sentido ignorarlo. Imagine construir un rascacielos hoy sin conocer los problemas que enfrentaron las personas que construyeron catedrales hace cientos de años.

devnull
fuente
10
"Cada cita tiene una comilla igual y opuesta". "Debemos desgarrar el pasado si realmente merecemos el futuro". (OK, ese era Hitler, así que probablemente sea mejor ignorarlo ...)
Russell
20

¿Qué tipo de problemas puedo enfrentar si no uso los patrones de diseño de software?

Tendrá el problema de no poder escribir ningún software.

Las variables son un patrón de diseño.

Los métodos son un patrón de diseño.

Los operadores (suma, resta, etc.) son un patrón de diseño.

Las declaraciones son un patrón de diseño.

Los valores son un patrón de diseño.

Las referencias son un patrón de diseño.

Las expresiones son un patrón de diseño.

Las clases son un patrón de diseño.

...

Todo lo que haces en la programación en todo momento es un patrón de diseño . La mayoría de las veces el patrón está tan arraigado en su pensamiento que ha dejado de pensarlo como "un patrón de diseño". Las cosas que tiene que aprender como "el patrón singleton", etc., son simplemente patrones que (todavía) no se han incorporado al idioma que esté utilizando.

¿Puede contarme sobre los problemas de abordar el diseño utilizando técnicas estándar orientadas a objetos?

No. No tengo idea de lo que significa esta pregunta. Los patrones de diseño son "técnicas estándar orientadas a objetos"; eso es lo que los convierte en patrones de diseño . Un patrón de diseño es una técnica estándar para resolver un problema particular, particularmente (aunque no necesariamente ) en un lenguaje orientado a objetos.

Eric Lippert
fuente
1
The things that you have to learn like "the singleton pattern" and so on are simply patterns that haven't (yet) been baked into whatever language you're using.- Esa es (casi) la definición de un patrón de diseño: una construcción de código flexible / fácilmente reutilizable utilizada para superar una limitación en el lenguaje en sí, que es fácil de comunicar a los demás. Una vez que es parte del lenguaje, ya no es un patrón de diseño.
Izkata
1
@Izkata: ¿Entonces su posición es que, digamos, el patrón de observador es imposible en C # porque C # tiene el patrón de observador incorporado al lenguaje en forma de eventos? Eso es tonto. El bit específico del idioma que es relevante para un patrón es la forma canónica de implementar el patrón en el lenguaje. Por supuesto, los patrones de diseño se pueden usar en idiomas que los admitan directamente; ¡Ese es el objetivo de apoyarlos directamente!
Eric Lippert
Yo no dije imposible, yo estaba tratando de dar a entender innecesaria . Java, por ejemplo , no tiene eventos, por lo que utiliza el patrón de diseño para simularlos.
Izkata
@ Izkata: Estoy confundido entonces. Dijiste que una vez que un patrón es parte del lenguaje, ya no es un patrón. Entonces, ¿es "el patrón observador" un patrón? en Java pero no un patrón en C #?
Eric Lippert
1
O para decirlo de otra manera, un patrón de diseño es algo que un programador hace, que puede describirse en inglés. No estoy seguro de estar totalmente de acuerdo con la definición, pero creo que refleja con precisión lo que estás diciendo y al menos no tiene el beneficio de un juicio subjetivo que cuenta como un patrón. Es una propiedad del análisis de lo que hacen los programadores, y por supuesto no es posible que un programador actúe de una manera que no pueda ser analizada :-)
Steve Jessop
4

Comprender el punto de un patrón de diseño es más importante que usarlo al pie de la letra. Algunos patrones son, en mi opinión, tontos, al menos en los paradigmas lingüísticos a los que estoy acostumbrado. IMO, un programador que simplemente usa patrones de diseño a ciegas y sin comprenderlos realmente es un programador peor que el que quisiera pensar en las cosas por sí mismos. Pero alguien que se familiarice con las ideas y luego decida por sí mismo si valen la pena probablemente sea un programador mucho más fuerte que cualquiera de ellos.

Dicho esto, no tengo ni idea de cuál es el punto del peso mosca y no me da vergüenza admitirlo. (ver comentarios para otra entrada de wikipedia que ayudó mucho)

Recomiendo la entrada de wikipedia sobre patrones de diseño. Está escrito de manera muy concisa y clara. Muy útil para tener una idea de por qué uno podría molestarse con un patrón de diseño dado o no. Personalmente, tiendo a encontrar los más simples, los más útiles, y no pensaría dos veces antes de modificar una implementación dada de cualquier patrón para satisfacer mis necesidades.

Son ideas, no planos. En algunos idiomas no son muy buenas ideas. En otros, son vistos con acierto como acusaciones de superar las debilidades de diseño de un lenguaje que podrían compensarse mejor a través de una menor complejidad. De todos modos, no está de más examinarlos e intentar comprender los desafíos que deben superar antes de decidir sus propias soluciones preferidas.

¿Qué tipo de problemas enfrentarás? Puede perder oportunidades y pasar más tiempo en problemas de lo que necesita a menos que sea un genio de la programación que ya lo tiene todo resuelto. Es importante mantener un ojo crítico de las ideas de programación populares, pero nunca está de más entender qué piensan las personas que están resolviendo porque eso brindará más claridad a sus propias soluciones / enfoques preferidos.

Erik Reppen
fuente
2
peso mosca (no volante). Lea el primer párrafo (y solo el primer párrafo) del artículo de Wikipedia y luego mire Integer.valueOf (int) y considere cuántas veces esto evita crear nuevos enteros para valores comunes.
2
@MichaelT Y maldita sea. Eso lo explicó muchísimo mejor que cualquier cosa que haya visto. Gracias.
Erik Reppen
El problema que veo con la mayoría de las instrucciones del patrón de diseño es que intentan dar una gran vista del proyecto (el libro de GoF se trata de escribir un procesador de textos, no una tarea pequeña). Pero a veces son aplicables a cosas mucho más pequeñas (casi 'triviales'). 7 líneas de código pueden describir limpiamente el peso mosca en algo que todos usan constantemente. Mucho más fácil de entender que los grandes proyectos o ejemplos artificiales.
1
@MichaelT Para mí también es un buen ejemplo de cómo obtener un poco de claridad sobre algo es útil para escribir código en general, incluso si esa idea no tiene un uso inmediato en mi idioma principal, JavaScript, donde la herencia y los cierres de prototipos generalmente se usan para resolver eso. problema. Tener ese momento a-ha todavía me dio algunas ideas que son relevantes.
Erik Reppen
2

El principal problema que enfrentarás es que reinventarás la rueda . Se llaman patrones porque aparecen con frecuencia y de manera predecible.

pgpb.padilla
fuente
0

Incluso si sigue los patrones de diseño, puede terminar con un mal diseño. Los patrones de diseño son naturales y terminarás usando algo de sabor en tu diseño. Tendrás que esforzarte mucho para no usar ninguno de los patrones. No hay razón para condenar los patrones de diseño, lo más importante es elegir los patrones correctos para sus necesidades.

ViSu
fuente
-1

Estás usando patrones de diseño todo el tiempo sin darte cuenta. Muchas bibliotecas estándar en lenguajes populares están diseñadas con patrones de diseño en mente. Un ejemplo es la FileReaderbiblioteca de Java que está diseñada utilizando el patrón de diseño del decorador . Ahora, hablando de su propio código, no está obligado a usar patrones de diseño (en la mayoría de los casos). Un patrón de diseño es una "solución reutilizable para un problema común" , lo que significa que lo ayudará a escribir un código más limpio y fácil de mantener, por lo que depende de usted cuánto desea evitar terminar con un código de espagueti.

Savv
fuente