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.
quelle
Antworten:
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.
quelle
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
foreach
Schlü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).
quelle
foreach
Konstrukt 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.yield
gab es damals auch nicht. Denken Sie, dass es eine bessere Option ist, alten Code zu brechen, indem Sie ein Schlüsselwort entfernen?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.
quelle
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.
quelle
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.
quelle
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.
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.
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.
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.
quelle
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.
quelle
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.
quelle
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.
quelle
Hinzufügen zu Lunivore. Ich möchte dies aus dem ersten Buch zitieren
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.
quelle
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.
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.
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 .
quelle
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.
quelle
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.
quelle