Unterschied zwischen Redewendung und Entwurfsmuster?

39

Was ist der Unterschied zwischen Redewendung und Entwurfsmuster? Es scheint, dass sich diese Begriffe irgendwo überschneiden. Wo genau, weiß ich nicht. Sind sie austauschbar? Wann soll ich was verwenden?

Hier ist eine Liste von C ++ - Redewendungen. Kann ich sie Entwurfsmuster nennen?

Wikipedia definiert,

Programmiersprache als einfaches Entwurfsmuster

Was heißt das? Was bedeutet hier "Low-Level" ?

Diese Frage ist von einer anderen Frage inspiriert: https://stackoverflow.com/questions/7343531/are-the-some-design-patterns-language-dependent

Nawaz
quelle
In der Praxis kann die Unterscheidung schwierig sein (und es kann ein gewisses Kontinuum zwischen einer Redewendung und einem Entwurfsmuster geben). Aber es leitet sich wahrscheinlich von dem Begriff "Idiom" in natürlicher Sprache ab: en.wikipedia.org/wiki/Idiom (was nicht wirklich zur Verwendung passt).
Merlyn Morgan-Graham
2
Dies ist wahrscheinlich besser für Programmierer SE geeignet.
Oliver Charlesworth
3
@Nawaz: Ein "Design Pattern" ist ein relativ "übergeordnetes" Konstrukt um einen Sprachfehler. Ein "Idiom" ist ein relativ "untergeordnetes" Konstrukt um einen Sprachfehler; )
Tristan St.
@ Nawaz- +1 für Humor.
Jennifer S
Siehe auch Idiom gegen Muster .
MS Dousti

Antworten:

30

Ein Idiom ist eine Idee, um die Macken einer Sprache zu umgehen. Einige Beispiele, die mir in den Sinn kommen, sind C ++ - Redewendungen, die Sie in der ursprünglichen Frage verlinkt haben. Sie lösen ein allgemeines Problem in dieser Sprache auf konservierte Weise.

Ein Entwurfsmuster ist insofern ähnlich, als es ein allgemeines Problem löst. Das ideale Entwurfsmuster basiert jedoch auf gemeinsamen Sprachmerkmalen und ist daher sprachunabhängig.

Es gibt jedoch ein Kontinuum zwischen Redewendungen und Entwurfsmustern, genauso wie es Sprachen auf niedriger bis hoher Ebene gibt.

Das Besuchermuster ist ein gutes Beispiel. Wenn es nur eine Sprache gäbe, die nur einen einzelnen dynamischen Versand unterstützt, könnten wir das Besuchermuster als eine Redewendung dieser Sprache betrachten. Es gibt jedoch eine ganze Reihe von Sprachen, die den Mehrfachversand nicht direkt unterstützen. Somit war das Besuchermuster geboren.

Denken Sie auch an das Observer-Muster - C # unterstützt es direkt, sodass es nicht die übliche Umgehungsform des Musters benötigt.

Ein Beispiel für die andere Richtung sind OO-Merkmale (Vererbung, Polymorphismus usw.). C unterstützt sie nicht direkt. Wenn mehr Sprachen wie C wären, könnten wir Entwurfsmuster entwickeln, um v-Tabellen, Typensicherheit usw. zu implementieren. Da viele Sprachen diese Funktion unterstützen, würden wir jede gängige Lösung in C als Idiom bezeichnen, anstatt das Verallgemeinerte zu bezeichnen Lösung ein Entwurfsmuster.

Merlyn Morgan-Graham
quelle
2
Ein weiteres interessantes Beispiel: Fluent-Syntax-APIs. Sie machen die Tatsache wett, dass Sie keine direkte DSL-Unterstützung in Ihrer Sprache haben und diese über Sprachgrenzen hinweg erfolgt. Ich bin mir nicht sicher, ob es den Status "Design Pattern" erhalten hat, und es klingt wie eine syntaktische Redewendung ...
Merlyn Morgan-Graham
Die Tatsache , dass C # unterstützt direkt die Beobachter - Muster , um anzuzeigen scheinen , dass es tut , für das Muster ein großes Bedürfnis hat, so sehr, dass es die Umsetzung weg von Entwicklern und in die Sprache selbst verschoben.
jaco0646
@ jaco0646 Ich habe diese Zeile umformuliert, vielleicht ist sie jetzt klarer
Merlyn Morgan-Graham
37

