Wie wichtig sind Designmuster bei der Programmierung?

19

Ich bin ein Universitätsstudent und habe gerade angefangen, über Designmuster zu lernen und zu kämpfen, um den Zweck von ihnen zu verstehen. Ich habe versucht, sie zu recherchieren, aber alle Ressourcen, die ich gefunden habe, scheinen auf akademische und nicht auf professionelle Weise über sie zu sprechen.

Was ist ihr Zweck und sind sie wichtig zu lernen?

Roy James Schumacher
quelle
7
Sie sind gut zu wissen für Vorstellungsgespräche!
Mittwoch,
5
Ein Entwurfsmuster ist nur eine benannte, häufig wiederkehrende Methode zum Lösen von Problemen. In der Regel entstehen sie durch Sprachmängel.
Jon Purdy
7
Um den Zweck von Entwurfsmustern zu verstehen, müssen Sie die Probleme verstehen, die sie lösen. Um diese Probleme zu verstehen, ist Erfahrung auf die harte
Tour

Antworten:

36

Entwurfsmuster eignen sich hervorragend, um Ihre Absicht sehr schnell mitzuteilen - jeder weiß, was eine Fabrik ist.

Was wirklich, wirklich, wirklich schlecht ist, ist zu versuchen, Ihren Code an Muster anzupassen oder Verantwortlichkeiten nach Mustern zu trennen, oder so ähnlich. Es ist eine Sache zu sagen "Dieses Objekt ist eine Fabrik" und eine andere zu sagen "Dieses Objekt sollte ausschließlich eine Fabrik sein".

DeadMG
quelle
1
Sie sind alle für Muster, aber sie sind nicht wirklich für Ihren Code. Ja, sie sind gut, um Ideen zu kommunizieren, aber sie sind noch besser, wenn Sie das Muster im tatsächlichen Code sehen können.
Newtopian
3
Warum herabstimmen? Dies ist eigentlich die beste Antwort, IMHO. Das Codieren ist ein gesunder Menschenverstand, und manchmal können Sie schnell Muster verwenden, die gut zur Lösung des Problems passen. Aber sobald die Leute anfangen, sie überall zu missbrauchen, wird es zu einer Hölle voller Unordnung.
Coder
1
Jeder Code enthält ein Muster, auch wenn Sie es nicht kennen. Die Entwurfsmuster, von denen Sie sprechen, gruppieren sich nur neu und benennen eine Reihe häufig verwendeter und nützlicher Muster. Wenn Sie sie kennen, können Sie bewusster über sie nachdenken. Wenn Sie eine Ihrer Klassen "ControlDispenser" nennen, weiß wahrscheinlich niemand, was sie tun soll. Wenn Sie jedoch das Factory-Muster kennen, nennen Sie es "ControlFactory", und andere werden es sofort verstehen.
Olivier Jacot-Descombes
4
Wenn es einem anderen Zweck dient, sollte es eine andere Klasse sein ... Trennung von Bedenken.
Nate
2
@Nate: Ein Zweck kann mehrere Muster sein. Es gibt keinen Grund, dass eine Klasse nur ein Muster beinhalten sollte. Muster sind keine "atomaren" Verantwortlichkeiten. Eine einzelne Verantwortung kann mehrere Muster erfordern.
DeadMG
26

Aus dem Wikipedia-Artikel über Entwurfsmuster :

Es ist nützlich, von Mustern zu sprechen, um eine gemeinsame Terminologie für die Diskussion der Situationen zu haben, die Designer bereits immer wieder sehen.

Wir hatten lange Zeit ein ernstes Problem in der Softwareentwicklung: Sie stellen einen Neuling in ein Projekt ein, und egal, wie gut er die Programmiersprache beherrscht, es dauert Monate, bis er über die Abläufe in Ihrem Projekt auf dem Laufenden ist Projekt, bevor sie produktiv sein können. In der Hardware-Entwicklung haben sie dieses Problem vor langer Zeit gelöst: Sie haben eine gemeinsame Terminologie namens "schematische Diagramme". Sie beauftragen einen Hardwaretechniker, geben ihm morgens die Pläne Ihres Hardwareprojekts, lassen es studieren und am Abend, bevor es an der Zeit ist, können sie die Lötpistole in die Hand nehmen und produktiv werden. Wir haben versucht, Wege zu finden, um dies zu verbessern. Standardisierung von Programmiersprachen war eine Möglichkeit; Standardbibliotheken (heutzutage Klassenbibliotheken) waren ein anderer Weg; Aber einer der wichtigsten Wege waren vielleicht Entwurfsmuster. Sind sie also wichtig? Wetten Sie?

