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?
quelle
Antworten:
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.
quelle