Ich kann Programmiermuster nicht verstehen

16

Ich arbeite seit 4 Jahren mit Javascript. Ich bin sehr zuversichtlich, was meine Problemlösungsfähigkeiten angeht, und ich kann feststellen, dass sich meine Codequalität verbessert. Ich versuche mit der Community auf dem Laufenden zu bleiben und arbeite derzeit mit ES2015 und React.js. Ich habe jedoch das Gefühl, dass ich Programmiermuster überhaupt nicht verstehen kann. Ich weiß, wo ich Ressourcen dazu finden kann, und ich habe bereits Bücher darüber gelesen. Ich verlasse mich auf meine älteren Kollegen, um Entscheidungen über die Projektstruktur zu treffen, aber ich habe kein Problem damit, daran zu arbeiten.

Wann immer ich etwas alleine anfangen muss, suche ich nach diesen zwei Wegen: Wenn ich eine große Bibliothek / ein Framework wie React.js verwende, neige ich dazu, zu kopieren, was die Community tut; Wenn ich auf etwas kleinerem bin, verwende ich das Modulmuster. Ich weiß, dass ich, sobald ich dieses Thema besser verstanden habe, bessere Entscheidungen treffen kann, aber im Moment bin ich völlig verloren.

Soll ich mich in diesem Bereich weiterbilden? Benötige ich einen Mentor zu diesem Thema? Bin ich nur dumm? Ist das wirklich so schwer zu verstehen?

