it-swarm.com.de

Gibt es Entwurfsmuster, die in dynamischen Sprachen wie Python nicht erforderlich sind?

Ich habe angefangen, das Designmusterbuch der GoF zu lesen. Einige Muster scheinen mit nur geringfügigen konzeptionellen Unterschieden sehr ähnlich zu sein.

Denken Sie, dass aus den vielen Mustern einige in einer dynamischen Sprache wie Python (z. B. weil sie durch ein dynamisches Feature ersetzt werden) nicht erforderlich sind?

100
Gerenuk

Peter Norvig zeigt, dass 16 der 23 im GOF-Buch gefundenen Entwurfsmuster in dynamischen Sprachen unsichtbar oder einfacher sind (er konzentriert sich auf LISP und Dylan).

Da Sie Python erwähnt haben, gibt es eine Nice Präsentation von Alex Martelli zu diesem Thema. Ebenfalls mit Python verwandt, gibt es einen netten Blog-Beitrag, der sechs Entwurfsmuster in idiomatischem Python demonstriert.

Ich habe auch ein Github-Repository mit Implementierungen (von anderen Leuten) des die häufigsten Entwurfsmuster in Python .

92
sakisk

Es sind keine Entwurfsmuster erforderlich. In jeder Sprache.

Ich stoße auf eine Menge Code, der von Leuten geschrieben wurde, die sich über Designmuster informieren und dann denken, sie sollten sie überall verwenden. Das Ergebnis ist, dass der eigentliche Code unter Tonnen von Schnittstellen, Wrappern und Ebenen vergraben wird und ziemlich schwer zu lesen ist. Das ist ein falscher Ansatz zum Entwerfen von Mustern.

Es gibt Entwurfsmuster, damit Sie ein Repertoire nützlicher Redewendungen zur Hand haben, wenn Sie auf ein Problem stoßen. Sie sollten jedoch niemals ein Muster anwenden, bevor Sie das Problem identifiziert haben. Keep It Simple Stupid sollte immer das übergeordnete Regierungsprinzip sein.

Es ist auch hilfreich, sich Entwurfsmuster als ein Konzept vorzustellen, um über das Problem nachzudenken, anstatt einen bestimmten Code für das Boilerplate zu schreiben. Und über einen Großteil des Boilerplates als Workaround für Java fehlen freie Funktionen und Standardfunktionsobjekte, die Sie in den meisten anderen Sprachen verwenden, in denen sie vorhanden sind (wie Python, C #, C++ usw.).

Ich könnte sagen, dass ich ein Besuchermuster habe, aber in jeder Sprache mit erstklassigen Funktionen ist es nur eine Funktion, die eine Funktion übernimmt. Anstelle der Fabrikklasse habe ich normalerweise nur eine Fabrikfunktion. Ich könnte sagen, ich habe eine Schnittstelle, aber dann sind es nur ein paar Methoden, die mit Kommentaren markiert sind, weil es keine andere Implementierung geben würde (natürlich in python eine Schnittstelle ist immer nur Kommentare, weil es vom Typ Ente ist). Ich spreche immer noch davon, dass der Code das Muster verwendet, weil es eine nützliche Möglichkeit ist, darüber nachzudenken, aber tippe nicht wirklich alles ein, bis ich es wirklich brauche.

Also lerne alle die Muster als Konzepte. Und vergessen Sie die spezifischen Implementierungen. Die Implementierung variiert und sollte in der realen Welt variieren, auch nur in Java.

59
Jan Hudec

Abstraktes Factory-Muster ist in einer Sprache vom Typ Ente wie Python nicht erforderlich, da es praktisch in die Sprache integriert ist.

13
vartec

Das einzige, was mir in den Sinn kommt, ist das Singleton-Muster.

Da Python Sie nicht zwingt, Klassen für alles zu verwenden, können Sie stattdessen einfach eine globale Datenstruktur verwenden. Diese globale Datenstruktur könnte = von einer Instanz verwaltet werden, aber Sie müssen die Instanziierung dieser Klasse nicht steuern. Sie erstellen die Instanz einfach beim Import und belassen sie dabei.

Meistens werden Singletons in python durch ein Modul ersetzt. Module in python sind von Natur aus Singletons; die python) Der Interpreter erstellt diese nur einmal.

Alle anderen Muster in Design Pattern, die ich in Python zu der einen oder anderen Zeit verwendet habe, und Beispiele dafür finden Sie in der Python Standardbibliothek und in Python selbst.

