¿Diferencia entre idioma y patrón de diseño?

39

¿Cuál es la diferencia entre modismo y diseño-patrón? Parece que estas terminologías se superponen en alguna parte; donde exactamente, no lo sé. ¿Son intercambiables? ¿Cuándo debo usar qué?

Aquí hay una lista de modismos de C ++. ¿Puedo llamarlos patrones de diseño?

Wikipedia define,

Programa de modismos como un patrón de diseño de bajo nivel

Qué significa eso? ¿Qué significa "bajo nivel" aquí?

Esta pregunta está inspirada en otra pregunta: https://stackoverflow.com/questions/7343531/are-the-some-design-patterns-language-dependent

Nawaz
fuente
En términos prácticos, la distinción puede ser difícil de determinar (y puede haber algún continuo entre un idioma y un patrón de diseño). Pero probablemente se deriva del término "idioma" en lenguaje natural: en.wikipedia.org/wiki/Idiom (que realmente no se ajusta al uso).
Merlyn Morgan-Graham
2
Esto probablemente sea más adecuado para los programadores SE.
Oliver Charlesworth
3
@Nawaz: un "Patrón de diseño" es una construcción relativamente de "alto nivel" en torno a un defecto del lenguaje. Un "idioma" es una construcción relativamente de "bajo nivel" en torno a un defecto del lenguaje; )
Tristan St.
@ Nawaz- +1 para el humor.
Jennifer S
Ver también Idiom vs. patrón .
MS Dousti

Respuestas:

30

Un modismo es una idea para evitar las peculiaridades de un idioma. Algunos ejemplos que vienen a la mente son cualquiera de los modismos de C ++ que vinculó en la pregunta original. Resuelven un problema común en ese idioma de manera enlatada.

Un patrón de diseño es similar, ya que resuelve un problema común. Pero el patrón de diseño ideal se basa en características de lenguaje comunes y, por lo tanto, es independiente del lenguaje.

Sin embargo, hay un continuo entre modismos y patrones de diseño, al igual que hay de lenguajes de bajo nivel a de alto nivel.

El patrón de visitante es un buen ejemplo; si solo hubiera un idioma que solo admitiera un despacho dinámico único, entonces podríamos considerar el patrón Visitor como un idioma de ese idioma. Pero hay hordas enteras de idiomas que no admiten directamente el envío múltiple. Por lo tanto, nació el patrón Visitante.

También me viene a la mente el patrón Observador: C # lo admite directamente, por lo que no necesita la forma común del patrón.

Un ejemplo que va en la otra dirección son las características OO (herencia, polimorfismo, etc.). C no los apoya directamente. Si más lenguajes fueran como C, entonces podríamos desarrollar patrones de diseño para implementar tablas v, type-safety, etc. Dado que muchos lenguajes admiten esas características, llamaríamos a cualquier solución común en C una expresión idiomática, en lugar de llamar al generalizado solución un patrón de diseño.

Merlyn Morgan-Graham
fuente
2
Otro ejemplo interesante: API de sintaxis fluida. Ellos compensan el hecho de que no tiene soporte DSL directo en su idioma, y ​​esto cruza los límites del idioma. No estoy seguro de que se haya graduado a un estado de "Patrón de diseño" todavía, y suena como un idioma sintáctico ...
Merlyn Morgan-Graham
El hecho de que C # soporta directamente el patrón de observador parecería indicar que lo hace tener una enorme necesidad de que el patrón, tanto es así que se cambió la implementación lejos de los desarrolladores y en el lenguaje mismo.
jaco0646 23/0318
@ jaco0646 Reescribí esa línea, podría ser más clara ahora
Merlyn Morgan-Graham
37

Los patrones de diseño no suelen ser específicos del idioma. Las expresiones idiomáticas tienden a depender de la característica particular de un idioma (o clase de idiomas) o evitan una deficiencia específica en dicho idioma (s).

µBio
fuente
+1 para establecer una distinción con pocas palabras y pocas imprecisiones.
Merlyn Morgan-Graham
1
@ Merlyn Morgan-Graham: Has comentado sobre casi todas las respuestas, incluida la pregunta. Entonces, ¿por qué no publica una respuesta detallada sin inexactitudes ? Me gustaría saber tus pensamientos.
Nawaz
1
@Nawaz: El comentario fue sobre las otras respuestas. Este ya es casi perfecto. Idealmente me gustaría obtener muestras en una respuesta, pero parece que nadie las está respondiendo correctamente. Probablemente tampoco podría, de lo contrario lo complacería felizmente :)
Merlyn Morgan-Graham
@Nawaz: Está bien, lo intenté de todos modos :)
Merlyn Morgan-Graham
12

No pondría demasiada moneda en la definición de Wikipedia.

