2008-09-17 9 views
53

Jeder kann das GoF-Buch lesen, um zu erfahren, was Designmuster sind und wie sie zu verwenden sind, aber was ist der Prozess um herauszufinden, wann ein Designmuster ein Problem löst? Führt das Wissen über das Muster zum Entwurf, oder gibt es eine Möglichkeit herauszufinden, wie ein Muster zum Ändern eines Entwurfs verwendet werden kann?Woher wissen Sie, wann Designmuster verwendet werden?

Mit anderen Worten, gibt es Muster für Muster?

Antwort

33

Entwurfsmuster sollen eine Struktur bereitstellen, in der Probleme gelöst werden können. Wenn Sie ein reales Problem lösen, müssen Sie viele winzige Variationen einer Lösung für dieses Problem in Betracht ziehen, um zu sehen, ob irgend ein Designmuster passt. Insbesondere müssen Sie wahrscheinlich Ihr Problem oder seine Lösung verallgemeinern, um ein Designmuster anzupassen.

Die Antwort ist, es ist eine Kunst. Wissen das Design-Muster ist sicherlich ein wichtiger Schritt. Eine Möglichkeit, sich an diese Art von Dingen zu gewöhnen, ist, Anwendungen von Entwurfsmustern zu studieren, nicht nur die Muster. Viele verschiedene Anwendungen eines Musters können Ihnen im Laufe der Zeit helfen, eine Aufgabe besser auf ein Muster abzubilden.

+4

Wie werden verschiedene Anwendungen untersucht, wenn sie nicht dokumentiert sind? In der realen Welt wenden wir uns an und gehen vorwärts. Wie finde ich diese Quelle, wo wir vor der Anwendung über erfolgreiche Anwendung studieren können ??? Wo ist die Quelle ??. –

+0

geben Sie diesem Mann ein Bier. – user1262904

38

Ich würde empfehlen, Head First Design Patterns von O'Reilly zu lesen. Dies erklärt, wie diese Muster in der realen Welt verwendet werden können.

Head First Design Patterns

würde ich auch hinzufügen, dass nicht versuchen, Design zu viel mit Mustern im Auge behalten. Mehr, suchen Sie nach "Code Gerüche", die ein Muster helfen könnte, zu lösen.

+1

Ja, ich habe dieses Buch. Es ist sehr gut. Ich interessiere mich nicht für die Beispiele (Enten und Pizza und was nicht), aber es gibt eine solide Grundlage auf Entwurfsmustern. –

+4

Aber die Beispiele in diesem Buch (mit Pizzas, Schokoladenfabriken und so weiter) helfen Ihnen wirklich, das Konzept und die Idee zu jedem Muster zu verstehen. –

+0

Es fühlt sich an wie das Design-Muster in das Gehirn injiziert werden. Wirklich ein tolles Buch. – Jnana

6

Erfahrung. Lerne die Muster und Beispiele ihrer Verwendung kennen. Jedes Mal, wenn Sie eine Designentscheidung treffen müssen, denken Sie darüber nach, ob ein Muster, das Sie kennen, darauf zutreffen würde. Im Laufe der Zeit werden Sie besser und Sie entdecken neue Wege, die Muster auf eine größere Bandbreite von Problemen anzuwenden.

+0

