Benutzt ihr Design Patterns (Python)?

3 Antworten

Benutzt ihr Design Patterns (Python)?

Wenn es sich anbietet und Sinn ergibt, dann ja.

Die Patterns sind ja lediglich Hilfsmittel, um beispielsweise Abhängigkeiten zu verringern oder einfachere Strukturen zu schaffen. Wenn sie jedoch die Komplexität unnötig steigern (was bei dem Versuch höherer Abstraktion/Entkopplung durchaus schnell passieren kann), werden sie in diesem Kontext eher zu Antipattern.

Bei kleinen Skripten, wofür Python konzeptuell ausgelegt ist, wird man daher wohl eher weniger in Situationen geraten, wo man so etwas benötigt. Ich würde da eher an den Gebrauch bereits Standard-implementierter Patterns denken (z.B. das Global Object Pattern: Dunder-Konstanten wie __main__ oder __file__, Iteratoren, Commands in tkinter, Sentinels oder Strategy).

Sobald du komplexere Toolkits/Bibliotheken/Frameworks hinzunimmst, werden dir natürlich schnell noch weitere Patterns aufgedrückt/an die Hand gegeben. Sei es Signal-Slot in PyQt, die Template Method in Django oder die Möglichkeit in Flask über eine Factory verschiedene Instanzen (Test, Produktion, u.ä.) der Anwendung zu erzeugen.

Welche Design Patterns verwendet ihr so, wenn ihr etwas in Python schreibt?

Abgesehen von den bereits bestehenden Implementationen in Python, würde ich eine Notwendigkeit erst einmal von der Anwendung abhängig machen, die entwickelt werden soll. Bei kleinen Skripten, die beispielsweise nur irgendeinen Vorgang automatisieren sollen oder Prototypen, ist es nicht wirklich notwendig, sich darüber viele Gedanken zu machen.

Wollte man komplexere Anwendungen bauen, bei denen dann auch tatsächlich der OOP-Gebrauch steigt, würde ich innerhalb einer Planungsphase ausmachen, was ich benötige und in welchen Beziehungen die erforderlichen Objekte zueinander stehen. In diesem Zug werden vor allem strukturelle Patterns deutlich.

Da in so einem Fall üblicherweise eh eine gewisse Projektstrukturierung vorgenommen werden muss (eine Datei für den gesamten Code ist schließlich nicht mehr ausreichend/schön), würde man theoretisch erst einmal bei klassischen Architektur Patterns (MVC/MVVM/..., Client-Server, DI, ...) landen, um Daten zu trennen, das Programm adaptiv zu gestalten und (eine häufige Anforderung heutzutage) die Datenkommunikation zu regeln. Als Basis kann man meist ein Framework nutzen, was dafür bereits Vorgaben und Implementationen abnimmt. Häufig anzutreffende Anwendungsfälle, in denen ein Entwurfsmuster sinnvoll wäre (Bsp.: Proxies oder Commands für die Datenvalidation/-filterung, Factories, Strategies, ...) sind darin oft schon integriert.

Vor allem fände ich es interessant zu wissen, verwendet ihr das (Abstract) Factory Pattern, bzw. das Builder Pattern?

Wenn es keinen Fall gibt, wo man es benötigen würde, dann nicht.

Als allgemein brauchbarer Anwendungsfall für das Builder Pattern würde mir spontan gerade nur das Erstellen von (individuellen) Objekten einfallen, die im Anschluss direkt als unveränderbar gehandhabt werden. Man könnte z.B. HTTP-Request-Dokumente oder URLs mit so einem Pattern aufbauen. Zur generellen Kürzung von Parameterlisten würde ich eher auf ein built-in-Feature wie **kwargs zurückgreifen.

Die Factory wiederum kann zum Beispiel dann gut genutzt werden, wenn du für eine Schnittstelle verschiedene Optionen bieten möchtest. Beispielsweise könntest du für eine Anwendung verschiedene Datenquellen (MySQL, PostgreSQL, Mongo, SQLite, ...) unterstützen. Mit Hilfe einer Factory kann entschieden werden, welches Reader-Objekt dafür generiert werden muss.

Von Experte MrAmazing2 bestätigt

Ich kann dir sagen, dass diese Pattern in Python (häufig) unter den Tisch fallen, weil Python zum einen keine Sprache ist mit der man riesige Anwendungen baut, und zum anderen dort sehr wenig Code sehr viel erledigt.

Und dazu sind (viele) der Design Patterns auf Objektorientierung ausgelegt, und die wird in Python zwar unterstützt, aber nicht auf die schönste Art und Weise.

Insofern, bei meinen Python Projekten habe ich noch nie darauf geachtet ein Pattern umzusetzen. Habe aber auch keine riesen Projekte damit gemacht, viel mehr kleine "Hacks" für Spiele und so n Kram.

Kann also sein dass ich damit am Ende unrecht habe

Ich benutze Python nur zum "nur mal eben schnell was scripten", von daher... Nein. :-/