Entwurfsmuster sind normalerweise nicht sprachspezifisch. Sprachidiome hängen in der Regel von bestimmten Merkmalen einer Sprache (oder einer Sprachklasse) ab oder umgehen einen bestimmten Mangel dieser Sprache (n).

µBio
quelle
+1 für eine Unterscheidung mit wenigen Wörtern und wenigen Ungenauigkeiten.
Merlyn Morgan-Graham
1
@Merlyn Morgan-Graham: Sie haben fast alle Antworten kommentiert , einschließlich der Frage. Warum posten Sie keine detaillierte Antwort ohne Ungenauigkeiten ? Ich würde gerne Ihre Gedanken erfahren.
Nawaz
1
@Nawaz: Der Kommentar betraf die anderen Antworten. Dieser ist schon fast perfekt. Ich hätte gerne Muster als Antwort, aber es scheint, dass niemand die richtigen Antworten findet. Ich könnte wahrscheinlich auch nicht, sonst würde ich gerne verpflichten :)
Merlyn Morgan-Graham
@Nawaz: Okay, ich habe es trotzdem probiert :)
Merlyn Morgan-Graham
12

Ich würde der Wikipedia-Definition nicht zu viel Bedeutung beimessen.

Zumindest ist ein Idiom sprachspezifisch, während ein Designmuster danach strebt oder streben sollte, sprachunabhängig zu sein. Darüber hinaus sind Redewendungen in der Regel Konventionen zur Verbesserung der Lesbarkeit oder die bessere Alternative (in technischer Hinsicht), wenn es mehr als eine Möglichkeit gibt, etwas zu tun. All diese Dinge hängen davon ab, wie Ideen ausgedrückt werden (Klarheit, Ausführlichkeit, Prägnanz), aber nicht von den Ideen selbst.

Auf der anderen Seite, sind Entwurfsmuster das Wesen einer wiederkehrende Idee, eine Idee , die von vornherein in beliebigen Sprachen ausgedrückt werden , die sich zu ihm verleiht. Der Besucher ist eine Implementierung des Doppelversands, die sich auf den Einzelversand und die Überladung stützt. Dies kann in jeder Sprache verwendet werden, die den Einzelversand und die Überladung hat. Das Wissen über das Muster hilft nicht, aussagekräftigeren oder besser lesbaren Code zu schreiben, sondern das damit verbundene Problem zu lösen. Es ist nichts Idiomatisches daran, weil es zum Beispiel in C ++ keine kanonische Form des Besuchers gibt.

Luc Danton
quelle
1
+1; Gute Antwort. Trotzdem neige ich dazu, alles bis auf das letzte bisschen zu glauben. Es gibt Sprachen, die Mehrfachversand direkt unterstützen, sodass das Besuchermuster dort nicht vorhanden sein muss. Aus ihrer Sicht könnte das "Muster" eher eine Redewendung sein. Aus der ultimativen Hochsprache könnten alle Muster zu Redewendungen werden ...
Merlyn Morgan-Graham
@Merlyn Was ist idiomatisch an der Neuimplementierung eines erstklassigen Sprachfeatures? Wer macht das?
Luc Danton
Das ist der Punkt. Benutzer dieser Sprache würden das "Designmuster" als eine Redewendung betrachten, weil ihre Sprache cooler ist :)
Merlyn Morgan-Graham
@Merlyn Das passt nicht zu meinem Sprachgebrauch. Von einem zufälligen, kompetenten Sprachanwender wird erwartet, dass er eine bestimmte Sprache erkennt. Die Neuimplementierung eines erstklassigen Features sieht fremd und fehl am Platz aus. Es gibt kein C ++ - Idiom für den Einzelversand, man verwendet es nur virtualan einigen Stellen, wohingegen handgeschriebene Zeiger auf Member-Tabellen-Tricks nur albern aussehen.
Luc Danton
1
Mir gefällt, wohin Sie gehen, wenn es darum geht, Redewendungen anders zu definieren als das Designmuster eines "armen Mannes", so wie mein Modell es behandelt (siehe meine Antwort). Es ist weniger "hier ist, wie man dies umsetzt" und mehr "hier ist der richtige Weg, dies umzusetzen". Zum Beispiel kann ich mir nicht vorstellen, dass sich "Big Three" zu einem Designmuster entwickelt. Und da ist auch die syntaktische Komponente, zB do_something() or die "...";(gestohlen von einem anderen Kommentar hier). Es basiert auf bestimmten Sprachfunktionen, ist jedoch eine gängige Methode, diese Funktionen zu verwenden. Es ist nicht sprachenübergreifend und wird es wahrscheinlich auch nicht sein.
Merlyn Morgan-Graham
6

