¿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
Respuestas:
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.
fuente
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).
fuente
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 ++.
fuente
virtual
en algunos lugares, mientras que el puntero escrito a mano al truco de la tabla de miembros se verá tonto.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.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:
Cuyo significado es obvio para un programador perl experimentado pero un misterio para cualquier otra persona
fuente
do_something() or die "arrrrgh!";
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.fuente
A idiom might be as simple as one line of code. A design pattern always involves several classes.
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:
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.
fuente
some_dict.setdefault(key, []).append(some_value)
.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
Design patterns are specific implementations of an idiom
? ¿Cómo exactamente? ¿Viste los modismos de C ++ en el enlace de mi pregunta?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
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):
fuente
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:
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.
fuente