Also, "Fehlen Design Patterns Sprachmerkmale"? [geschlossen]

12

Ich habe hier bei Programmierern die Antwort auf diese Frage gesehen: Wie verändert sich das Denken über Entwurfsmuster und OOP-Praktiken in dynamischen und schwach typisierten Sprachen? Dort fand ich einen Link zu einem Artikel mit einem ausgesprochenen Titel: Fehlen Design Patterns Sprachfunktionen . Aber wo ich Schnipsel gefunden habe, die mir sehr eingängig erschienen und die sich wahrscheinlich anhand von Erfahrungen bestätigen lassen, gibt es einen Anreiz dafür, wie zum Beispiel:

PaulGraham sagte: "Peter Norvig stellte fest, dass 16 der 23 Muster in Design Patterns in Lisp 'unsichtbar oder einfacher' sind."

oder ein anderer Satz, der bestätigt, was ich kürzlich mit Leuten gesehen habe, die versuchen, Klassen in JavaScript zu simulieren:

Natürlich spricht niemand über das Funktionsmuster oder das Klassenmuster oder über zahlreiche andere Dinge, die wir für selbstverständlich halten, weil die meisten Sprachen sie als eingebaute Funktionen bereitstellen. OTOH, Programmierer in einer reinen PrototypeOrientedLanguage? Vielleicht ist es praktisch, Klassen mit Prototypen zu simulieren ...

Ich berücksichtige auch, dass Entwurfsmuster ein Kommunikationswerkzeug sind . Denn selbst mit meiner begrenzten Erfahrung beim Erstellen von Anwendungen kann ich zum Beispiel ein Anti-Pattern ( ineffektiv und / oder kontraproduktiv ) sehen, das ein kleines PHP-Team dazu zwingt, GoF-Patterns für kleine bis mittlere Intranet-Apps zu lernen. Mir ist bewusst, dass Größe, Umfang und Zweck bestimmen können, was effektiv und / oder produktiv ist, aber ich habe es trotzdem nicht geschafft, einen technischen Überblick darüber zu finden.

Ich sah kleine kommerzielle Anwendungen, die sich mit OOP mischten und trotzdem wartbar waren, und ich weiß nicht, ob viele zum Beispiel in Python ein Singleton schreiben müssten, aber für mich macht ein einfaches Modul dasselbe.

Gibt es Studien, ausführliche Artikel oder andere Darstellungsformen, die Entwurfsmuster oder Problemumgehungen oder einfachere Methoden oder das Ersetzen durch Sprachmerkmale berücksichtigen?

Eduard Florinescu
quelle
16
Es wäre ein Fehler, alles, was Paul Graham zum Thema Programmiersprachen sagt, als "objektiv und sachlich" zu akzeptieren.
Mason Wheeler
5
Ich neige nicht dazu, Paul Graham zu widersprechen, aber @MasonWheeler hat recht, Evangelisten sind aus vielen Gründen großartig, aber nicht wegen ihrer Objektivität.
Jimmy Hoffa
3
@ JimmyHoffa: Es ist nicht "Evangelisten" im Allgemeinen. Ich bezweifle, dass Graham in seiner langen Geschichte lächerliches Material veröffentlicht hat, das sich oder seinen Quellen häufig widerspricht und versucht, das Ganze so zu verdrehen, dass es konsistent erscheint. Egal wofür Sie sich einsetzen, das ist ein schrecklicher Weg, und es ist ein bisschen schrecklich für mich, dass die Leute ihm tatsächlich zuhören.
Mason Wheeler
5
Es wäre schön, einige Studien zu sehen, aber wenn Sie jemals moderne funktionale Sprachen verwendet haben - Sie wissen bereits, wie veraltet GOF-Entwurfsmuster sind, und es besteht kein Bedarf an Zahlen, dies mehr zu beweisen . (Obwohl sie zweifellos 1990 wichtig waren).
c69
3
@DanielB, jedes spezifische Paradigma wird scheitern, weil die Realität viel komplexer ist, als es jemals ein Paradigma sein könnte. Daher verdient jedes Problem sein eigenes, domänenspezifisches Modell und Paradigma.
SK-logic

Antworten:

10

Mir ist keine eingehende Diskussion oder Studie bekannt, die all diese Dinge berücksichtigt .

