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
Antworten:
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.
quelle
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).
quelle
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.
quelle
virtual
an einigen Stellen, wohingegen handgeschriebene Zeiger auf Member-Tabellen-Tricks nur albern aussehen.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.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:
Wessen Bedeutung ist für einen erfahrenen Perl-Programmierer offensichtlich, für andere jedoch ein Rätsel
quelle
do_something() or die "arrrrgh!";
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.quelle
A idiom might be as simple as one line of code. A design pattern always involves several classes.
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:
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.
quelle
some_dict.setdefault(key, []).append(some_value)
.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
Design patterns are specific implementations of an idiom
? Wie genau? Haben Sie die C ++ - Redewendungen im Link in meiner Frage gesehen?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
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):
quelle
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:
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.
quelle