Entwurfsmuster - verwenden Sie sie?

44

Als IT-Student erhielt ich kürzlich von einem unserer Lehrer einen Überblick über Entwurfsmuster. Ich habe verstanden, wofür sie sind, aber einige Aspekte nerven mich immer noch.

Werden sie wirklich von der Mehrheit der Programmierer verwendet?

Apropos Erfahrung, ich hatte einige Probleme beim Programmieren, Dinge, die ich für eine Weile nicht lösen konnte, aber Google und einige Stunden Forschung haben mein Problem gelöst. Wenn ich irgendwo im Internet einen Weg finde, um mein Problem zu lösen, ist dies ein Entwurfsmuster? Benutze ich es?

Und suchen Sie (Programmierer) nach Mustern (wo soll ich eigentlich suchen?), Wenn Sie mit der Entwicklung beginnen? Wenn ja, ist dies sicherlich eine Angewohnheit, die ich zu akzeptieren beginnen muss.

UPDATE: Ich denke, wenn ich frage, ob Programmierer sie verwenden, frage ich, ob Sie denken, "Oh, ich sollte dieses Muster verwenden", wenn Sie ein Problem zur Lösung haben.

seth
quelle
7
Keine exakte doppelte Frage, aber meine Antwort wäre dieselbe. programmers.stackexchange.com/questions/70877/…
pdr
4
Die meisten dieser überbewerteten, überschriebenen "Entwurfsmuster" sind nur für die OOP-Programmierung relevant. Und es gibt viele gute Gründe, sich so lange wie möglich von OOP fernzuhalten.
SK-logic
5
Ich benutze Big Ball of Mud öfter als ich möchte. Ich mache nur Spaß.
Sashoalm
Die einzige Antwort ist Ja mit der bedingten Aussage von "Wenn angemessen"
Rig

Antworten:

114

Als ich ein Anfänger in der Programmierung war, liebte ich Designmuster. Ich habe nicht nur Designmuster verwendet. Ich habe sie zugefügt. Wo und wann immer ich konnte. Ich war gnadenlos. Aha! Beobachtermuster! Nimm das! Benutze einen Zuhörer! Proxy! AbstractFactory! Warum eine Abstraktionsebene verwenden, wenn fünf ausreichen? Ich habe mit vielen erfahrenen Programmierern gesprochen und festgestellt, dass fast jeder, der das GoF-Buch liest, diese Phase durchläuft.

Anfängerprogrammierer verwenden keine Entwurfsmuster. Sie missbrauchen Designmuster.

In jüngerer Zeit finde ich , dass die Muster Hilfe Prinzipien wie die Einzel Prinzip Verantwortung im Auge, und Schreiben von Tests zu halten zuerst an entsteht in einer pragmatischen Art und Weise. Wenn ich die Muster erkenne, kann ich sie leichter weiterverarbeiten. Ich erkenne sie, aber ich versuche nicht mehr, sie dem Code aufzuzwingen. Wenn ein Besuchermuster auftritt, liegt das wahrscheinlich daran, dass ich die Duplizierung überarbeitet habe, und nicht daran, dass ich mir im Voraus Gedanken über die Ähnlichkeiten beim Rendern eines Baums und beim Addieren seiner Werte gemacht habe.

Erfahrene Programmierer verwenden keine Entwurfsmuster. Entwurfsmuster verwenden sie.

Lunivore
quelle
2
@schlingel - Warum rufst du den OP Sir an?
Oded
10
@Oded Ich behalte mir das Recht vor, unter diesen Umständen "Sir" genannt zu werden, und genieße es.
Lunivore
3
Herr ja Herr. Nichts für ungut gemeint!
Oded
1
In Sowjetrussland .. :)
Sorantis
5
Gute Antwort, aber in der letzten Zeile haben Sie versucht, tiefgreifend zu sein, aber es ist unsinnig. Wie wäre es mit "Erfahrene Programmierer entscheiden sich nicht für Designmuster, sie lassen sie zu."
Garrett Hall
43

Ob man sie erkennt oder nicht, die meisten Programmierer tun Nutzungsmuster.

Bei der täglichen Arbeit beginnt man jedoch nicht mit dem Programmieren unter Berücksichtigung eines Musters - man erkennt, dass ein Muster im Code aufgetaucht ist, und benennt es dann.