13
Martijn Pieters

Entwurfsmuster sind für den Programmierer, nicht für die Sprache. Programmierer neigen dazu, Muster zu verwenden, die ihnen helfen, das vorliegende Problem zu verstehen. Es ist kein Entwurfsmuster unbedingt erforderlich, aber es kann hilfreich sein, um das, was Sie tun möchten, zu vereinfachen.

Python und speziell das Entenschreiben bieten ein Ende für viele gängige Muster und Praktiken, und viele der Einschränkungen, die durch einige Muster (Datenschutz, Unveränderlichkeit usw.) auferlegt werden, gelten nur in dem Maße, in dem der Programmierer zustimmt, sie nicht zu brechen . Trotzdem funktionieren sie do solange der Programmierer mitspielt. Eine Tür ist immer noch eine Tür, auch wenn sie von imaginären Wänden eingerahmt wird.

Python wird als "Multi-Paradigma" -Sprache angesehen. Sie können beliebige Muster verwenden. Dies ist beabsichtigt. Es sieht zum Beispiel komplexe Klassenhierarchien vor, obwohl sie völlig unnötig und etwas künstlich sind. Aber für manche Menschen ist diese besondere Abstraktion hilfreich. Nicht weil das Problem es erfordert, sondern weil der Programmierer es tut. Hier bitteschön.

8
tylerl

Das ursprüngliche Buch "Design Patterns" dokumentierte und benannte einige gebräuchliche Redewendungen, die in imperativen, objektorientierten Sprachen wie C++ und Smalltalk nützlich sind. Smalltalk ist jedoch eine dynamisch typisierte Sprache, daher kann es nicht unbedingt darum gehen, dynamisch zu sein.

Die Antwort auf Ihre Frage lautet jedoch immer noch "Ja": Einige dieser Entwurfsmuster sind für moderne dynamisch typisierte Sprachen irrelevant. Im Allgemeinen wird es verschiedene Entwurfsmuster in verschiedenen Sprachen geben, insbesondere in verschiedenen Arten von Sprachen.

Um es noch einmal zu wiederholen: Ein "Entwurfsmuster" ist einfach ein Name für eine Programmiersprache: eine häufige Lösung für ein häufig auftretendes Problem. Unterschiedliche Sprachen erfordern unterschiedliche Redewendungen, da das, was für eine Sprache ein Problem darstellt, für eine andere trivial sein kann. In diesem Sinne weisen Designmuster auf Schwachstellen in den Sprachen hin, für die sie gelten.

Vielleicht suchen Sie nach anderen Funktionen, die moderne dynamische Sprachen (oder alte wie LISP) leistungsfähiger machen und einige dieser klassischen Entwurfsmuster irrelevant machen.

4
comingstorm

Entwurfsmuster sind Möglichkeiten zur Lösung bestimmter Probleme. Wenn ein Problem nicht auftritt, hat das Lösungsmuster keine Verwendung.

Die Leute versuchen, Designmuster überall so anzupassen, als wäre es eine bewährte Methode, Designmuster in Ihrem Projekt zu haben. Das ist anders herum. Sie stoßen auf ein Problem, das mit einem Fabrikmuster gelöst werden kann? Cool. Passen Sie es an. Suchen Sie nicht in Ihrem Code nach dem richtigen Ort, um einen Singleton (oder eine Fabrik oder eine Fassade oder was auch immer ...) zu implementieren.

Vielleicht Python hat seine eigenen Entwurfsmuster nicht verfügbar für Java und .NET-Leute (aufgrund der Natur dieser Sprachen)?

1
Andrzej Bobak

Ich würde sagen, dass Muster immer sprachabhängig sind. Die meisten python Muster sehen wie die in GoF definierten aus, liegt an der OOP von Python, das heißt OOP ist) nicht wie OOP (keine zwei Sprachen definieren Objekte und ihre Manipulation zu 100% gleich).

Es besteht also kein Zweifel, dass einige Muster nicht "wie sie sind" anwendbar sind, andere möglicherweise keinen Sinn ergeben und einige Muster nur für Python von Bedeutung sind.

Um genau auf Ihre Frage zurückzukommen: Muster sind nur erforderlich, wenn Sie sie benötigen . Sie müssen sie nicht verwenden, wenn sie nicht benötigt werden (wie Jan Hudec bereits sagte).

Darüber hinaus gibt es viel mehr Muster als die in GoF genannten. Siehe in Wikipedia andere Muster

1
estani