Mike Nakis
quelle
3
Der Vergleich von Softwareentwicklung und Elektrotechnik ist ungefähr so ​​genau wie der Vergleich einer Saturnrakete mit einem Fahrrad. Beide Transportmethoden (von Punkt A nach Punkt B) gehen dabei aber ganz andere und nicht kompatible Wege.
jer
3
@jer Hmmm, deine Analogie ist schlecht. Beide sind Ingenieurdisziplinen. Selbst wenn ihre Ähnlichkeiten dort enden würden, hätten sie per Definition noch sehr viel gemeinsam. Wir hoffen nicht, sie jemals gleichzusetzen, aber einer kann viel vom anderen lernen.
Mike Nakis
6
@ Mike: Es gibt einen grundlegenden Unterschied: Elektrische Schaltkreise sind durch harte physikalische Grenzen begrenzt. Softwaresysteme sind durch die verschwommenen Grenzen des menschlichen Intellekts eingeschränkt.
Kevin Cline
3
Zunächst habe ich nicht gesagt, dass es keine großen Unterschiede gibt. Zweitens ist Ihre Aussage auch nicht korrekt. Software unterliegt harten Einschränkungen, die durch die Syntax einer Sprache vorgegeben sind. Die Anzahl der Permutationen, mit denen der menschliche Intellekt elektronische Komponenten miteinander verbinden kann, ist ebenfalls unbegrenzt. Aber auch hier versuche ich nicht, die beiden gleichzusetzen oder gar zu sagen, dass es sehr viel Ähnlichkeit gibt. Ich sage nur, dass man viel vom anderen lernen muss .
Mike Nakis
3
Da es bei Software um Design geht, wäre eine ähnliche elektrotechnische Analogie die Diskussion von "Stromspiegel" und "Gegenkopplung" in einer Verstärkerschaltung. Hierbei handelt es sich nicht um einzelne Komponenten in einem Schaltplan, sondern um eine Anordnung mehrerer Komponenten, die einen bestimmten Zweck erfüllt. Wenn Sie nicht wissen, wie die Komponenten zu verbinden sind, ohne deren Zweck zu kennen, kann eine neue Person kein neues Design erstellen. (dh es ist ein Schritt vorwärts im Verständnis.)
Rwong
9

Es gibt zwei wesentliche Gründe für die Existenz von Mustern.

Das erste wurde bereits ziemlich gut erklärt: Die Verwendung von Mustern fördert die Kommunikation zwischen Entwicklern. Wenn Sie und ich verstehen, dass ich mit 'Observer' von einer sehr spezifischen Codestruktur spreche, kann ich sehr schnell beschreiben, wie ein Teil des Codes, der dieses Muster verwendet, funktioniert. Die Alternative besteht darin, die zeitaufwändige und fehleranfällige Lösung vollständig zu beschreiben. ("Nun, ich habe diese reine virtuelle Klasse erstellt, die Konsumentenobjekte beschreibt und Schnittstellen für sie bereitstellt, und dann habe ich eine Klasse erstellt, die eine Liste der aktiven Konsumenten verwaltet, die ...")

Der zweite Vorteil von Mustern ist, dass es sich um Standard-Lösungsformen für gängige Problemformen handelt. Wenn Sie Ihre Muster kennen und beispielsweise auf ein Problem stoßen, bei dem Sie einen guten Weg finden müssen, um Informationen von (möglicherweise mehreren) Erzeugerobjekten zu mehreren Verbraucherobjekten zu erhalten, ohne unnötige Kopplung zwischen Klassen einzuführen, werden Sie dies erkennen ist ein Job für einen Beobachter! " und Sie werden sofort wissen, wie Sie Ihr Problem lösen können.

Diese Vorteile verstärken sich auch gegenseitig. Sie ermöglichen es Ihnen, bestimmte gängige Problemklassen schnell zu lösen, und wenn Sie fertig sind, können Sie sehr schnell kommunizieren, wie Sie das Problem gelöst haben.

