Was ist, wenn ich keine Software Design Patterns verwende? [geschlossen]

17

Was für Probleme kann ich haben, wenn ich Software Design Patterns nicht verwende? Können Sie mir die Probleme bei der Annäherung an das Design mit objektorientierten Standardtechniken erläutern?

iStudent
quelle
24
Nicht wenige Software-Design-Muster liegen auf der Hand. Sie müssten sie alle sehr gut kennen, um sicherzugehen, dass Sie sie nicht verwenden - wahrscheinlich gut genug, dass Sie sie genauso gut verwenden könnten!
James McLeod
18
Als Nebeneffekt von @JamesMcLeod sind viele "Design Patterns" sehr offensichtlich und Dinge, die sowieso jeder tun würde. Warum geben wir ihnen dann Namen? Zum Zwecke der Kommunikation. "Ich verwende das X-Muster" hat eine weitaus größere semantische Dichte als die Erklärung Ihrer Lösung in der Hoffnung, dass das andere Ende lautet.
Phoshi
6
@AJMansfield Einige der schlimmsten Codes, die ich je gesehen habe, sind mit übermäßiger Begeisterung für Designmuster verbunden.
Erik Reppen
5
@ErikReppen Die Schuld für die übermäßige Verwendung von Designmustern sollte der Person zugeschrieben werden, die dies tut. Aus meiner Sicht liegt das Hauptproblem nicht in den Entwurfsmustern selbst, sondern in der Überverallgemeinerung (teilweise aufgrund mangelnder architektonischer Kontrolle) und der Überentwicklung (manchmal durch Ingenieurausschüsse).
rwong
5
"Design Patterns" ist ein Lexikon, keine Technik.
Kaz Dragon

Antworten:

76

Sie verpassen den Punkt.

Entwurfsmuster existieren in der Regel beim Entwerfen von Software, genau wie strukturelle Muster in der Welt existieren. Selbst wenn Sie den Namen der Dinge nicht kennen, werden Sie schließlich feststellen, dass bestimmte physische Strukturen für bestimmte Probleme gut geeignet sind. Sie werden feststellen, dass eine Dreiecksform aus Holz / Metallstäben usw. eine sehr stabile Struktur ist, jedoch nur in einer Ebene. Sie werden feststellen, dass quadratische Steine ​​gewisse Vorteile gegenüber runden haben ...

Ebenso sind bestimmte Softwarestrukturen auf irgendeine Weise einzigartig oder optimal. Sie werden sie schließlich finden und verwenden, unabhängig davon, ob Sie die Namen für sie kennen. Das ist der Kern von Designmustern - sie sind Namen für diese Strukturen, die erfahrene Programmierer sowieso kennen und verwenden. Es gibt Programmierern die Möglichkeit, viel einheitlicher und prägnanter zu kommunizieren. Es lässt Programmierer auch bewusster über das Konzept von Mustern nachdenken.

Also die zwei wichtigsten Punkte, die ich versuche zu machen:

  1. Sie können nicht nicht Entwurfsmuster verwenden.
  2. Wenn Sie die Namen für die Dinge, die Sie verwenden, nicht kennen, fällt es Ihnen schwer, in einem Team zu arbeiten.
