Ich habe angefangen, das Design Pattern Book der GoF zu lesen. Einige Muster scheinen mit nur geringen konzeptuellen Unterschieden sehr ähnlich zu sein.
Denken Sie aus den vielen Mustern heraus, dass einige in einer dynamischen Sprache wie Python unnötig sind (z. B. weil sie durch ein dynamisches Feature ersetzt werden)?
design-patterns
python
Gerenuk
quelle
quelle
Antworten:
Peter Norvig demonstriert, dass 16 der 23 im GOF-Buch gefundenen Designmuster in dynamischen Sprachen unsichtbar oder einfacher sind (er konzentriert sich auf Lisp und Dylan).
Seit Sie Python erwähnt haben, gibt es eine schöne Präsentation von Alex Martelli zu diesem Thema. Ebenfalls mit Python verwandt ist ein netter Blog-Beitrag, der sechs Designmuster in idiomatischem Python demonstriert .
Ich verwalte auch ein Github-Repository mit Implementierungen (von anderen Leuten) der gängigsten Entwurfsmuster in Python .
quelle
Es sind keine Entwurfsmuster erforderlich. In jeder Sprache.
Ich stoße auf eine Menge Code, der von Leuten geschrieben wurde, die sich mit Designmustern befasst haben und dann der Meinung sind, dass sie sie überall verwenden sollten. Das Ergebnis ist, dass der eigentliche Code unter Tonnen von Schnittstellen, Wrappern und Layern verborgen bleibt und ziemlich schwer zu lesen ist. Das ist eine falsche Herangehensweise an Designmuster.
Entwurfsmuster sind vorhanden, sodass 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. Halte es einfach Dumm sollte immer das überlegene Prinzip sein.
Es ist auch hilfreich, sich Entwurfsmuster als ein Konzept vorzustellen, um über das Problem nachzudenken, anstatt spezifischen Code 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 enthalten sind (wie Python, C #, C ++ usw.).
Ich könnte sagen, dass ich ein Besuchermuster habe, aber in jeder Sprache mit erstklassigen Funktionen wird es nur eine Funktion sein, 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, da es keine andere Implementierung gibt (in Python sind Schnittstellen natürlich immer nur Kommentare, weil sie vom Typ Ente sind). 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.
Lernen Sie also alle Muster als Konzepte . Und vergessen Sie die spezifischen Implementierungen. Die Implementierung variiert und sollte in der realen Welt variieren, auch nur in Java.
quelle
Abstrakte Factory-Muster sind in Enten-typisierten Sprachen wie Python nicht erforderlich, da sie praktisch in die Sprache integriert sind.
quelle
Das einzige, was mir einfällt, ist das Singleton-Muster.
Da Python Sie nicht zwingt, Klassen für alles zu verwenden , können Sie stattdessen nur 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 nur beim Import und belassen sie dabei.
Meist werden Singletons in Python durch ein Modul ersetzt. Module in Python sind von Natur aus Singletons; Der Python-Interpreter erstellt diese nur einmal.
Alle anderen Muster in Design Patters, die ich in Python verwendet habe, finden Sie in der gesamten Python-Standardbibliothek und in Python selbst.
quelle
len
funktioniert. Guido traf hier eine explizite Wahl . Ich möchte zeigen, dass Python keine reine OOP-Sprache ist. Es ist eine pragmatische Sprache. Ich mag es so.Entwurfsmuster sind für den Programmierer, nicht für die Sprache. Programmierer tendieren dazu, Muster zu verwenden, die ihnen helfen, das vorliegende Problem zu verstehen. Ein Entwurfsmuster ist nicht unbedingt erforderlich, kann jedoch hilfreich sein, um das zu vereinfachen, was Sie versuchen.
Python und speziell das Schreiben von Enten bieten ein Ende vieler gängiger Muster und Praktiken, und viele der Einschränkungen, die durch einige Muster auferlegt werden (Datenschutz, Unveränderlichkeit usw.), gelten nur in dem Maße, in dem der Programmierer zustimmt, sie nicht zu brechen . Aber nach wie vor, sie tun arbeiten, 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 eine "Multi-Paradigma" -Sprache angesehen. Sie können beliebige Muster verwenden. Das ist beabsichtigt. Es sieht zum Beispiel komplexe Klassenhierarchien vor, obwohl diese völlig unnötig und ein bisschen künstlich sind. Aber für manche Menschen ist diese bestimmte Abstraktion hilfreich. Nicht weil das Problem es erfordert, sondern weil es der Programmierer tut. Hier bitteschön.
quelle
Das ursprüngliche Buch "Design Patterns" dokumentierte und nannte einige gebräuchliche Redewendungen, die in imperativen, objektorientierten Sprachen wie C ++ und Smalltalk nützlich sind. Smalltalk ist jedoch eine dynamisch geschriebene Sprache, daher kann es nicht ausschließlich 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 unterschiedliche Entwurfsmuster in unterschiedlichen Sprachen geben, insbesondere in unterschiedlichen 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 Problem für eine Sprache für eine andere trivial sein kann. In diesem Sinne weisen Designmuster auf Schwächen 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 Designmuster irrelevant machen.
quelle
Entwurfsmuster sind Möglichkeiten zur Lösung bestimmter Probleme. Wenn ein Problem nicht gelöst wird, hat das Muster der Lösung keine Verwendung.
Die Leute versuchen, Entwurfsmuster überall so anzupassen, als wäre es eine bewährte Methode, Entwurfsmuster 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. Schlagen Sie Ihren Code nicht nach und versuchen Sie, den richtigen Ort für die Implementierung eines Singleton (oder einer Fabrik, einer Fassade oder was auch immer ...) zu finden.
Möglicherweise verfügt Python über eigene Entwurfsmuster, die für Java- und .NET-Benutzer (aufgrund der Beschaffenheit dieser Sprachen) nicht verfügbar sind.
quelle
Ich würde sagen, dass Muster immer sprachabhängig sind. Dass die meisten Python-Patterns so aussehen wie die in GoF definierten, liegt an der OOP von Python, dass gesagt wird, dass OOP nicht mit OOP vergleichbar ist (keine zwei Sprachen definieren Objekte und ihre Manipulation ist zu 100% gleich).
Es besteht also kein Zweifel, dass einige Muster "wie sie sind" nicht anwendbar sind, einige ergeben möglicherweise keinen Sinn und einige Muster sind möglicherweise nur für Python von Bedeutung.
Um genau auf Ihre Frage zurückzukommen: Muster sind nur erforderlich, wenn Sie sie benötigen . Sie müssen nicht verwendet werden, wenn sie nicht benötigt werden (wie Jan Hudec bereits sagte).
Darüber hinaus gibt es viel mehr Muster als in GoF erwähnt. Siehe in Wikipedia andere Muster
quelle