Welche Design Patterns nutzt ihr in der Praxis regelmäßig?



  • Pattern sind nichts anderes als eine einheitliche Namensgebung für Standardproblemlösungen.

    Jeder Programmierer löst konstant Standardprobleme.

    Design Pattern haben uns einfach nur Namen für diese Standardlösungen gegeben so dass wir nicht mehr kompliziert erklären müssen was wir meinen, sondern es mit einem Namen bezeichnen können.

    Deshalb ist es irgendwie doof zu sagen Pattern sind gut oder schlecht - denn sie sind einfach nur Namen. Und einheitliche Namen sind praktisch. Sie helfen in der Kommunikation enorm.



  • Mechanics schrieb:

    GangOfFive schrieb:

    Regelmäßig sehe ich Code von Kollegen, wo ein in meinen Augen simpler Sachverhalt mit dicken Design Patterns erschlagen wird.

    Ich halte das für ein Gerücht. Man hört sehr oft diese lapidaren Aussagen, aber so wirklich gesehen habe ich sowas noch nicht. Man sieht vielleicht öfter mal sehr stark überladenen Java Code mit 300 Funktionsaufrufen im Callstack, aber das liegt weniger an den Design Patterns von der GoF.

    Ich habe so etwas schon selbst gesehen, doch ist das die Ausnahme und nicht die Regel. Overengineering ist durchaus häufiger zu bemerken (ich bin selbst nicht gänzlich immun dagegen, versuche es bewusst nur dann zu machen, wenn ich weiß das dies in der Zukunft tatsächlich sinnvoll ist [z.B. weil dafür schon ein Vorgang mit niedriger Priorität vorliegt, wichtigere Aufgaben aber vorher zu erledigen sind]).



  • Shade Of Mine schrieb:

    Deshalb ist es irgendwie doof zu sagen Pattern sind gut oder schlecht - denn sie sind einfach nur Namen. Und einheitliche Namen sind praktisch. Sie helfen in der Kommunikation enorm.

    Das Problem ist nur, das nach dem lesen des GoF-Buchs gerade Anfänger dazu neigen alle Pattern in Praxis zu nutzen, auch wenn sie eigentlich nicht nötig wären. Die einheitliche Benennung ist dagegen wiederum durchaus ein Argument für die Pattern.



  • GangOfFive schrieb:

    Welche Design Patterns verwendet ihr regelmäßig? Falls ja, wären Beispiele nett.

    Ich sehe mich öfters den Builder Pattern verwenden. Beispiel: Laden einer komplexen Objektstruktur aus einer Datei.

    GangOfFive schrieb:

    Welche Design Patterns sind evtl. Unfug?

    Einer der wohl am weitesten verbreiteten und schlimmsten Antipattern ist der Singleton Pattern.



  • asc schrieb:

    Shade Of Mine schrieb:

    Deshalb ist es irgendwie doof zu sagen Pattern sind gut oder schlecht - denn sie sind einfach nur Namen. Und einheitliche Namen sind praktisch. Sie helfen in der Kommunikation enorm.

    Das Problem ist nur, das nach dem lesen des GoF-Buchs gerade Anfänger dazu neigen alle Pattern in Praxis zu nutzen, auch wenn sie eigentlich nicht nötig wären. Die einheitliche Benennung ist dagegen wiederum durchaus ein Argument für die Pattern.

    Das ist aber kein Problem von Pattern sondern einfach ein Problem dass Anfänger schlechten Code schreiben. Das kann dir nach einem Effective C++ auch passieren.

    Aber mal ehrlich, wer gibt einem Anfänger das GoF Buch? Das ist zwar ein Standardwerk dass man im Regal stehen haben sollte, aber ich würde das nie Jemanden empfehlen zu lesen. Ist ja Trocken bis zum Umfallen. Es ist ja auch ein Pattern Katalog - zum Nachschlagen. Nichts zum aktiv lesen.

    Ich denke es liegt eher daran dass es eine Zeitlang einen Pattern Hype gab, dass viele Leute gegen Pattern sind. Denn viele Leute haben in der Hypephase Pattern als Allgemeinlösung für alle Probleme angepriesen. Das sind sie nicht. Pattern sind eine Sammlung von Standardlösungen von Standardproblemen denen man einen Namen gegeben hat um sie katalogisieren zu können und darüber reden zu können.

    Jeder Programmierer verwendet konstant überall Pattern. Weil er eben konstant und überall Standardprobleme löst.



  • dot schrieb:

    Einer der wohl am weitesten verbreiteten und schlimmsten Antipattern ist der Singleton Pattern.

    Das hängt aus meiner Sicht stark davon ab, wofür der SingleTon da ist. In einigen wenigen Fällen macht er durchaus Sinn (so z.B. in einem .NET Remoting Service, bei dem alle Remoting-Aufrufe in genau die gleiche Instanz gehen sollen.



  • Jeder der OOP und seine Programmiersprache verstanden hat, wird instinktiv Patterns einsetzen. Auch wenn er/sie es nicht weiß.

    Denn die Patterns sind doch nur verallgemeinerte Lösungen, die selbst aus der Praxis entstanden sind.

    Ich hatte damals, bevor ich etwas über Patterns oder GoF gehört/gelesen habe, schon Patterns eingesetzt. Das bringt schon alleine die Programmiersprache mit sich. Das Template-Pattern (nicht mit C++-Template zu verwechseln) wird jeder irgendwann mal anwenden, wenn er die Möglichkeit der Abstract-Methoden kennt.

    Und das Singleton wird auch jeder anwenden, wer Static-Variablen kennt.

    Ob er das dann so in einem Buch formuliert und verallgemeinert, ist dann eine andere Frage.

    Der entscheidende Punkt ist, das die GoF es getan haben! :p



  • inflames2k schrieb:

    dot schrieb:

    Einer der wohl am weitesten verbreiteten und schlimmsten Antipattern ist der Singleton Pattern.

    Das hängt aus meiner Sicht stark davon ab, wofür der SingleTon da ist. In einigen wenigen Fällen macht er durchaus Sinn (so z.B. in einem .NET Remoting Service, bei dem alle Remoting-Aufrufe in genau die gleiche Instanz gehen sollen.

    Ich hab in all meinen Jahren noch kein einziges Beispiel gesehen, wo Singleton tatsächlich Sinn gemacht hätte und dein Beispiel ist da leider keine Ausnahme, sondern nur ein weiteres Beispiel für das übliche Missverständnis (die Frage "Brauche ich nur eines davon?" liefert entgegen gängiger Auffassung leider keine Antwort auf die Frage "Sollte ich den Singleton Pattern verwenden?". Letztere ist fast ausschließlich immer mit "Nein" zu beantworten)... 😉



  • dot schrieb:

    Ich hab in all meinen Jahren noch kein einziges Beispiel gesehen, wo Singleton tatsächlich Sinn gemacht hätte

    Als Beispiel nahezu jede Userverwaltung.
    Du willst pro User nur ein Objekt haben, aber allgemeinen Zugriff auf User Objekte erlauben.

    Singleton ist mehr als nur das Standard getInstance() dass man kennt. Bei Singleton geht es um das Beschränken der Instanzen einer Klasse. Das muss nicht eins sein.



  • Shade Of Mine schrieb:

    Bei Singleton geht es um das Beschränken der Instanzen einer Klasse.

    exakt, wo das beim Beispiel einer Userverwaltung Sinn ergeben würde seh ich aber grad nicht; du modellierst ja nicht jeden User als eigene Klasse!?



  • Artchi schrieb:

    Jeder der OOP und seine Programmiersprache verstanden hat, wird instinktiv Patterns einsetzen. Auch wenn er/sie es nicht weiß.

    Das GoF Buch war seinerzeit tatsächlich eine Offenbarung für mich. Davor hatte ich OOP nicht verstanden. Ich war damals zwar nicht unbedingt ein Anfänger, weil ich schon sehr viel programmiert hatte, aber das war noch vor dem Studium und mir hatte damals auch noch keiner gesagt, was gut und was schlecht ist. Erst mit dem GoF Buch hab ich erkannt, dass OOP mehr ist, als Funktionen in Structs zu stecken. Ich bin damals also zumindest nicht selber intuitiv draufgekommen.



  • Shade Of Mine schrieb:

    Bei Singleton geht es um das Beschränken der Instanzen einer Klasse. Das muss nicht eins sein.

    Doch, muss es. Sonst hieße das Entwurfsmuster ja Multipleton.

    Es stellt sicher, dass von einer Klasse genau ein Objekt existiert

    https://de.wikipedia.org/wiki/Singleton_(Entwurfsmuster)
    Zum Singleton gehört auch die globale Verfügbarkeit.



  • Ich nutze auch Singleton, steinigt mich doch! :p
    Für Logs, Configs und "Spezial"-Resourcen. Für gewöhnlich wenn es um Dinge geht die über die Programmgrenzen hinausgehen und mit einzigartigen Entitäten verbunden sind.

    ------------------------------------------------

    Ich liebe Signal&Slots, Observer, Reactor und diverse Callbackansätze.
    Alle anderen Pattern die vorkommen sind "natürlich" entstanden.
    Insbesondere diese:
    Factory, Lazy XYZ, RAII, Adaptor / Wrapper, Proxy, Iterator und vieles was mit Multithreading zu tun hat, sind täglich Brot (so to speak). Aber das ist nicht wirklich überraschend.

    Ich habe mal vor einiger Zeit ein Projekt abgeglichen mit der Wikipedia Seite für 'Software Design Patterns'. Von den Myriaden an Patterns die darin vorkommen war nicht eines bewusst eingesetzt.



  • GangOfFive schrieb:

    Regelmäßig sehe ich Code von Kollegen, wo ein in meinen Augen simpler Sachverhalt mit dicken Design Patterns erschlagen wird.

    Yupp, geht mir auch so.

    Wenn alleine das Wort "Pattern" fällt, ist das Thema schon durch. Ein Java-Kid. Alles voll formalem Schmonz, Schnittstellen, Factories, Dependency Injection und vor allem Manager, ObjectManager, ManagerManager, PatternManager und schwupps hat man mit 1500 Zeilen Code was gebaut, was allerbequemstens in 50 passt.

    Die vergewaltigten Patterns sind dann noch das geringste Problem.

    Klar benutze ich auch (vielleicht sogar die meisten üblicherweise aufgelisteten) Patterns, ich nenne sie aber nur ganz selten so, nur wenn sie in Reinform auftauchen, was bei Strategy, Meyers-Singleton oder Factories mal vorkömmt. Sonst heißen sie nur Standard-Problemlösungen, Tricks oder Hacks. Und ich setze sie selten ein, vielleicht so selten wie Vererbung, häufiger als switch, seltener als do.



  • dot schrieb:

    Einer der wohl am weitesten verbreiteten und schlimmsten Antipattern ist der Singleton Pattern.

    Naja, das sehe ich anders.
    Es gibt auch in Foren und Chats Patterns und das Verleumden aller Singletons ist eins der am weitesten verbreiteten Antipatterns.



  • 5cript schrieb:

    Ich nutze auch Singleton, steinigt mich doch! :p
    Für Logs, Configs und "Spezial"-Resourcen. Für gewöhnlich wenn es um Dinge geht die über die Programmgrenzen hinausgehen und mit einzigartigen Entitäten verbunden sind.

    Gesteinigt wird nur für Apostasie und Ehebruch.

    Ne, ernsthaft: Singletons sind voll okay (für die von dir genannten Fälle z.B.). Diese Anti-Haltung finde ich sehr befremdlich.



  • volkard schrieb:

    dot schrieb:

    Einer der wohl am weitesten verbreiteten und schlimmsten Antipattern ist der Singleton Pattern.

    Naja, das sehe ich anders.
    Es gibt auch in Foren und Chats Patterns und das Verleumden aller Singletons ist eins der am weitesten verbreiteten Antipatterns.

    Singletons hebeln so'n bisschen die Segnungen der Objektorientierung aus. Letztlich bleibt nur noch Kapselung erhalten. Das muss hartgesottenen OOP-Freaks wohl voll gegen den Strich gehen.



  • Leprechaun schrieb:

    Ne, ernsthaft: Singletons sind voll okay (für die von dir genannten Fälle z.B.). Diese Anti-Haltung finde ich sehr befremdlich.

    Singletons werden gerne mal als globale Variablen missbraucht. Man klatscht nicht einfach so einen globalen integer rein, denn so hat man es ja damals bei dem alten C gemacht und man ist ja ein moderner Programmierer. Stattdessen macht man eine neue Klasse mit einem privaten integer, schreibt sich lehrbuchgetreu getter und setter, verpackt das ganze in ein singleton und schon hat man 50 Zeilen Code geschrieben ohne geistige Arbeit in eine Ueberarbeitung des Codekonzepts zu stecken und die anderen Programmierer muessen erstmal noch nochvollziehen, was dieser Code macht.
    Sie sind ein nuetzliches Werkzeug, aber oft ein grober Anfaengerfehler, gerade wenn jemand zu OOP gezwungen wird, ohne es wirklich zu verstehen.



  • Marthog schrieb:

    Leprechaun schrieb:

    Ne, ernsthaft: Singletons sind voll okay (für die von dir genannten Fälle z.B.). Diese Anti-Haltung finde ich sehr befremdlich.

    Singletons werden gerne mal als globale Variablen missbraucht. Man klatscht nicht einfach so einen globalen integer rein, denn so hat man es ja damals bei dem alten C gemacht und man ist ja ein moderner Programmierer. Stattdessen macht man eine neue Klasse mit einem privaten integer, schreibt sich lehrbuchgetreu getter und setter, verpackt das ganze in ein singleton und schon hat man 50 Zeilen Code geschrieben ohne geistige Arbeit in eine Ueberarbeitung des Codekonzepts zu stecken und die anderen Programmierer muessen erstmal noch nochvollziehen, was dieser Code macht.
    Sie sind ein nuetzliches Werkzeug, aber oft ein grober Anfaengerfehler, gerade wenn jemand zu OOP gezwungen wird, ohne es wirklich zu verstehen.

    Sorry, aber der Logger soll doch global sein.
    Also wird's auch ne globale Variable (ggfls. als Singleton, das ist recht egal).



  • Marthog schrieb:

    Leprechaun schrieb:

    Ne, ernsthaft: Singletons sind voll okay (für die von dir genannten Fälle z.B.). Diese Anti-Haltung finde ich sehr befremdlich.

    Singletons werden gerne mal als globale Variablen missbraucht. Man klatscht nicht einfach so einen globalen integer rein, denn so hat man es ja damals bei dem alten C gemacht und man ist ja ein moderner Programmierer. Stattdessen macht man eine neue Klasse mit einem privaten integer, schreibt sich lehrbuchgetreu getter und setter, verpackt das ganze in ein singleton und schon hat man 50 Zeilen Code geschrieben ohne geistige Arbeit in eine Ueberarbeitung des Codekonzepts zu stecken und die anderen Programmierer muessen erstmal noch nochvollziehen, was dieser Code macht.
    Sie sind ein nuetzliches Werkzeug, aber oft ein grober Anfaengerfehler, gerade wenn jemand zu OOP gezwungen wird, ohne es wirklich zu verstehen.

    Je mächtiger ein Werkzeug, desto größer seine Mißbrauchsmöglichkeiten.


Anmelden zum Antworten