Abensur
quelle
6
Meiner Meinung nach sind einige Sprachen „verzeihender“ als andere, wenn es um die Notwendigkeit geht, Entwurfsmuster zu verwenden. Stark typisierte kompilierte Sprachen (wie Java und C #) sind stärker von schlechtem Design betroffen als schwach typisierte Skriptsprachen wie JavaScript und PHP. Designmuster sind natürlich nicht für beide von Nutzen.
Matthew
3
Auch die Projektgröße spielt eine wichtige Rolle.
Matthew
2
@ Matthew Nitpick Ich würde nicht unbedingt Java / C # stark getippt aufrufen ...
Jared Smith
2
@JaredSmith stimmt, ich vergesse oft die Unterscheidung zwischen stark getippt und statisch getippt.
Matthew
6
Wenn Sie generell versuchen, Muster zu untergraben, klicken Sie auf Stop! Da ist nichts! Ein Muster ist eine beliebte Lösung für ein häufig auftretendes Problem, und jemand hat ihm einen Namen gegeben. Das ist alles dazu. Möglicherweise fällt es Ihnen schwer, ein bestimmtes Muster zu verstehen. Ich selbst habe Mühe, mich daran zu erinnern, wie man das "Besuchermuster" effektiv einsetzt, um den doppelten Versand in Java nachzuahmen. Sagen Sie "Datenübertragungsobjekt", Sie werden es nicht finden. Sie sind nur zwei beliebte Lösungen für zwei häufige Probleme, jemand hat ihnen Namen gegeben, und die Namen stecken fest.
Solomon Slow

Antworten:

34

Software Design Patterns sind bekannte Lösungen für bekannte Probleme. Sie verstehen sie, indem Sie die Muster lernen, verstehen, wie sie funktionieren, und wissen, wann es angebracht ist, jedes auf Ihr Software-Design anzuwenden.

Die Art und Weise, wie Sie Software-Design-Muster lernen, besteht darin, sie einzeln zu studieren. Es ist ein kontinuierlicher Bildungsprozess. Wenn Sie den Lernfussabdruck verringern möchten, untersuchen Sie die Muster, die sich direkt auf die derzeit verwendeten Technologien beziehen.

Einige wichtige Informationen zu Entwurfsmustern:

  1. Einige Designmuster sind architektonischer Natur. MVC und MVVM sind Beispiele für solche Muster. Sie verwenden solche Muster, wenn Sie die organisatorischen und strukturellen Vorteile benötigen, die sie bieten.

  2. Einige Entwurfsmuster sind Problemumgehungen für Mängel in Programmiersprachen. Sie brauchen diese Muster nicht, wenn Sie eine ausdrucksstärkere Programmiersprache verwenden, aber oft müssen Sie diese Wahl nicht treffen. Eine Mehrheit der GoF - Muster sind in dieser Kategorie .

  3. Verwenden Sie ein Softwaremuster nur, wenn Sie versuchen , das Problem zu lösen, für das das Muster speziell entwickelt wurde. Wenn Sie eine Anwendung schreiben, indem Sie Softwaremuster zusammenfügen, machen Sie es falsch.

  4. Es gibt nicht für jedes vorhandene Computerproblem ein vorhandenes Softwaremuster. Wäre dies der Fall, wäre die Programmierung lediglich eine Übung zur Mustererkennung.

  5. Einige Muster sind eigentlich Anti-Muster. Die zusätzliche Komplexität, die diese Muster mit sich bringen, überwiegt die Vorteile, die sie bieten. Sie müssen Muster für Muster selbst entscheiden, welches dieser Muster Sie vermeiden möchten.

Robert Harvey
quelle
Gute Antwort, obwohl ich der Aussage nicht zustimmen würde, dass die meisten GoF-Muster eine Problemumgehung für Mängel in Programmiersprachen darstellen. Oft sind einige Muster besser auf bestimmte Sprachen anwendbar, ja, da Sprachen dazu neigen, mit Blick auf bestimmte Probleme und Lösungen entworfen zu werden.
Polygnome
1
Die Gof-Muster sind 20 Jahre alt. Die meisten von ihnen wurden erstellt, um Probleme mit C ++ zu beheben, die Java geerbt hat, weil Java auf C ++ basiert.
Robert Harvey
Das Paradoxon in dieser Antwort ist das "bekannte Problem". Es ist schwer, diese "bekannten Probleme" zu verstehen, wenn Sie sie noch nie erlebt haben.
Fuhrmanator
2
Java basiert nicht auf C ++. Die Java- Syntax ist von C ++ inspiriert , basiert aber sicherlich nicht darauf. Beide Sprachen arbeiten ziemlich unterschiedlich. Von der Tatsache, dass Java Hardware abstact, verwaltet Speicher von selbst, über keine Vorlagen, sondern Generika usw.
Polygnome
4

Jeder lernt ein bisschen anders, und ich habe keine Ahnung, wie Sie allgemein vorgehen, aber ich glaube, Sie tun sich selbst einen schlechten Dienst, indem Sie sich als "dumm" bezeichnen.

Persönlich haben aus meinen Beobachtungen, die viele als "erfolgreiche" Software-Ingenieure, Designer usw. bezeichnen, alle ein gemeinsames Thema für ihr Lernen: "Erfahrung". Ich glaube, dies ist Ihre "überlegene Ausbildung" und Sie werden schneller daraus lernen, als Tonnen von Büchern bei Amazon zu kaufen und sie durchzulesen (eine schlechte Angewohnheit von mir).

Nehmen Sie zum Beispiel ein GOF-Muster wie das Befehlsmuster und implementieren Sie es in der von Ihnen gewählten Sprache. Verstehen Sie, welche Vorteile es Ihnen und den Nachteilen gibt. Die verschiedenen Bücher über Entwurfsmuster werden Ihnen dies erklären, aber ich halte es für besser, dieses Wissen praktisch anzuwenden und daraus zu lernen. Lassen Sie sich keine Lektüre vorenthalten, sie haben einen Zweck, aber die Welt der IT ist kaum eine Lehrbuchübung. Davon abgesehen ist dies meine Meinung und Sichtweise der IT-Welt und stellt zum Teil eigene Probleme dar, als ich meine Karriere im Bereich Software Engineering begann. Ein großes Problem, das ich auch bei sehr erfahrenen Software-Entwicklern sehe, ist die Ungeduld und das Vergessen, Spaß an dem zu haben, was sie tun. Nehmen Sie sich also Zeit für das, was Sie gelernt haben, und denken Sie daran, Spaß daran zu haben, was Sie tun. Warum sollten Sie sich sonst die Mühe machen, Zeit dafür zu investieren?

Nutzen Sie außerdem die praktischen Erfahrungen anderer. Es gibt eine Vielzahl von guten und schlechten Open Source-Lösungen, von denen Sie lernen können. Sehen Sie sich an, wie sie Muster angewendet haben, und überlegen Sie, wie Sie es anders angehen würden.

Mein allgemeiner Rat lautet also: Wenn Sie der Meinung sind, dass Ihr Ansatz falsch ist, ändern Sie ihn. Schauen Sie sich die Menschen in Ihrer Umgebung an, die das Material lernen, das Sie nicht verstehen, und schauen Sie sich an, was sie tun, oder fragen Sie sie sogar.

Trostloser Planet
quelle
1
Ich denke wirklich, dass das Programmieren wie ein Schachspiel ist. Sie haben vielleicht ein einheimisches Talent, vielleicht spielen Sie es den ganzen Tag, aber wenn Sie nicht einige Bücher über Schach lesen, können Sie keine Fortschritte machen und noch wichtiger, Sie können die Schönheit des Spiels nicht schätzen.
Adrian Iftode
@AdrianIftode - vereinbart. Wie bereits erwähnt, würde ich keine Bücher, Blogs oder Lesematerialien rabattieren, aber es ist ein häufiges Problem, das ich bei Leuten festgestellt habe, die sich um die Beherrschung einer Programmiersprache / Plattform / eines Frameworks usw. bemühen, und anscheinend haben sie wenig programmiert und / oder praktisch gearbeitet Mühe, aber habe jedes Buch gelesen, an dem du einen Stab schütteln kannst.
Desolate Planet
@ AdrianIftode Nun, nicht genau. Wenn Sie Schach spielen, ohne Bücher zu lesen, können Sie noch viel über das Spiel lernen. Der einzige Unterschied ist, dass Sie nicht so schnell lernen, wie Sie könnten, indem Sie auf Erfahrungen und Gedanken einiger Schachmeister zurückgreifen. Wenn Sie sich andererseits über bestimmte Dinge Gedanken machen, können Sie über eine oder zwei Lösungen stolpern, die von den Leuten, die nur von den Schachmeistern lernen und die Sie möglicherweise zu Ihrem Vorteil nutzen, völlig übersehen wurden. Letztendlich glaube ich, dass eine Mischung aus beiden Arten des Lernens den besten Nutzen bringt. Sowohl beim Schach als auch beim Programmieren.
cmaster
1

Die kurze Antwort ist, dass Sie sie nicht brauchen . Sie können Code ohne sie schreiben. Wie Matthew in den Kommentaren sagte, gilt dies insbesondere für JavaScript, wo die Sprache sehr flexibel ist und Projekte in der Regel kleiner sind. Aber wenn Sie seit 4 Jahren programmieren, fällt es mir schwer zu glauben, dass Sie nicht über Dinge gestolpert sind, die sich wiederholt oder unangenehm anfühlen. Es sind jene Bereiche, die Sie entweder neu entdecken oder denen Entwurfsmuster fehlen.

Beispiel: Das Ereignissystem von JavaScript ist für die jeweilige Aufgabe häufig nicht ausreichend. Finden sich Sie nicht immer kombinieren oder zu transformieren zu können , wollen Ströme der Ereignisse? Oder waren diese Veranstaltungsreihen selbst erstklassige Werte? Sie benötigen die Muster Mediator und / oder Observer. Benötigen Sie eine bidirektionale Datenbindung? Die gleiche Geschichte.

Spröde Prototyphierarchie kaputt? Mixin / Trait / Subclass Factory Patterns zur Rettung.

Jared Smith
quelle
4
Es ist praktisch unmöglich, ein nicht-triviales Programm zu schreiben, ohne Designmuster zu verwenden. In der Regel werden Sie auch viele gängige verwenden. Was Sie nicht benötigen, ist die Möglichkeit, die von Ihnen verwendeten Muster anhand des Namens zu erkennen. Sie können Arbeitscode schreiben, auch wenn Sie nicht alle im Code verwendeten Entwurfsmuster benennen können.
Servy
@Servy Design Patterns sind Abstraktionen, Abstraktionen sind nicht unbedingt erforderlich. Sie können jederzeit eine einmalige Ad-hoc-Implementierung des zugrunde liegenden Verhaltens ausschreiben ... immer und immer wieder. Zum Beispiel in dem Beispiel, das ich über Ereignisse gegeben habe, ist es möglich , alle betroffenen Parteien manuell zu verbinden und sie dann jedes Mal zu ändern, wenn sich die Anforderungen ändern. Für Unterklassen ist es möglich (wenn es verschwenderisch ist), jede Möglichkeit mit einer Reihe von einmaligen Klassen manuell zu codieren, es ist einfach nicht so gut.
Jared Smith
1
Entwurfsmuster können sehr breit werden. Oft sind breitere Entwurfsmuster so offensichtlich, dass wir sie nicht einmal als Entwurfsmuster betrachten (insbesondere wenn sie eine spezielle Sprachunterstützung haben). Eine Schleife ist ein Entwurfsmuster. Funktionen sind ein Entwurfsmuster. Objekte sind ein Entwurfsmuster.
Servy
@Servy, wenn du den Begriff so verwendest, dann bin ich nicht anderer Meinung, aber ich habe den Eindruck, dass das OP speziell GOFish-Muster meinte.
Jared Smith
1
@JaredSmith Designmuster sind keine Abstraktionen. Selbst wenn Sie sie für das konkrete Problem, das Sie haben, immer wieder implementieren, sind sie immer noch Muster . Sie müssen keine generische Observer- Klasse schreiben und diese verwenden, um das Observer- Muster zu verwenden. Das Schreiben konkreter Beobachter und konkreter Methoden, um sie zu registrieren und zu benachrichtigen, verwendet weiterhin das Muster. Das Schwierige ist, das Muster zu erkennen. Manchmal benutzt man ein Muster, ohne seinen Namen zu kennen,
Polygnome
1

Finden Sie einen Mentor, von dem Sie lernen können. Stellen Sie ihm die Frage, beobachten Sie seinen Code, senden Sie eine Codeüberprüfung und versuchen Sie, mit ihm zusammenzuarbeiten. Dies ist der beste Weg, um Ihre Codierungsfähigkeiten zu verbessern.

extra:

  • Arbeiten Sie an einem einfachen OSS-Projekt zusammen, das Ihnen gefällt

  • Wenn es zwei Möglichkeiten gibt, das gleiche Problem zu lösen, wählen Sie immer die einfachere

  • Bauen Sie einige zusätzliche Erfahrungen mit Nebenprojekten auf, bei denen Sie alle Arten von seltsamen Fehlern ausführen können, und lernen Sie das Entwurfsmuster "auf die harte Tour" (tm).

Motocarota
quelle