Telastyn
quelle
12
+1: Absolut richtig. Ich habe mit der OO-Entwicklung begonnen, bevor Designmuster bekannt oder beliebt wurden. Ja, wir haben auch Dinge wie Fabriken, Singletons und etwas erfunden , das, wenn man es in einem hellen Licht betrachtet, wie das Strategiemuster aussieht. Der Punkt ist jetzt , dass ich Entwurfsmuster kennt , weiß ich , dass die Fabriken in Ordnung waren , aber hätte besser gemacht werden konnte, wurden die Singletons schlecht gemacht und was könnte eine Strategie - Muster viel besser gewesen wäre gewesen , wenn es eigentlich war ein Strategie - Muster.
Binary Worrier
3
... Wenn Sie sich mit Entwurfsmustern vertraut machen und lernen, wie man sie richtig einsetzt, sparen Sie so viel Zeit, dass Sie seltener versuchen, das Rad neu zu erfinden, und verhindern, dass Sie sich auf den Weg zu schlechtem Design und schlechten Lösungen begeben. Saugen Sie es auf und lernen Sie die Muster, verwenden Sie sie, wenn sie für Sie arbeiten, und verwenden Sie sie nicht, wenn sie nicht funktionieren.
Binary Worrier
1
Und das fasst genau meine Ansichten zu Mustern zusammen. Sie sind wunderbare Werkzeuge, um mit anderen Menschen zu kommunizieren, was Sie tun. Sie bauen sie aber nie genau, weil jedes Problem anders ist. Aber sie sind ein Kern, eine Richtung und eine grobe Reihe von Richtlinien, die befolgt werden müssen, und es macht es einfach, anderen zu erklären, was zum Teufel Sie tun.
Matt D
+1 für den Vergleich mit physikalischen Strukturen. Ich würde hinzufügen, dass es hilft, ein Haus zu bauen, wenn Sie bereits wissen, dass ein "Fachwerk" eine gute Struktur ist, um die Last eines Daches zu tragen, anstatt zu experimentieren und zu hoffen, dass es nicht zusammenbricht.
kdgregory
39

Diejenigen, die sich nicht an die Vergangenheit erinnern können, sind dazu verdammt, sie zu wiederholen.

Sie werden keinen anderen spezifischen Problemen gegenüberstehen als denjenigen, die durch Ihr Design hervorgerufen werden. Und mit der Zeit werden Sie die Muster verwenden, ohne sich dessen bewusst zu sein. Sie haben nur Zeit damit verbracht, sie selbst herauszufinden. Wenn Sie die Muster im Voraus kennen, können Sie sie leichter im Design erkennen und haben den großen Vorteil, dass sie von einer Reihe von Personen bewiesen werden.

Alles, was heute entwickelt wird, basiert größtenteils auf Vorkenntnissen, es wäre sinnlos, es zu ignorieren. Stellen Sie sich vor, Sie bauen heute einen Wolkenkratzer, ohne die Probleme der Menschen zu kennen, die vor einigen hundert Jahren Kathedralen gebaut haben.

devnull
quelle
10
"Jedes Zitat hat ein gleiches und entgegengesetztes Zitat." "Wir müssen die Vergangenheit aufreißen, wenn wir die Zukunft wirklich verdienen wollen." (OK, dass man Hitler war, also wahrscheinlich am besten, um es zu ignorieren ...)
Russell
20

Was für Probleme kann ich haben, wenn ich Software Design Patterns nicht verwende?

Sie haben das Problem, dass Sie keine Software schreiben können.

Variablen sind ein Entwurfsmuster.

Methoden sind ein Entwurfsmuster.

Operatoren - Addition, Subtraktion usw. - sind ein Entwurfsmuster.

Anweisungen sind ein Entwurfsmuster.

Werte sind ein Entwurfsmuster.

Referenzen sind ein Entwurfsmuster.

Ausdrücke sind ein Entwurfsmuster.

Klassen sind ein Entwurfsmuster.

...

Alles, was Sie zu jeder Zeit in der Programmierung tun, ist ein Entwurfsmuster . Meistens ist das Muster so tief in Ihrem Denken verankert, dass Sie es nicht mehr als "Designmuster" betrachten. Die Dinge, die Sie lernen müssen, wie "das Singleton-Muster" und so weiter, sind einfach Muster, die (noch) nicht in die von Ihnen verwendete Sprache eingebunden wurden.

Können Sie mir die Probleme bei der Annäherung an das Design mit objektorientierten Standardtechniken erläutern?

Nein, ich habe keine Ahnung, was diese Frage bedeutet. Entwurfsmuster sind "objektorientierte Standardtechniken" - das macht sie zu Entwurfsmustern . Ein Entwurfsmuster ist eine Standardtechnik zum Lösen eines bestimmten Problems, insbesondere (wenn auch nicht unbedingt ) in einer objektorientierten Sprache.