Die normale englische Sprachdefinition von Idiom. Ist eine Phrase, deren akzeptierte Bedeutung nicht in den verwendeten Wörtern enthalten ist. Beispiele wären "Katzen und Hunde regnen" oder "Wo ist das Rindfleisch?"

In Programmiersprachen bezieht es sich normalerweise auf eine syntaktische Verknüpfung, die nicht unmittelbar aus dem Code selbst hervorgeht, sondern häufig genug verwendet wird, damit andere Programmierer die Bedeutung sofort erkennen.

Perl ist vielleicht die am meisten gesprochene Sprache. Mit Konstrukten wie:

while (<IN>) {
    print $_
}

Wessen Bedeutung ist für einen erfahrenen Perl-Programmierer offensichtlich, für andere jedoch ein Rätsel

James Anderson
quelle
Ich denke, "wo ist das Rindfleisch" ist eher ein Mem als eine Redewendung. Könnte dort ein anderes Kontinuum haben;) Ein Idiom kann mehr beinhalten als nur die Implementierung in der Sprache, da es sich um teilweise oder fehlgeschlagene Implementierungen dieses Idioms handeln kann - zum Beispiel C ++ 's "Big Three". In diesem Fall ist das Idiom der Name und die Beschreibung von "Big Three".
Merlyn Morgan-Graham
2
Perl hat die besten Redewendungen -do_something() or die "arrrrgh!";
cxfx
2

Redewendungen sind sprachspezifisch. ZB while (*dest++=*src++);ist ein C / C ++ - Idiom. Es ist völlig unmöglich, in Pascal oder Java etwas Ähnliches zu schreiben. Verwenden Sie das Wort "Idiom", wie Sie es in Englisch verwenden. "Wie geht's?" als Gruß ist eine Redewendung. Einige Sprachen wie Deutsch und Französisch sprechen die gleiche Sprache. Aber viele andere Sprachen würden so etwas nicht zur Begrüßung "fragen". Ein (objektorientiertes) Muster hingegen kann normalerweise in jede Sprache angepasst werden, die Vererbung und Delegierung unterstützt. Ein Idiom kann so einfach wie eine Codezeile sein. Ein Entwurfsmuster umfasst immer mehrere Klassen.

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

Ich fand diesen Beitrag auf der Suche nach gängigen C ++ - Idiomen, da ich mich in letzter Zeit ziemlich intensiv damit befasst habe und möchte, dass mein Code nicht so amateurhaft aussieht, wie ich es finde ... :-P

Nachdem ich einige Zeit mit Perl verbracht habe, habe ich festgestellt, dass Redewendungen in dieser Sprache denen in natürlichen Sprachen, wie Englisch oder Spanisch, sehr ähnlich sind (nur zwei, die ich gut genug kenne, um einige Redewendungen zu kennen).

Ich bin nicht der Meinung, dass eine Redewendung wie ein "kleines Designmuster" ist. Ich bin immer noch anderer Meinung, wenn auch weniger, dass ein Idiom ein Weg ist, um einen Sprachmangel zu umgehen.

Vielleicht kommt die Antwort von Luc Danton am nächsten, aber lassen Sie mich erklären. Ich denke, dass ein Idiom typisch für diejenigen ist, die die Sprache benutzen. Normalerweise ein allgemeiner Ausdruck oder eine Abfolge von Ausdrücken, die, obwohl sie vielleicht nicht offensichtlich sind, eine Operation ausführen oder die Absicht auf eine Weise ausdrücken, die für diejenigen sinnvoll ist, die fließend genug sind, um sie zuvor gesehen zu haben.

Zurück zu Perl, die vielleicht bekannteste Redewendung ist die " Schwartzsche Transformation ", ein Ausdruck, der Daten auf kompakte und effiziente Weise sortiert. Es ist nicht die naheliegendste Art, eine solche Operation durchzuführen, aber es ist kurz und bündig, und diejenigen, die es schon einmal gesehen haben, wissen sofort, was es tut.

