it-swarm.com.de

Designmuster - verwenden Sie sie?

Als IT-Student erhielt ich kürzlich von einem unserer Lehrer einen Überblick über Designmuster. 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 eine Weile nicht lösen konnte, aber Google und einige Stunden Recherche haben mein Problem gelöst. Wenn ich irgendwo im Web einen Weg finde, mein Problem zu lösen, ist dies ein Entwurfsmuster? Benutze ich es

Und suchen Sie (Programmierer) zu Beginn der Entwicklung nach Mustern (wo soll ich übrigens suchen?)? Wenn ja, ist dies sicherlich eine Gewohnheit, die ich annehmen muss.

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

45
seth

Als Programmieranfänger 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 Book liest, diese Phase durchläuft.

Anfänger verwenden keine Entwurfsmuster. Sie missbrauchen Designmuster.

In jüngerer Zeit stelle ich fest, dass die Berücksichtigung von Prinzipien wie dem Prinzip der Einzelverantwortung und das Schreiben von Tests zuerst dazu beitragen, dass die Muster pragmatischer entstehen. Wenn ich die Muster erkenne, kann ich sie leichter weiterentwickeln. Ich erkenne sie, versuche aber nicht mehr, sie dem Code aufzuzwingen. Wenn ein Besuchermuster auftritt, liegt dies wahrscheinlich daran, dass ich die Duplizierung überarbeitet habe, und nicht daran, dass ich im Voraus über die Ähnlichkeiten beim Rendern eines Baums im Vergleich zum Addieren seiner Werte nachgedacht habe.

Erfahrene Programmierer verwenden keine Entwurfsmuster. Designmuster verwenden sie.

115
Lunivore

Ob man sie erkennt oder nicht, die meisten Programmierer verwenden Muster.

Bei der täglichen Arbeit beginnt man jedoch nicht mit dem Programmieren mit einem Muster im Auge - man erkennt, dass ein Muster im Code entstanden ist und benennt es dann.

Einige der gängigen Muster sind in einige Sprachen integriert - beispielsweise das in C # integrierte Iteratormuster mit dem Schlüsselwort foreach .

Manchmal kennen Sie bereits das Muster, das Sie als allgemeine Lösung für das vorliegende Problem verwenden werden (z. B. Repository-Muster - Sie wissen bereits, dass Sie Ihre Daten als In-Memory-Sammlung darstellen möchten).

43
Oded

Wie aus der Antwort hervorgeht pdr verknüpft: Entwurfsmuster sind Namen für Dinge, die die Leute sowieso getan haben, um es den Leuten zu erleichtern, diese Dinge zu diskutieren.

Im Allgemeinen lohnt es sich, sie zu Beginn zu lernen, 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 überhaupt anzugreifen. Wenn Sie jedoch aufgrund Ihres Musterwissens nicht erkennen, dass es eine bekannte Lösung gibt, müssen Sie sich dennoch auf konzentrieren. -Nur das Problem lösen zuerst.

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

22
Useless

Im Allgemeinen nein. Es gibt Zeiten, in denen Muster aus meinem Code hervorgehen, aber im Allgemeinen suche ich nicht nach ihnen 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 Menschen jemals darüber nachdenken, ob sie gutes Design haben. 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.

12
DeadMG

ja, die meisten Programmierer, denen ich jemals begegnet bin, verwenden das häufigste Muster, das es gibt, den Big Ball of Mud . Sie beginnen normalerweise mit gut gestalteten Architekturen, landen aber normalerweise hier, besonders wenn sie anfangen zu denken, "wir müssen überall Designmuster verwenden" und gnadenlos umgestalten.

8
gbjbaanb

benutzt du sie

Ja, erfahrene Programmierer auf jeden Fall. Sie können die Verwendung der meisten Entwurfsmuster (mit Ausnahme einfacher Singleton-Inhalte) vorerst vermeiden. Aber je mehr Sie programmieren und je komplexer die 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 Web einen Weg finde, mein Problem zu lösen, ist dies ein Entwurfsmuster?

Nicht unbedingt. Ein Entwurfsmuster bezieht sich auf eine bestimmte Art und Weise, Klassen, ihre Verhaltensweisen und Interaktionen zu entwerfen, um ein bestimmtes Ziel zu erreichen (oder ein bestimmtes Problem zu vermeiden). Was Ihnen möglicherweise begegnet ist, ist möglicherweise kein wirkliches Entwurfsproblem, sondern eine bestimmte Abfolge von Schritten zum Programmieren einer bestimmten API. Beispiel: Es gibt eine bestimmte Reihenfolge zum Herstellen einer Socket-Verbindung. Wenn Sie es falsch machen, kommuniziert Ihre Steckdose nicht. 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 Designproblem im Voraus erkennen können, können Sie massive Neugestaltungen verhindern, um Änderungen später zu berücksichtigen. Es lohnt sich also, 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 übrigens 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 vor und zeigen dann, wie ein bestimmtes Muster es lösen/vermeiden kann.

7
DPD

Design Patterns wurden nicht unterrichtet, als ich in der Schule war. Und während des größten Teils meiner Programmierkarriere habe ich mit altem, 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 gestehen, dass jedes Mal, wenn ich ein Buch in die Hand genommen oder versucht habe, ein Tutorial zu diesem Thema zu lesen, meine Augen glasig geworden sind und ich überhaupt nichts Praktisches über sie gelernt habe.

Ich kann nicht glauben, dass ich das gerade öffentlich zugegeben habe. Ich glaube, ich habe wahrscheinlich gerade einen Geek-Ruf verloren, den ich im Laufe der Jahre aufgebaut habe.