Eric Lippert
quelle
1
The things that you have to learn like "the singleton pattern" and so on are simply patterns that haven't (yet) been baked into whatever language you're using.- Das ist (fast) die Definition eines Entwurfsmusters - ein flexibles / leicht wiederverwendbares Codekonstrukt, das verwendet wird, um eine Einschränkung in der Sprache selbst zu überwinden, und das leicht mit anderen zu kommunizieren ist. Sobald es Teil der Sprache ist, ist es kein Designmuster mehr.
Izkata
1
@Izkata: Ihre Position ist also, dass beispielsweise das Beobachtermuster in C # unmöglich ist, weil C # das Beobachtermuster in Form von Ereignissen in die Sprache eingebaut hat? Das ist dumm. Das sprachspezifische Bit, das für ein Muster relevant ist, ist die kanonische Art, das Muster in der Sprache zu implementieren. Natürlich können Entwurfsmuster in Sprachen verwendet werden, die sie direkt unterstützen. das ist der springende Punkt, sie direkt zu unterstützen!
Eric Lippert
Ich habe nie gesagt, unmöglich, ich habe versucht, unnötig zu implizieren . Java verfügt beispielsweise über keine Ereignisse, sodass es das Entwurfsmuster verwendet, um sie zu simulieren.
Izkata
@ Izkata: Ich bin dann verwirrt. Sie sagten, sobald ein Muster Teil der Sprache ist, ist es kein Muster mehr. Ist "das Beobachtermuster" also ein Muster in Java, aber kein Muster in C #?
Eric Lippert
1
Oder anders ausgedrückt, ein Entwurfsmuster ist alles, was ein Programmierer tut, als es auf Englisch beschrieben werden kann. Ich bin mir nicht sicher, ob ich mit der Definition völlig einverstanden bin, aber ich denke, sie spiegelt genau das wider, was Sie sagen, und hat zumindest den Vorteil, dass kein subjektives Urteil gefällt wird, was als Muster zählt. Es ist eine Eigenschaft der Analyse dessen, was Programmierer tun, und natürlich ist es einem Programmierer nicht möglich, auf eine Weise zu handeln, die nicht analysiert werden kann :-)
Steve Jessop
4

Es ist wichtiger, den Sinn eines Entwurfsmusters zu verstehen, als es für den Buchstaben zu verwenden. Einige Muster sind, IMO, albern, zumindest in den Sprachparadigmen, an die ich gewöhnt bin. IMO, ein Programmierer, der Designmuster einfach blind verwendet und sie nicht wirklich versteht, ist ein schlechterer Programmierer als derjenige, der die Dinge selbst durchdenken möchte. Aber jemand, der sich mit den Ideen vertraut macht und dann selbst entscheidet, ob sie sich lohnen, ist wahrscheinlich ein viel stärkerer Programmierer als beide.

Das heißt, ich habe keine Ahnung, was der Sinn des Fliegengewichts ist, und ich schäme mich nicht, es zuzugeben. (Siehe Kommentare für einen anderen Wikipedia-Eintrag, der sehr geholfen hat.)

Ich empfehle den Eintrag von Wikipedia zu Designmustern. Es ist sehr kurz und klar geschrieben. Sehr hilfreich, um eine Vorstellung davon zu bekommen, warum man sich mit einem bestimmten Entwurfsmuster herumschlagen könnte oder nicht. Ich persönlich neige dazu, die einfachsten zu finden, die am nützlichsten sind, und würde nicht zweimal darüber nachdenken, eine bestimmte Implementierung eines Musters an meine Bedürfnisse anzupassen.