Ein weiteres bemerkenswertes Beispiel ist " The Orcish Manoeuvre ", bei dem die Perl-Begriffe "Wahr / Falsch", "Reiche Operatoren" und "Operator-Priorität" verwendet werden.

Eine, die ich persönlich ziemlich mag, hat etwas mit dem Orkmanöver zu tun, aber ich kenne keinen Namen dafür:

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

Dies ist in der Tat keine Verschleierung, sondern ein klarer, kompakter Ausdruck von etwas, das ansonsten mehrere Zeilen benötigt. Wenn der Schlüssel im Hash vorhanden ist und einen echten Wert hat, nehmen Sie die Referenzierung als Array zurück und schreiben Sie $ some_value auf dieses Array. Wenn das Hash-Element nicht vorhanden ist oder einen falschen Wert hat, weisen Sie ihm ein leeres Array zu, dereferenzieren Sie das Array und führen Sie den Push aus.

Es ist auch erwähnenswert, dass seit Perl 5.14 ein Teil dieser Redewendung veraltet ist - push kann jetzt direkt auf die Array-Referenz angewendet werden, ohne dass @ {} benötigt wird! Ab Perl 5.10 kann auch // = anstelle von || = verwendet werden, wodurch nicht auf Wahrheit, sondern auf Definiertheit geprüft wird.

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

Der Sinn eines Idioms besteht darin, eine Idee oder ein Konzept zu sein, das sich über Programmiersprachen erstreckt. Es ist eine Art und Weise, Dinge zu tun, und ein Prozess, der ohne große konzeptionelle Umstrukturierung funktioniert, wenn Sie es von einem abheben und in ein anderes stecken, wie die Art der niedrigen Blase . Entwurfsmuster sind spezifische Implementierungen eines Idioms oder Erweiterungen der Idee, um in eine Sprache zu passen. Sie haben daher das Javascript-Entwurfsmuster des Ereignis-Listener-Idioms usw.


quelle
Ereignis-Listener ist eine Sprachfunktion, die Signal / Slots (Muster?) oder das Observer-Muster implementiert. Es gibt auch Dinge in C ++, die als Redewendungen bezeichnet werden und einfach keine Rolle spielen oder nicht in andere Sprachen passen (soweit ich weiß) - z. B. die Redewendung "Kopieren und Tauschen".
Merlyn Morgan-Graham
Design patterns are specific implementations of an idiom? Wie genau? Haben Sie die C ++ - Redewendungen im Link in meiner Frage gesehen?
Nawaz
0

Ich bin mir nicht 100% sicher, aber Redewendungen sind einfach Begriffe, die sich auf ein bestimmtes Gebiet beziehen. Wenn Sie "Design Patterns" sagen, denken Sie an "Observer Pattern", "Chain of Responsibility", "Visitor Pattern", "Factory". Dies sind übliche Muster, mit denen häufig auftretende Probleme bei der Programmierung gelöst werden. Eine umfassende Liste finden Sie hier: http://en.wikibooks.org/wiki/C++_Programming/Code/Design_Patterns


quelle
0

Was heißt das? Was bedeutet hier "Low-Level"?

Damit meine ich, dass es sich nicht um eine abstrakte Methode auf hoher Ebene zur Modellierung Ihrer Anwendung oder von Komponenten Ihrer Anwendung handelt, sondern um eine clevere oder gebräuchliche Verwendung der Sprachsemantik.

Beispiel: Festlegen einer Variablen, wenn sie als falsch ausgewertet wird (wird normalerweise verwendet, um keine Variablen bedingt festzulegen):

var ||= some_default_value
Ed S.
quelle
0

Hier ist ein Beispiel für eine Redewendung (in C #) zum Behandeln eines Ereignisses. Sie dürfen ein Ereignis nicht auslösen, wenn keine Handler angeschlossen sind. Daher sollten Sie dies immer zuerst überprüfen.

Daher lautet die allgemeine Umgangssprache für Ereignisse:

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

Diese Redewendung ist spezifisch (wenn auch nicht exklusiv) für die C # -Sprache.

Im Allgemeinen ist der C # -Ereignismechanismus jedoch ein Beispiel für das Beobachterdesignmuster , das in einer beliebigen Sprache implementiert werden kann.

cxfx
quelle