Vergleichen Sie dies mit einer Welt, in der Muster "nicht existieren". Sie stoßen auf eine dieser Problemklassen, die im Allgemeinen keine trivialen Designprobleme sind, und Sie verbringen eine ganze Weile damit, eine gute Lösung zu finden (die im Übrigen sehr wahrscheinlich dem entsprechenden Muster ähnelt). Dann kommt Ihr Mitarbeiter und möchte wissen, wie Sie es gelöst haben, und Sie verbringen eine Stunde damit, das Wie und Warum zu besprechen.

Dies alles ist mit einer Einschränkung verbunden, die ziemlich offensichtlich erscheinen sollte: Versuchen Sie nicht, Probleme in Muster zu zwingen, die nicht passen. Wenn das Muster nicht zum Problem passt, wird die Lösung verwickelt und Sie verlieren den Vorteil der Aufwandsreduzierung von Mustern. Da Ihre Arbeit nicht mehr mit dem Verständnis Ihrer Mitarbeiter für die Bedeutung des Musters übereinstimmt, verlieren Sie außerdem die Kosten für den Kommunikationsnutzen. In der Tat werden Sie wahrscheinlich die Kommunikationskosten über die No-Pattern-Kosten hinaus erhöhen, da der Missbrauch des Musters Ihren Mitarbeitern ein falsches Verständnis der Lösung vermittelt, was schlimmer ist als gar kein Verständnis.

ipeet
quelle
2
Es ist ein Irrtum, dass Designmuster eine Standardlösung sind. Es sind "MUSTER", die nicht immer in Code übersetzt werden.
Martin York
Ähm, ein Muster wird immer in Code übersetzt, das ist so ziemlich selbstverständlich - ein Problem ist, dass sie möglicherweise nicht immer in den Code passen, den Sie haben, die Architektur, die Sie haben oder die Einschränkungen, unter denen Sie arbeiten. Das heißt, nur weil ein Muster passt, heißt das nicht, dass Sie es verwenden können. Man könnte annehmen, dass Sie das gemeint haben (aber ich mag es nicht, Annahmen zu machen).
Murph
5

Bei Mustern geht es um die Wiederverwendung von Ideen und Konzepten und um die Schaffung einer gemeinsamen / konsistenten Plattform für die Kommunikation derselben.

Wir sind uns alle einig (!), Dass die Wiederverwendung von Code in der Theorie eine gute Sache ist - aber es stellt sich als schwieriger heraus, als wir es in der Praxis gerne tun würden (in mancher Hinsicht ändert sich dies, aber es wird immer eine Herausforderung sein ). In Wirklichkeit wollen wir jedoch vieles wiederverwenden, indem wir eine Art Vorlage verwenden, um eine Lösung für ein bestimmtes Problem zu finden - das sind Muster. Sie kommen also zu einem Fall, in dem Sie sagen, dass ein guter Ansatz zur Lösung von Problem X darin besteht, Muster Y zu verwenden, und wir wissen, dass die Elemente von Muster Y a, b und c sind, und los geht's. Da die Muster weitgehend verstanden werden, müssen Sie nicht detailliert erläutern, welche Vorteile die Kommunikation hat.

Das Unterhaltsame an Mustern ist, dass sich Sprachen und Frameworks weiterentwickeln, um gängige Muster besser zu unterstützen, mit dem Nettoeffekt, dass wir mehr und mehr Code wiederverwenden (mehr und bessere Legobausteine!), Weil wir Anwendungen erstellen (indem wir Muster implementieren) ) erleichtert die Wiederverwendung.

Murph
quelle
4