Como mínimo, una expresión idiomática es específica del idioma, mientras que un patrón de diseño se esfuerza, o debería esforzarse, por ser independiente del lenguaje. Yendo más allá, las expresiones idiomáticas suelen ser convenciones para mejorar la legibilidad, o son la alternativa superior (por algún mérito técnico) cuando hay más de una forma de hacer algo. Todas esas cosas están relacionadas con la forma en que se expresan las ideas (claridad, verbosidad, concisión), pero no con las ideas mismas.

Por otro lado, los patrones de diseño son la esencia de una idea recurrente, una idea que a priori se puede expresar en cualquier idioma que se le preste. El visitante es una implementación de doble despacho que se basa en un solo despacho y sobrecarga, y esto se puede usar en cualquier idioma que tenga un solo despacho y sobrecarga. Conocer el patrón no ayuda a escribir un código más expresivo o más legible, ayuda a resolver el problema relacionado. No tiene nada de idiomático porque, por ejemplo, no existe una forma canónica del Visitante, por ejemplo, en C ++.

Luc Danton
fuente
1
+1; Buena respuesta. Aunque estoy inclinado a creer todo aquí, excepto el último bit. Hay idiomas que tienen soporte directo para el envío múltiple, por lo que el patrón Visitor no necesitaría existir allí. Desde su perspectiva, el "patrón" podría ser más un idioma. Desde el último lenguaje de alto nivel, todos los patrones pueden convertirse en modismos ...
Merlyn Morgan-Graham
@Merlyn ¿Qué es idiomático acerca de la implementación de una función de lenguaje de primera clase? Quien hace eso
Luc Danton
Ese es el punto. Los usuarios de ese lenguaje considerarían que el "patrón de diseño" es una expresión idiomática, porque su lenguaje es más fresco :)
Merlyn Morgan-Graham
@Merlyn Eso no se ajusta a mis usos de 'idioma'. Una expresión idiomática de un idioma es algo que usted espera que un usuario aleatorio y competente del idioma reconozca; La reimplementación de una característica de primera clase se verá extraña y fuera de lugar. No hay lenguaje de C ++ para el envío único, solo se usa virtualen algunos lugares, mientras que el puntero escrito a mano al truco de la tabla de miembros se verá tonto.
Luc Danton
1
Me gusta a dónde vas con la definición de modismo que es diferente al "patrón de diseño de un hombre pobre", que es más o menos como lo trata mi modelo (ver mi respuesta). Es menos "aquí es cómo implementar esto" y más "aquí es la forma correcta de implementar esto". Por ejemplo, no puedo imaginar que "Tres Grandes" evolucionen a un patrón de diseño. Y también está el componente sintáctico, por ejemplo do_something() or die "...";(robado de otro comentario aquí). Se basa en características de lenguaje específicas, pero es una forma común de usar esas características. No es un lenguaje cruzado, y probablemente no lo sea.
Merlyn Morgan-Graham
6

La definición normal en inglés de Idiom. Es una frase cuyo significado aceptado no está contenido en las palabras utilizadas. Los ejemplos serían "Lloviendo gatos y perros" o "¿Dónde está la carne?"

En los lenguajes de programación, generalmente se refiere a un atajo sintáctico que hace algo que no es inmediatamente obvio del código en sí, pero que se usa con la frecuencia suficiente para que otros programadores reconozcan el significado al instante.

Perl es quizás el lenguaje más rico en idiomas. Con construcciones como:

while (<IN>) {
    print $_
}

Cuyo significado es obvio para un programador perl experimentado pero un misterio para cualquier otra persona

James Anderson
fuente
Creo que "¿dónde está la carne?" Es más un meme que un idioma. Podría tener otro continuo allí;) Puede haber más en un idioma que simplemente la implementación en el lenguaje, ya que las cosas pueden ser implementaciones parciales o fallidas de ese idioma, por ejemplo, los "Tres Grandes" de C ++. En ese caso, el idioma es el nombre y la descripción de "Big Three".
Merlyn Morgan-Graham
2
Perl tiene los mejores modismos -do_something() or die "arrrrgh!";
cxfx
2

Los modismos son específicos del idioma. Por ejemplo, while (*dest++=*src++);es un idioma C / C ++. Es completamente imposible escribir algo remotamente similar en Pascal o Java. Use la palabra "modismo" como la usa en inglés. "¿Cómo lo haces?" como saludo es un modismo. Algunos idiomas como el alemán y el frensh tienen el mismo idioma. Pero muchos otros idiomas no "preguntarían" algo como esto como saludo. Por otro lado, un patrón (orientado a objetos) generalmente se puede adaptar a cualquier lenguaje que admita la herencia y la delegación. Un modismo podría ser tan simple como una línea de código. Un patrón de diseño siempre involucra varias clases.

Angel O'Sphere
fuente
+1. Buen punto:A idiom might be as simple as one line of code. A design pattern always involves several classes.
Nawaz
2