Einige der gebräuchlichen Muster sind in einigen Sprachen integriert - beispielsweise das Iteratormuster, das mit dem foreachSchlüsselwort in C # integriert ist .

Manchmal kennen Sie bereits das Muster, das Sie als allgemeine Lösung für das jeweilige Problem verwenden werden (sagen Sie das Repository-Muster - Sie wissen bereits, dass Sie Ihre Daten als speicherinterne Sammlung darstellen möchten).

Oded
quelle
13
Das ist ziemlich genau das, was ich sagen wollte. Muster sind eine Sprache , die Programmierern dabei hilft, Design- und Implementierungsideen zu kommunizieren, nicht eine Reihe von Legobausteinen, die zur Implementierung eines Systems zusammengesteckt werden können.
Mark Booth
27
@DeadMG Warum ist das so?
Kris Harper
11
@DeadMG: Ich muss von der verblüffend dummen Idee geblendet worden sein - ich kann nicht verstehen, warum du es für dumm
hältst ;-)
2
@ root45 - Sie sehen, Freund, das foreachKonstrukt macht die Programmierung zu einfach. Wie kann man sich anderen überlegen fühlen, wenn eine komplexe Aufgabe wie das Durchlaufen einer Sammlung einfach ist? Ich für meinen Teil noch Code in Assembly für alle meine CRUD-Apps. Das Gefühl von @DeadMG ist eindeutig ein rein pragmatisches Genie.
ChaosPandion
8
@DeadMG - LINQ gab es nicht, als es .NET 1.0 / 1.1 gab. yieldgab es damals auch nicht. Denken Sie, dass es eine bessere Option ist, alten Code zu brechen, indem Sie ein Schlüsselwort entfernen?
Oded
22

Wie in der Antwort pdr linked impliziert : Design Patterns sind Namen für Dinge, die die Leute sowieso getan haben , um es den Leuten einfacher zu machen, diese Dinge zu diskutieren.

Im Allgemeinen lohnt es sich, sie zu Beginn zu erlernen, da sie Ihnen einen Einblick in die Lösungen geben, die die Mitarbeiter gefunden haben, damit Sie auf jahrelanger Erfahrung und Versuch und Irrtum aufbauen können.

Die Diskussion über motivierende Probleme, die in Mustern enthalten sind, gibt Ihnen möglicherweise einen Einblick in gute Möglichkeiten, Ihr Problem anzufechten. Wenn Sie jedoch aufgrund Ihrer Musterkenntnisse nicht erkennen, dass es eine bekannte Lösung gibt, müssen Sie sich immer noch auf die Lösung des Problems konzentrieren Problem zuerst.

Wenn sich herausstellt, dass ein oder mehrere vorhandene Muster verwendet werden, verfügen Sie über vorgefertigte Namen, die es anderen erleichtern, Ihren Code zu verstehen.

Nutzlos
quelle
+1 für eine aussagekräftige Zusammenfassung dessen, was ich sagen wollte: Konzentrieren Sie sich auf das Problem, und wenden Sie das Muster erst dann an, wenn das Problem so aussieht, als würde es ein Muster lösen.
Joshua Drake
1
+1 für die Angabe der wahren Tatsache, dass Designmuster Namen von Dingen sind, die die Leute sowieso getan haben .
Miraculixx
12

Generell nein. Manchmal tauchen Muster aus meinem Code auf, aber im Allgemeinen suche ich nicht danach und sage mit Sicherheit nicht "Oh, das Brückenmuster würde mein Problem lösen!".

Hier ist das Ding. Die meisten Muster werden missbraucht und missbraucht, ohne dass sich jemand Gedanken darüber macht, ob sie gut designt sind. Muster sind keine Atome. Code besteht nicht aus X-Permutation von Mustern. Ganz zu schweigen davon, dass nicht alle Muster wirklich gute Ideen sind oder dass einige Sprachen Lösungen auf Sprachebene haben, die einigen Mustern weit überlegen sind.