Entwurfsmuster sind nur bekannte Bausteine, auf denen jede Softwarelösung aufbaut. Sie sind aus folgenden Gründen wichtig:

  1. Sie sind sprachunabhängig. Sobald Sie wissen, welches Entwurfsmuster für ein gegebenes Problem / eine gegebene Architektur / Aufgabe geeignet ist, können Sie es in einer beliebigen Multi-Paradigmen-Sprache implementieren - sei es C #, Java oder Python - die Lösung ist in den meisten Fällen dieselbe, die Sie gerade haben um die Syntax anzupassen. Dies bedeutet, dass Sie Ihre Erfahrungen aus dem Programmieren in einer Sprache auf andere Sprachen übertragen können, solange Sie innerhalb derselben Problemdomäne (und möglicherweise sogar domänenübergreifend) bleiben.

  2. Trotz der Tatsache, dass Entwurfsmuster tatsächlich an das Programmierparadigma gebunden sind , bedeutet dies, dass Entwurfsmuster für die objektorientierte Programmierung (die bekanntesten, auch als "Gang of Four" -Muster bezeichnet ). Mithilfe von Mustern können Sie verstehen, wofür das Paradigma am besten geeignet ist, und über die reine Syntax hinausgehen.Ich habe zum Beispiel viele Implementierungen in C # und Java gesehen, bei denen die Leute einfach so programmiert haben, wie sie es in Basic oder Fortran getan haben - sie haben einen perfekten, zwingenden Verstand, um Probleme zu lösen, und sie verwenden OOP nur, um diese Lösung zu rendern - keine Vererbung , kein Polymorphismus, alle Methoden sind öffentlich usw. Designmuster helfen Ihnen, hinter diese Konzepte zu schauen und zu sehen, wie sie im wirklichen Leben funktionieren. Gleiches gilt für Designmuster in anderen Paradigmen wie der funktionalen Programmierung.

  3. Muster sind im Allgemeinen eine praktische Möglichkeit, Ideen darzustellen, und kamen aus der Architektur in die Informatik. Sobald Sie die Idee hinter einem bestimmten "Muster" verstanden haben, können Sie dieses Muster in einem anderen Problem leicht erkennen und mithilfe dieses Musters lösen (wahrscheinlich leicht modifiziert, um Ihr Problem besser anzugehen). Es gibt unzählige verschiedene Muster: bei der Integration von Unternehmenssoftware , beim Testen von Quellcode usw. Suchen Sie in Büchern für Informatik nach Mustern.

  4. Neben dem Erlernen bewährter Methoden durch Lernen von Mustern können Sie leicht lernen, wie Sie dumme Fehler in Ihrem Code vermeiden, indem Sie Anti-Muster studieren . Es gibt viele Bücher mit allgemeinen Fehlern in verschiedenen Bereichen in Form von Anti-Mustern, die sehr unterhaltsam und gleichzeitig lehrreich sind. Ich liebe die Namen dieser Anti-Patterns übrigens!

Alexander Galkin
quelle
2

Sie können sich ein Muster als einen bewährten Weg vorstellen, um ein Problem zu lösen, das Sie und andere Entwickler verstehen. Beispielsweise besteht das Problem darin, eine sortierte Liste von Daten zu erstellen. Anschließend können Sie eine verknüpfte Liste verwenden oder Daten in einen Vektor einfügen und sortieren. Wahrscheinlich verstehen Sie diese beiden Optionen, da Sie das Muster der verknüpften Liste oder das Muster des Lade- und Sortiervektors möglicherweise bereits kennen. Möglicherweise kennen Sie die Vor- und Nachteile der einzelnen Komponenten und müssen die Implementierung nicht sehen, um zu verstehen, was vor sich geht.

Adam f
quelle
1

Ich denke, Sie sind ein Anfänger in der Programmierung. Ich schlage nicht vor, dass Sie das Designmuster früh erlernen. Das Erlernen und Verstehen von Entwurfsmustern muss auf den Erfahrungen der Softwareentwicklung basieren. Sie sollten mehr Übung darin haben, Code zu schreiben und herauszufinden, welcher Codestil schlecht ist, und dann Designmuster lernen, um das Design zu verbessern.

Mark xie
quelle
1

Die Nützlichkeit eines Entwurfsmusters hängt von der ausgewählten Sprache ab. Je mächtiger die von Ihnen gewählte Sprache ist, desto weniger müssen Sie Designmuster verstehen und implementieren. Ein Entwurfsmuster kann ein Signal sein , das Ihre Sprache saugt eine integrierte Funktion fehlt.

Joe Gregorio hielt einen großartigen Vortrag über das Fehlen von Designmustern in Python

Cesar Canassa
quelle
Vielen Dank für den Link zum Fehlen von Designmustern in Python. Edit: Ups !! Das Video wurde von diesem Ort entfernt !! :(
Saurabh Patil
0

Entwurfsmuster sind Lösungen für häufig auftretende Probleme bei der Softwareentwicklung. Für einige Probleme gibt es immer mehr als eine Lösung, und Entwurfsmuster helfen Ihnen bei der Entscheidung, welche Lösung die beste ist, indem sie Ihnen eine Reihe guter Lösungen für diese allgemeinen Probleme bieten.

Mansuro
quelle