Encontré esta publicación buscando expresiones idiomáticas comunes en C ++, ya que recientemente me he estado adentrando bastante y me gustaría que mi código no parezca tan amateur como siento que es ... :-P

Después de haber pasado bastante tiempo con Perl, he descubierto que los modismos en ese idioma son muy parecidos a los que se encuentran en los idiomas naturales, como el inglés o el español (solo dos que conozco lo suficiente como para conocer algunos modismos).

No estoy de acuerdo con que un idioma sea como un "patrón de diseño pequeño". Todavía estoy en desacuerdo, aunque menos, que un idioma es una forma de evitar una deficiencia en un idioma.

Quizás la respuesta de Luc Danton se acerca más, pero déjame explicarte. Creo que un idioma es, bueno, idiomático de aquellos que usan el idioma. Por lo general, una expresión común o secuencia de expresiones que, aunque quizás no sea obvia, realiza una operación o expresa intención de una manera que tenga sentido para aquellos que son lo suficientemente fluidos como para haberla visto antes.

Volviendo a Perl, quizás el idioma más conocido es la " Transformación de Schwartzian ", una expresión que realiza una clasificación de datos de manera compacta y eficiente. No es la forma más obvia de realizar una operación de este tipo, pero es sucinta y aquellos que la han visto antes saben instantáneamente lo que está haciendo.

Otro ejemplo notable es " La maniobra de los orcos ", que aprovecha las nociones de perl de operadores verdaderos / falsos, ricos y precedencia de operadores.

Uno que personalmente me gusta bastante está relacionado con la maniobra de los orcos, pero no conozco su nombre:

push @{ $some_hash{$key} ||= [] }, $some_value;

De hecho, esto no es ofuscación, sino más bien una expresión clara y compacta de algo que de otro modo tomaría varias líneas. Si la clave está presente en el hash y tiene un valor verdadero, desconéctela como una matriz y coloque $ some_value en esa matriz. Si el elemento hash no está presente o tiene un valor falso, asígnele una matriz vacía, luego haga referencia a esa matriz y realice la inserción.

También vale la pena señalar que a partir de Perl 5.14, parte de este modismo está obsoleto: ¡ push ahora puede operar directamente en la referencia de matriz, no se necesita @ {}! Además, a partir de Perl 5.10, se puede usar // = en lugar de || = que verifica no la verdad sino la definición.

Hercynium
fuente
en Python: some_dict.setdefault(key, []).append(some_value).
Jonas Kölker
0

El objetivo de un Idiom es ser una idea o concepto que abarque lenguajes de programación, es una forma de hacer las cosas y un proceso que funciona sin mucha reestructuración conceptual cuando lo tomas de uno y lo pegas en otro, como el tipo de burbuja humilde . Los patrones de diseño son implementaciones específicas de un idioma, o extensiones de la idea para encajar en un lenguaje, por lo tanto, tiene el patrón de diseño de JavaScript del idioma del oyente de eventos, etc.


fuente
El detector de eventos es una característica del lenguaje que implementa señales / ranuras (¿patrón?) o el patrón Observador. También hay cosas en C ++ llamadas modismos que simplemente no importan o no encajan en otros lenguajes (que yo sepa), por ejemplo, el modismo de copiar e intercambiar.
Merlyn Morgan-Graham
Design patterns are specific implementations of an idiom? ¿Cómo exactamente? ¿Viste los modismos de C ++ en el enlace de mi pregunta?
Nawaz
0

No estoy 100% seguro, pero las expresiones idiomáticas son simplemente términos relacionados con un determinado campo. Cuando dices "patrones de diseño", piensas en "Patrón de observador", "Cadena de responsabilidad", "Patrón de visitante", "fábrica". Estos son patrones comunes utilizados para resolver problemas comunes en la programación. Busque aquí una lista completa: http://en.wikibooks.org/wiki/C++_Programming/Code/Design_Patterns


fuente
0

Qué significa eso? ¿Qué significa "bajo nivel" aquí?

Supongo que no es una forma abstracta de alto nivel para modelar su aplicación o los componentes de su aplicación, sino un uso inteligente o común de la semántica del lenguaje.

por ejemplo, establecer una variable si se evalúa como falsa (comúnmente utilizada para establecer variables nulas condicionalmente):

var ||= some_default_value
Ed S.
fuente
0

Aquí hay un ejemplo de un idioma (en C #) para manejar un evento. No está permitido disparar un evento si no tiene ningún controlador asociado, por lo que el idioma es siempre verificar esto primero.

Por lo tanto, el idioma general para manejar eventos se convierte en:

EventHandler handler = this.MyEvent;
if ( null != handler ) { handler( param1, param2 ); }

Este idioma es específico (aunque no exclusivo) del lenguaje C #.

Sin embargo, de manera más general, el mecanismo de eventos de C # es un ejemplo del patrón de diseño del observador que podría implementarse en cualquier lenguaje.

cxfx
fuente