5
Amy Anuszewski

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 verwenden, sondern denken Sie in ihren Begriffen

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

Denken Sie daran, dass die Designkonvention von Designmustern ein typisches Problem darstellt. Sie können sogar Designmuster kombinieren, um andere größere Probleme anzugehen. Dies ist typisch für serviceorientierte Architekturen, siehe nur einige der SOA Muster, die es gibt .

Suche 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 ist Dekorationsmuster , Befehlsmuster implementiert und möglicherweise sogar Fliegengewicht .

Es gibt andere Muster wie Datenmuster, zum Beispiel das Doctrine Projekt allein hat verwendet, das aktives Datensatzmuster (1.x), Entitätsmanager) Muster (2.x), Arbeitseinheit , Repository , Abfrageobjekt , Metadatenzuordnung , Datenzuordnung und andere allgemeinere wie Strategiemuster und Dekorationsmuster .

Es gibt einfach so viele interessante Lösungen zur Auswahl. Siehe Martin Fowlers Muster der Unternehmensarchitektur , es gibt auch Datenmodellmuster .

Lerne sie einfach, wenn es soweit ist

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

Architekt werden

Ich würde sagen, dass in der Lage zu sein, in Musterbegriffen zu denken, um Probleme zu lösen, macht Sie effektiv zu einem Software-Architekten . Auch wenn Sie per se kein Softwarearchitekt sein möchten, weisen Ihre Lösungen standardmäßig eine höhere technische Qualität, eine sauberere und bessere Skalierbarkeit in Bezug auf das Design auf.

3
dukeofgaming

Ich habe ungefähr 7 Jahre in C++ programmiert und vor ungefähr 2 Jahren Muster 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 Iteratormuster hat meinen Code tatsächlich verwirrender gemacht und unnötige Komplexität hinzugefügt. Ich kann die gleiche Wartbarkeit mit typedefs für STL-Vektortypen erzielen. Und alle Änderungen, die ich an der iterierten Klasse vornehme, muss ich auch an der Iteratorklasse vornehmen.

Die Fabrikmethode war jedoch aufgrund des Polymorphismus, den sie bietet, äußerst nützlich. Ich habe vergessen, wer es gesagt hat, aber die Aussage "Wiederverwendbarkeit bedeutet, dass alter Code neuen Code verwenden kann" stimmt definitiv mit dem Factory-Muster überein.

Ich habe das Muster der Vorlagenmethode jahrelang verwendet, ohne zu wissen, dass es sich um ein "Entwurfsmuster" handelt.

Das Beobachtermuster war in einigen Fällen hilfreich, manchmal nicht. Manchmal muss die Komplexität vorhergesagt werden, um festzustellen, ob sich die Overhead-Komplexität des Observer-Musters lohnt. Wir haben ein Programm, das ungefähr 10 Abonnenten verwendet, 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 erwarte, weitere Anzeigen hinzuzufügen.

Ich denke, diejenigen, die sagen, immer Muster zu 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.

1
Chance

Hinzufügen zu Lunivore. Ich würde das gerne aus dem ersten Buch zitieren

        ## **Three steps to great software** ##     
  • Stellen Sie sicher, dass die Software das tut, was der Kunde möchte
  • Wenden Sie gute objektorientierte Prinzipien an
  • Streben Sie nach einem wartbaren, wiederverwendbaren Design

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

1
Aditya P

Lernmuster sind nicht nur etwas zu lernen. Sie lernen, was Sie mit Programmiersprachen machen können. Ich selbst habe viel über objektorientierte Programmierung gelernt, indem ich einfach gelernt habe, wie ein Muster funktioniert (das zusammengesetztes Muster in diesem Fall).

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 angehen können, sodass Sie nicht viel über architektonische Dinge nachdenken müssen.

0
GnrlKnowledge

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 eines stoßen, lernen Sie es kennen, um zu sehen, wie es verwendet wird.

0
Ammar

Werden sie wirklich von der Mehrheit der Programmierer verwendet?

Ich würde ja raten. In ADO.Net gibt es eine DataAdapter-Klasse, die ein einfaches Beispiel gibt. Je nachdem, auf welchen Bereich Sie sich spezialisieren möchten, können die Muster variieren.

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

Nein, das ist für mich kein Designmuster. Ein Entwurfsmuster weist tendenziell eine Anordnung von Klassen und Methoden auf, die das Rezept eines Musters definieren.

Ich würde es vorziehen, an das, was Sie dort getan haben, als gängige Praxis zu denken. Achten Sie jedoch auf das Kopieren und Einfügen von Codierungen.

Und suchen Sie (Programmierer) nach Mustern (wo soll ich übrigens suchen?), Wenn Sie mit der Entwicklung beginnen? Wenn ja, ist dies sicherlich eine Gewohnheit, die ich annehmen muss.

Manchmal, wenn ich immer wieder denselben Code sehe, finde ich möglicherweise eine Möglichkeit, den Code in ein Muster umzuwandeln, oder wenn ich mich an eine Lösung für ein ähnliches Problem mit einem Muster erinnere, nehme ich ihn heraus und verwende ihn. Head First Design Patterns enthält mehr als ein paar Muster, während Refactoring ein Vorschlag für Codierungspraktiken ist, die dazu führen können, dass verschiedene Muster gefunden werden. Wenn Sie einen anderen möglichen Ausgangspunkt wünschen, schauen Sie sich Microsoft's Patterns and Practices an.

0
JB King