DeadMG
quelle
+1: Ich stimme zu, dass Muster manchmal missbraucht werden. Manchmal sehe ich Code, in dem der Programmierer ein Muster verwendet hat, nur weil er oder sie es wusste und fand, dass es cool ist, aber das machte den Code nur unnötig komplex und schwer zu lesen. Als würde man eine Nuss mit einer Planierraupe knacken. Ist eine Lösung auf Sprachebene nicht nur ein Muster, das direkt von der Sprache unterstützt wird? Oder was ist der Unterschied?
Giorgio
1
@ Giorgio: Andersherum werden einige Muster verwendet, um die Tatsache zu umgehen, dass es der Sprache an einer Möglichkeit mangelt, eine bestimmte Sache ordentlich auszudrücken.
Daenyth
8

Ja, die meisten Programmierer, denen ich je begegnet bin, verwenden das gängigste Muster, den Big Ball of Mud . Sie beginnen in der Regel mit gut gestalteten Architekturen, enden aber in der Regel hier, insbesondere wenn sie anfangen zu denken, "wir müssen überall Designmuster verwenden", und refaktorieren sie gnadenlos.

gbjbaanb
quelle
2
Der Link machte meinen Tag
dukeofgaming
1
Autsch. Diese Webseite benötigt eine gewisse Textformatierung.
Nagler
7

benutzt du sie

Ja, erfahrene Programmierer definitiv. Sie können die meisten Entwurfsmuster (mit Ausnahme einfacher Singleton-Elemente) vorerst vermeiden. Aber je mehr Sie programmieren und je komplexer Ihre Systeme sind, desto mehr werden Sie das Bedürfnis verspüren, Entwurfsmuster zu verwenden. Wenn Sie es dennoch vermeiden, werden Sie den Schmerz spüren, wenn Sie Ihr System erweitern und gemäß den neuen Anforderungen ändern müssen.

Wenn ich irgendwo im Internet einen Weg finde, um mein Problem zu lösen, ist dies ein Entwurfsmuster?

Nicht unbedingt. Ein Entwurfsmuster bezieht sich auf eine bestimmte Art und Weise, Klassen, ihr Verhalten und ihre Interaktionen zu entwerfen, um ein bestimmtes Ziel zu erreichen (oder ein bestimmtes Problem zu vermeiden). Was Ihnen möglicherweise begegnet ist, ist möglicherweise nicht wirklich ein Designproblem, sondern eine bestimmte Abfolge von Schritten zum Programmieren einer bestimmten API. Zum Beispiel: Es gibt eine bestimmte Reihenfolge zum Herstellen einer Socket-Verbindung. Tun Sie es falsch und Ihre Steckdose wird nicht kommunizieren. Diese Abfolge von Schritten bildet kein Muster.

Suchen Sie (Programmierer) nach Mustern?

Ja. Designmuster verkörpern das Axiom "Vorbeugen ist besser als Heilen". Wenn Sie ein bestimmtes bevorstehendes Konstruktionsproblem im Voraus erkennen, können Sie massive Neugestaltungen verhindern, um spätere Änderungen zu berücksichtigen. Es lohnt sich daher, die Entwurfsmuster im Voraus zu kennen und nach Stellen zu suchen, an denen Sie sie beim Erstellen Ihrer Anwendung verwenden müssen.

wo soll ich eigentlich hinschauen

Als Student haben Sie wahrscheinlich nicht die typischen Probleme gesehen, die Designmuster inspirieren. Ich empfehle dringend, dass Sie sich Head First Design Patterns ansehen . Sie stellen zunächst ein Entwurfsproblem dar und zeigen dann, wie ein bestimmtes Muster es lösen / vermeiden kann.

DPD
quelle
5

Design Patterns wurden nicht unterrichtet, als ich in der Schule war. Die meiste Zeit meiner Programmierkarriere habe ich mit veraltetem, nicht objektorientiertem Code gearbeitet. In den letzten Jahren habe ich versucht, sie zu lernen, weil sie nach einer so guten Idee klingen. Ich muss jedoch zugeben, dass meine Augen jedes Mal, wenn ich ein Buch aufgegriffen oder versucht habe, ein Tutorial zu diesem Thema zu lesen, glasig geworden sind und ich überhaupt nichts Praktisches darüber gelernt habe.

Ich kann nicht glauben, dass ich das in der Öffentlichkeit zugegeben habe. Ich glaube, ich habe wahrscheinlich gerade meine im Laufe der Jahre erlangten Fähigkeiten als Geek verloren.