Das ganze Argument von "Design Patterns flicken nur fehlende Features in OO-Sprachen" ist meiner Meinung nach ein bisschen dünn. Ja, einige Entwurfsmuster sind genau das. Sie füllen eine allgemeine Lücke, die es in keiner anderen Sprache X gibt. Dies sind in der Regel Ihre einfacheren Entwurfsmuster auf niedriger Ebene, wie einige / viele der ursprünglichen Muster im GoF-Buch.

Aber Designmuster gehen weit über diese einfachen hinaus, und wenn man sie als fehlende Sprachmerkmale bezeichnet, wird die Vorstellungskraft gestärkt. Werfen Sie einen Blick auf Fowlers Katalog von Unternehmensanwendungsmustern und überlegen Sie, wie diese Muster aussehen würden, wenn sie alle Teil der Kerndefinition einer Sprache wären. Ich vermute, Sie werden mit einer domänenspezifischen Sprache ( DSL ) für Unternehmensanwendungen (und einer sehr komplexen) enden .

Das ist also die eigentliche Sache - Entwurfsmuster sind eine Möglichkeit, wiederverwendbare Lösungen für bestimmte Probleme zu finden (die häufig in einer allgemeinen Allzwecksprache angewendet werden). Hier kommt auch die Kommunikation ins Spiel. Wenn Sie mir sagen, dass wir Active Records verwenden, weiß ich bereits ziemlich viel über Ihre Anwendung, ohne Minuten damit zu verbringen, die verschiedenen Ansätze zu diskutieren. Also ja, Designmuster flicken Löcher in die Sprachspezifikation. Ist das alles was sie tun? Nein - noch lange nicht.

Bearbeiten:

In gewisser Weise sage ich, dass Muster es OO-Praktizierenden ermöglichen, auf einer höheren Ebene zu denken und beinahe eine Art DSL für ihre Umgebung zu konstruieren , während sie sich an die Syntax ihrer Sprache halten. Und ja, ich habe gesehen, was passiert, wenn Sie sie überall anwenden (siehe: AbstractSingletonProxyFactoryBean , ja, es gibt sie), oder ich denke, es handelt sich um eine Art Wunderwaffe. Der Punkt ist, dass sie zwar lange brauchen, um sich wirklich wohl zu fühlen, aber tatsächlich weniger Komplexität haben sollen, indem sie die Dinge auf hohem Niveau vorhersehbar / verständlich machen. Dies ist etwas ganz anderes als ein Patch-Kit für die Fehler Ihrer Sprache.

Bearbeiten 2 - Das Gegenbeispiel zu AbstractSingletonProxyFactoryBean wurde hinzugefügt, um ein wenig Spaß an Mustern zu haben. Um ganz ehrlich zu sein, wenn man es von einem AOP-Licht aus betrachtet, ist sogar dieses Gegenbeispiel vertretbar.

Daniel B
quelle
(+1) und akzeptieren, weil Sie meine Suche nach DSL- und Anwendungsmustern eingegrenzt haben. Sehr nachdenklich, und können Sie bitte erweitern oder für den Leser verlinken, vielleicht in Klammern mindestens eines der DSL-Akronyme, ich nehme an, es bedeutet domänenspezifische Sprache.
Eduard Florinescu
@EduardFlorinescu danke, ich habe mit Links für DSL aktualisiert.
Daniel B
Ich habe auch festgestellt, dass dieser Artikel einen Teil Ihrer Antwort in diesem Fall mit Groovy ibm.com/developerworks/java/library/j-eaed7/index.html
Eduard Florinescu,
1
@EduardFlorinescu das ist sehr interessant, obwohl ich mich nicht nur speziell auf das Interpreter-Muster bezog; Ich meinte vielmehr, dass viele Muster durchaus domänenspezifisch sein können und für Entwickler in dieser Domäne beinahe idiomatisch werden. In diesem Sinne werden sie zu einer Art DSL und erfordern wenig Verständnis und Einsatz. Wenn ich z. B. ein Befehlsmuster (ein nicht domänenspezifisches Beispiel) durchlese, weiß ich, welchen Code ich ignorieren kann, und es ist nicht sehr aufwändig. Trotzdem vielen Dank für den interessanten Link.
Daniel B