Und einer der besten Orte, um Designmuster zu erkennen, ist ein Coding Dojo, in dem die Teilnehmer "absichtlich" mit Spielzeugproblemen umgehen (siehe http://en.wikipedia.org/wiki/Kata_(programming)). Lokale Benutzergruppen hosten manchmal Dojos. Aber selbst wenn man kein Dojo finden kann, um mitzumachen, gibt es viel Wert, wenn man Katas alleine durchläuft. –

4

Ein weiteres großartiges Buch, das ich gefunden war:

Refactoring zu Patterns

Indem wann, wo und wie Sie Code-Muster bestehende verändern kann, es gab mir ein viel besseres Verständnis der Konzepte und eine Fähigkeit zu identifizieren, wo sie verwendet werden können.

2

Wie haben Sie gelernt, wann eine if-Anweisung zu verwenden ist?

Ich vergleiche es mit dem, weil es ein größeres Konstrukt, das Sie wissen müssen, bevor Sie es effektiv nutzen können. Eine if-Anweisung löst eine Klasse von Verzweigungsproblemen. Ein Brückenmuster löst eine Klasse von Problemen. Ich sehe sie wirklich nicht anders.

3

Wenn Sie die Muster kennen, werden sie zu Werkzeugen in Ihrer Toolbox. Wenn Sie sich eine Aufgabe ansehen, wählen Sie aus Ihren Werkzeugen aus. An diesem Punkt sollten Sie eine ziemlich gute Idee haben, welches Werkzeug für ein gegebenes Problem am besten geeignet ist. Dies ist, wo Formeln aufhören zu arbeiten und Sie tatsächlich Engineering-Arbeit.

2

Ich stimme zu, dass nur das Lernen der Muster nicht ausreicht. Das Problem mit den meisten Büchern ist, dass sie keine realen Beispiele bieten. Ich habe gehört, dass Head First Design Patterns, wie einige früher vorgeschlagen haben, ein gutes ist.

Eine andere Sache ist, dass die meisten Bücher absichtlich nicht sprachspezifische sind, die eine gute oder eine schlechte Sache für Sie sein können. Es ist jedoch wichtig, ein Muster im Allgemeinen zu verstehen, Es ist ebenso wichtig zu wissen, wie man es gut implementiert. Ich bin auf ein Buch mit dem Namen C# 3.0 Design Patterns gestoßen, das diesen beiden untrennbaren Aspekten genau die gleiche Farbe widmet.

2

Ich hatte die gleiche Frage, als ich zum ersten Mal Design-Muster begegnete. Ich habe die Konzepte geschätzt, wusste aber nicht wann oder wie ich sie anwenden kann. Mein erster Ansatz war, während der Designphase nach Anwendbarkeit zu suchen. Sobald Sie ein Blockdiagramm und halb-klare Verantwortlichkeiten für jeden Block haben, ist es nicht zu schwer, die Verantwortungen zu übernehmen und sie mit einem anständigen Nachschlagewerk zu referenzieren. Einige gute wurden hier erwähnt, aber die GoF sollte auf Ihrer Liste stehen. Der nächste Schritt besteht darin, nach Verbesserungen im Design zu suchen, basierend auf dem, was Sie in den Mustern sehen.

7

Entwurfsmuster? Du trinkst in ihnen ein!

Designmuster sind nichts Besonderes, sie sind nur Muster des Designs. Alle Entwicklungen verwenden Entwurfsmuster. Es gibt eine bestimmte Menge von Entwurfsmustern in der objektorientierten Programmierung, die allgemein als wünschenswert betrachtet werden und die kanonischen Entwurfsmuster geworden sind. Es gibt aber auch viele unerwünschte oder anderweitig indifferente Entwurfsmuster (wie design anti-patterns) sowie unentdeckte und/oder undokumentierte Muster.

Sie können die Verwendung von Mustern beim Programmieren nicht vermeiden. Sie können jedoch besser erkennen, welche Muster Sie verwenden und wann bestimmte Muster nützlich sind und wann nicht. Das Lernen der kanonischen Designmuster aus der GoF book wird helfen, ebenso wie das Lernen über code smells and refactoring. Es gibt keine richtige Antwort darauf, wann ein bestimmtes Design oder Design-Muster verwendet werden sollte. Sie müssen Erfahrung sammeln, indem Sie sie verwenden und implementieren, um zu wissen, wann und wo Sie welches Muster verwenden sollten.

11

Drehen Sie die Frage um: Das Muster, das Sie machen sollten, ist "Welches Muster passt zu meinem Problem". Betrachten Sie ein wirklich einfaches Muster, indem Sie ein Element in einem Array finden. in C, dann ist es so etwas wie

TYPE_t ary[SIZE] = // ... gets initialized somehow 
size_t ix ;  // Your index variable 

for(ix=0; ix < SIZE; ix++){ 
    if (ary[ix] == item) { 
     return ix ; 
    } 
} 

Sie den Code sehen nicht und denken, „wo kann ich das“, schauen Sie auf das Problem und sagen „weiß ich, wie ein Element in einem Array zu finden "

Mit umfangreicheren Mustern funktioniert wirklich der gleiche Weg. Sie müssen viele Kopien einer Datenstruktur haben, die sich nicht oft ändert - das bringt Sie auf "Fliegengewicht". Du willst etwas, das auf beiden Seiten einer Netzwerkgrenze lebt, du denkst Proxy. Wenn Sie Muster untersuchen, besonders die GoF, fragen Sie sich: "Welche Situationen verlangen nach diesem Muster? Habe ich dieses Muster schon einmal gesehen? Wozu hätte ich das in früheren Arbeiten verwenden können? Wo kann ich ein Beispiel dafür finden?" mein eigenes Leben?"

11

Es gibt ein Kernkonzept zugrunde liegenden Mustern, dass die meisten Menschen nicht grok. Betrachten Sie sie nicht als Datenstrukturen oder Algorithmen.

Denken Sie stattdessen an Ihren Code als Personen, die Nachrichten wie das Übergeben von Notizen oder das Senden von Briefen an andere senden. Jedes Objekt ist eine "Person".

Die Art, wie Sie die "Personen" und die Muster, die sie verwenden, um Nachrichten aneinander zu senden, organisieren, sind die Muster.

2

Das Konzept eines Entwurfsmusters wurde, wie bei vielen Praktiken des Software-Engineerings, aus dem Statikbereich übernommen. Wenn Sie über den Aufbau einer Struktur nachdenken, müssen Entscheidungen darüber getroffen werden, wie diese Struktur aufgebaut werden kann, um die festgelegten Ziele zu erreichen. Wenn Sie diese Entscheidungen treffen, haben Sie eine Reihe von Anforderungen, von denen Sie arbeiten können. Es kann etwas so einfaches sein wie Bridge muss in der Lage sein, X Tonnen auf einmal zu unterstützen, oder eine bestimmte Zugfestigkeit haben, genügend Bewegung im Wind usw. zu erlauben. Ein Architekt würde vorherige Kenntnisse anderer Builds verwenden, um diese Designwahlen zu machen. Er/Sie würde sehr wahrscheinlich versuchen, das Problem von Grund auf zu lösen.

Software Engineering und Design Patterns sind genau gleich. Sie sind einfach gemeinsame Lösungen für allgemeine Probleme. Wenn Sie die Entwurfsmuster kennen, dann wenn Sie ein Design bearbeiten und ein bestimmter Teil eines Systems etwas benötigt, das zu Ihrem Designmuster passt, dann verwenden Sie es. Versuchen Sie nicht, ein System um ein Designmuster anzuordnen, passen Sie Designmuster an Ihr System an (wo sie passen). Versuchen Sie einfach, sie als eine Reihe von Lösungen zu betrachten, um die Menge an Entwurfsarbeit, die Sie tun müssen, zu reduzieren, und seien Sie vorsichtig, Ihre Lösungen so zu überfrachten, dass sie so viele Entwurfsmuster wie möglich einfügen. Dies wird nur dazu dienen, Ihre Lösung unhaltbar und wahrscheinlich ziemlich fehlerhaft zu machen.

4

Rian van der Merwe schrieb eine excellent article auf dieser für Smashing Magazine im Juni 2012. Hier sind einige wichtige Punkte.

Entwurfsmuster sind aus zwei Gründen nützlich:

  1. Patterns Zeit sparen, weil wir gelöst haben kein Problem lösen müssen, die bereits ist.
  2. Muster erleichtern die Verwendung des Web, da sich die Benutzer bei der zunehmenden Akzeptanz bei den Designern daran gewöhnen, wie die Dinge funktionieren, was wiederum ihre kognitive Belastung bei gemeinsamen Designelementen verringert.

van der Merwe empfiehlt, dass wir Bruchmuster berücksichtigen, wenn:

  1. Die neue Art und Weise Usability empirisch verbessert oder
  2. Die etablierte Art und Weise wird überholt.
+0

Das ist eine andere Art von Design-Muster, aber Ihre Antwort ist immer noch großartig. :) –

0

Ein Entwurfsmuster ist eine allgemeine Beschreibung wie ein gemeinsames Problem zu lösen. Im moment gibt es zwei Dinge, die wir sollten auf Folgendes zu achten:

Erstens ist es eine Allgemeine Beschreibung ist; es ist nicht die konkrete Lösung, und es ist auch kein vollständiges Rezept, es ist nur eine Beschreibung, wie die Lösung aussehen würde, um ein allgemeines Problem anzugehen.

Zweitens ist das Problem Frage ein häufiges Problem ist:, das bedeutet, dass dieses Problem schon oft aufgetreten ist, und im Laufe der Zeit Menschen entwickelt eine Beschreibung dafür, wie eine ideale Lösung kann auf diese häufig wiederholt angewendet werden Problem.

Wenn Sie also auf ein neues Problem stossen, das nicht alltäglich ist, versuchen Sie nicht, Entwurfsmuster zu verwenden, um es zu lösen, oder machen Sie zumindest keine Entwurfsmuster, um jedes Problem zu lösen.

Verwandte Themen