Amy Anuszewski
quelle
3

Suchen Sie nicht nach Trend

Jede Standardprogrammierlösung für ein bestimmtes Problem kann als Entwurfsmuster betrachtet werden, unabhängig davon, wie beliebt sie sind oder ob andere Programmierer sie verwenden oder nicht.

Möglicherweise verwenden Sie bereits ein Entwurfsmuster, das noch nicht erfunden / spezifiziert wurde.

Versuchen Sie nicht, sie zu benutzen, versuchen Sie, in ihren Begriffen zu denken

Das Problem mit Entwurfsmustern ist, dass Programmierer manchmal ihre Probleme in sie einpassen möchten, wenn es umgekehrt ist.

Denken Sie daran, dass die Entwurfskonvention von Entwurfsmustern ein typisches Problem zu lösen hat. Sie können sogar Entwurfsmuster kombinieren, um andere größere Probleme anzugehen. Dies ist typisch für serviceorientierte Architekturen. Sehen Sie sich nur einige der vorhandenen SOA-Muster an .

Such sie in freier Wildbahn

Es gibt viele Open-Source-Projekte, in denen Sie angewandte Designmuster finden. Ein Beispiel, das mir in den Sinn kommt, ist Joomla: Sie finden Singletons , Beobachter . In GUI-Bibliotheken sind das Dekorationsmuster , das Befehlsmuster und möglicherweise sogar das Fliegengewicht implementiert .

Es gibt andere Muster wie Datenmuster, die beispielsweise nur vom Doctrine Project verwendet wurden, das aktive Datensatzmuster (1.x), das Entity Manager-Muster (2.x), die Arbeitseinheit , das Repository , das Abfrageobjekt , die Metadatenzuordnung und Daten Mapping und andere allgemeinere wie das Strategiemuster und das Dekorationsmuster .

Es stehen so viele interessante Lösungen zur Auswahl. Siehe Martin Fowlers Patterns of Enterprise Architecture , es gibt auch Datenmodellmuster .

Lerne sie einfach, wenn es soweit ist

Lernen Sie sie, kennen Sie sie, sind Sie von ihnen besessen, und wenn es soweit ist, wissen Sie, wie Sie das Programmierproblem x lösen können, werden Sie zu diesem Zeitpunkt bereits ein besserer Programmierer sein.

Architekt werden

Ich würde sagen, dass die Fähigkeit, in Mustern zu denken, um Probleme zu lösen, Sie effektiv in einen Software-Architekten verwandelt . Auch wenn Sie nicht per se ein Softwarearchitekt sein möchten, haben Ihre Lösungen standardmäßig eine höhere technische Qualität, sind sauberer und lassen sich in Bezug auf das Design besser skalieren.

dukeofgaming
quelle
1

Ich habe vor ungefähr 7 Jahren in C ++ programmiert und vor ungefähr 2 Jahren Patterns gelernt. Die meisten Muster haben wahrscheinlich einige Anwendungen, aber in meiner Verwendung sind einige besser als andere. Sie müssen sich überlegen, warum Sie sie verwenden.

Das Iterationsmuster hat meinen Code verwirrender gemacht und unnötige Komplexität hinzugefügt. Ich kann die gleiche Wartbarkeit mit Typedefs für STL-Vektortypen erhalten. Und alle Änderungen, die ich an der iterierten Klasse vornehme, müssen auch an der Iteratorklasse vorgenommen werden.

Die Factory-Methode hat sich jedoch aufgrund des Polymorphismus als äußerst nützlich erwiesen. Ich habe vergessen, wer es gesagt hat, aber die Aussage "Wiederverwendbarkeit bedeutet, dass alter Code neuen Code verwenden kann" trifft auf jeden Fall auf das Fabrikmuster zu.

Ich habe das Muster der Template-Methode jahrelang verwendet, ohne zu wissen, dass es sich um ein "Design-Muster" handelt.