Das sind Ideen, keine Blaupausen. In einigen Sprachen sind sie überhaupt nicht sehr gute Ideen. In anderen Fällen werden sie zu Recht als Trick angesehen, um die Designschwächen einer Sprache zu überwinden, die durch eine geringere Komplexität besser ausgeglichen werden könnten. Unabhängig davon tut es nicht weh, sie zu untersuchen und zu verstehen, welche Herausforderungen sie bewältigen sollen, bevor Sie sich für Ihre eigenen bevorzugten Lösungen entscheiden.

Mit welchen Problemen werden Sie konfrontiert? Sie könnten Gelegenheiten verpassen und mehr Zeit für Probleme aufwenden als nötig, es sei denn, Sie sind ein Programmierer, der bereits alles herausgefunden hat. Es ist wichtig, ein kritisches Auge für beliebte Programmierideen zu haben, aber es schadet nie zu verstehen, was die Leute denken, dass sie lösen, da dies Ihren eigenen bevorzugten Lösungen / Ansätzen mehr Klarheit verleiht.

Erik Reppen
quelle
2
Schwunggewicht (nicht Schwungrad). Lesen Sie den ersten Absatz (und nur den ersten Absatz) des Wikipedia- Artikels, und schauen Sie sich dann Integer.valueOf (int) an, und überlegen Sie, wie oft dies vermeidet, neue Ganzzahlen für gemeinsame Werte zu erstellen.
2
@ MichaelT Und verdammt. Das hat es verdammt viel besser formuliert als alles, was ich gesehen habe. Vielen Dank.
Erik Reppen
Das Problem, das ich bei den meisten Entwurfsmusteranweisungen sehe, ist, dass sie versuchen, eine große Projektansicht zu geben (im GoF-Buch dreht sich alles um das Schreiben eines Textverarbeitungsprogramms - keine kleine Aufgabe). Aber manchmal sind sie auf viel kleinere (fast "triviale") Dinge anwendbar. 7 Codezeilen können das Fliegengewicht in etwas, das jeder ständig benutzt, sauber beschreiben. Viel einfacher zu verstehen als die großen Projekte oder erfundenen Beispiele.
1
@MichaelT Für mich ist es auch ein gutes Beispiel dafür, wie es für das Schreiben von Code im Allgemeinen hilfreich ist, ein wenig Klarheit über etwas zu erlangen, auch wenn diese Idee in meiner Primärsprache, JavaScript, keine unmittelbare Verwendung findet Problem. Nachdem ich diesen Moment hinter mir hatte, kamen mir noch einige relevante Ideen.
Erik Reppen
2

Das Hauptproblem ist, dass Sie das Rad neu erfinden werden . Sie werden Muster genannt, weil sie häufig und vorhersehbar auftreten.

pgpb.padilla
quelle
0

Selbst wenn Sie den Entwurfsmustern folgen, erhalten Sie möglicherweise einen schlechten Entwurf. Entwurfsmuster sind natürlich und Sie werden am Ende einen Teil davon in Ihrem Entwurf verwenden. Sie müssen sich wirklich bemühen, keines der Muster zu verwenden. Es gibt keinen Grund, Entwurfsmuster zu verurteilen. Wichtiger ist es, die richtigen Muster für Ihre Bedürfnisse auszuwählen

ViSu
quelle
-1

Sie verwenden ständig Entwurfsmuster, ohne es zu merken. Viele Standardbibliotheken in gängigen Sprachen wurden unter Berücksichtigung von Entwurfsmustern entwickelt. Ein Beispiel ist Javas FileReaderBibliothek, die nach dem Dekorationsmuster designt wurde . Wenn Sie jetzt über Ihren eigenen Code sprechen , müssen Sie (in den meisten Fällen) keine Entwurfsmuster verwenden. Ein Entwurfsmuster ist eine "wiederverwendbare Lösung für ein häufig auftretendes Problem" , dh, es hilft Ihnen dabei, saubereren, besser wartbaren Code zu schreiben. Es liegt also wirklich an Ihnen, wie viel Sie vermeiden möchten, mit Spaghetti-Code zu enden.

Savv
quelle