Das Observer-Muster war in einigen Fällen hilfreich, manchmal auch nicht. Manchmal müssen Sie die Komplexität vorhersagen, um festzustellen, ob sich die Overhead-Komplexität des Observer-Musters lohnt. Wir haben ein Programm mit etwa 10 Teilnehmern, und es könnte noch viel mehr geben, daher war das Beobachter- / Abonnentenmuster hilfreich. Ein anderes Programm verfügt jedoch über zwei GUI-Anzeigen. Ich habe das Beobachtermuster für dieses Programm implementiert und es war größtenteils unnötig, einfach weil es die Komplexität erhöht hat und ich nicht damit rechne, mehr Displays hinzuzufügen.

Ich denke, diejenigen, die sagen, dass sie immer Muster verwenden, gehen davon aus, dass Ihr Programm unendlich komplex sein wird, aber wie bei allem gibt es einen Break-Even-Punkt in Bezug auf die Komplexität.

Chance
quelle
1

Hinzufügen zu Lunivore. Ich möchte dies aus dem ersten Buch zitieren

        ## **Three steps to great software** ##     
  • Stellen Sie sicher, dass die Software das tut, was der Kunde wünscht
  • Gute objektorientierte Prinzipien anwenden
  • Streben Sie nach einem wartbaren, wiederverwendbaren Design

Es ist in der dritten Phase, nachdem Ihr System so funktioniert, wie es soll. Es ist an der Zeit, die Muster anzuwenden, um Ihre Software für die kommenden Jahre bereit zu machen.

Aditya P
quelle
0

Werden sie wirklich von der Mehrheit der Programmierer verwendet?

Ich würde ja raten. In ADO.Net gibt es eine DataAdapter-Klasse, um ein einfaches Beispiel zu geben. Abhängig davon, in welchem ​​Bereich Sie die Muster spezialisieren möchten, können diese variieren.

Apropos Erfahrung, ich hatte einige Probleme beim Programmieren, Dinge, die ich für eine Weile nicht lösen konnte, aber Google und einige Stunden Forschung lösten mein Problem. Wenn ich irgendwo im Internet einen Weg finde, um mein Problem zu lösen, ist dies ein Entwurfsmuster? Benutze ich es?

Nein, das ist für mich kein Designmuster. Ein Entwurfsmuster besteht in der Regel aus einer Anordnung von Klassen und Methoden, die das Rezept eines Musters definieren.

Ich würde es vorziehen, mir vorzustellen, was Sie dort als gängige Praxis gemacht haben. Achten Sie jedoch auf das Kopieren und Einfügen.

Und finden Sie (Programmierer) sich selbst dabei, nach Mustern zu suchen (wo soll ich übrigens suchen?), Wenn Sie mit der Entwicklung beginnen? Wenn ja, ist dies sicherlich eine Angewohnheit, die ich zu akzeptieren beginnen muss.

Manchmal, wenn ich denselben Code immer wieder sehe, finde ich möglicherweise eine Möglichkeit, den Code in ein Muster umzugestalten, oder wenn ich mich an eine Lösung für ein ähnliches Problem mit einem Muster erinnere, nehme ich es heraus und verwende es. Head First Design Patterns enthält mehr als nur ein paar Muster, während Refactoring ein Vorschlag für Codierungspraktiken ist, die dazu führen können, dass man verschiedene Muster findet. Wenn Sie einen anderen möglichen Ausgangspunkt wünschen, lesen Sie die Anleitungen und Vorgehensweisen von Microsoft .

JB King
quelle
0

Lernmuster ist nicht nur etwas zu lernen. Sie lernen, was Sie mit Programmiersprachen machen können. Ich selbst habe viel über objektorientiertes Programmieren gelernt, indem ich gelernt habe, wie ein Muster funktioniert ( in diesem Fall das zusammengesetzte Muster ).

Wie von Oded erwähnt, verwenden die meisten Programmierer sie manchmal, ohne es überhaupt zu erkennen. Das Schöne an Mustern ist, dass Sie bestimmte Probleme mit einem vordefinierten Muster lösen können, so dass Sie nicht viel über architektonische Dinge nachdenken müssen.

GnrlWissen
quelle
0

Sie lernen Muster, wenn Sie mit vorhandenen Projekten arbeiten. Es gibt so viele Muster, die Sie lernen können, und es lohnt sich nicht, alle zu beherrschen, da dies davon abhängt, an welchem ​​Projekt Sie arbeiten. Wenn Sie auf einen stoßen, lernen Sie ihn kennen, um zu sehen, wie er verwendet wird.

Ammar
quelle