Da Javascript in den nächsten Jahren die allgegenwärtige Programmiersprache des Webs zu sein scheint, tauchen alle fünf Minuten neue Frameworks auf und ereignisgesteuerte Programmierung übernimmt sowohl auf Server- als auch auf Client-Seite die Führung:
Halten Sie als Javascript-Entwickler die traditionellen Entwurfsmuster für wichtig oder weniger wichtig als in anderen Sprachen / Umgebungen?
Nennen Sie bitte die drei wichtigsten Entwurfsmuster, die Sie als Javascript-Entwickler regelmäßig verwenden, und geben Sie ein Beispiel dafür, wie sie bei Ihrer Javascript-Entwicklung geholfen haben.
Antworten:
Klassische Designmuster gelten nicht für JavaScript.
Was gilt, ist das Schreiben von modularem und funktionalem Code.
Sie sollten eine Mischung aus Konstruktoren und erstklassigen Funktionen verwenden.
Als JavaScript-Entwickler bin ich persönlich bestrebt, JavaScript als LISP und nicht als Java zu behandeln. Versuchen Sie also, Monaden und funktionalen Style-Code auf hoher Ebene zu emulieren, anstatt klassischen OOP-Code zu emulieren.
Auch hier treffen Designmuster nicht wirklich zu, aber im Folgenden sind drei wichtige Konstrukte aufgeführt.
new
Bitte hinterlassen Sie einen Kontext, für den ich Beispiele für diese Art von Techniken zeigen kann, verglichen mit der gleichen Art von Code unter Verwendung traditioneller Entwurfsmuster.
Werfen wir einen Blick auf einige der klassischen Design Patterns und wie sie in js implementiert werden können, sowie auf alternative Patterns, die besser zu js passen:
Beobachter-Muster:
Darin
node.js
liegt einfachevents.EventEmitter
. InjQuery
diesem ist$.fn.bind
&&$.fn.trigger
. Inbackbone
diesem istBackbone.Events.trigger
undBackbone.Events.bind
. Dies ist ein sehr verbreitetes Muster, das im täglichen Code verwendet wird.Ich höre nie auf und denke "Hey, ich benutze hier ein Beobachtermuster!". Nein, dies ist nur eine einfache Methode zum Weitergeben von Nachrichten oder zum Kaskadieren von Änderungen.
Beispielsweise werden im Backbone alle MVC-Ansichten an
onchange
das Modellereignis gebunden, sodass das Ändern des Modells alle Änderungen automatisch in die Ansicht überträgt. Ja, dies ist ein leistungsfähiges Muster, aber seine Verwendung ist bei ereignisgesteuerter Programmierung so verbreitet, dass nicht erkannt wurde, dass es überall verwendet wird.Im
WebSocket
Protokoll haben wir,.on
was wir verwenden, umon("message", ...
Ereignisse zu binden . Auch dies ist sehr verbreitet, aber es ist eher ein Beobachter auf einem Stream als ein klassischer OOP-basierterwhile (byte b = Stream.ReadNextByte())
.Dies sind alles mächtige Verwendungen des Observer-Musters. Dies ist jedoch kein von Ihnen verwendetes Muster. Dies ist ein einfacher Teil der Sprache. Dies ist nur Code.
Erinnerungsmuster:
Das ist einfach JSON. Sie können den Status eines Objekts serialisieren, um eine Aktion rückgängig zu machen.
In JavaScript unterstützen wir nativ eine API für Erinnerungsstücke. Definieren Sie einfach eine Methode, die
toJSON
für ein beliebiges Objekt aufgerufen wird. Wenn Sie aufrufenJSON.stringify
, wird.toJSON
Ihr Objekt intern aufgerufen , um die tatsächlichen Daten abzurufen, die Sie in JSON serialisieren möchten.Auf diese Weise können Sie ganz einfach Momentaufnahmen Ihres Codes machen.
Wieder merke ich nicht, dass dies ein Erinnerungsmuster ist. Dies geschieht einfach mit dem Serialisierungstool JSON.
Zustandsmuster / Strategiemuster:
Sie brauchen kein Zustandsmuster. Sie haben erstklassige Funktionen und dynamische Typen. Spritzen Sie einfach Funktionen ein oder ändern Sie die Eigenschaften im Handumdrehen.
quelle
Nehmen Sie diese Antwort als subjektive Meinung.
Wenn Sie traditionelle Entwurfsmuster wie Gang of Four meinen , dann sind die meisten Techniken sprach- / plattformunabhängig wie "Programmieren an eine Schnittstelle, keine Implementierung" oder "Bevorzugen der Objektkomposition gegenüber der Klassenvererbung" und sind auch für JavaScript-Entwickler von Bedeutung.
Spezifischere Muster wie kreativ, strukturell und verhaltensbezogen können oder müssen nicht auf die gleiche Weise oder so häufig wie in anderen Sprachen verwendet werden, da Sprachmerkmale ihre Verwendung in hohem Maße beeinflussen können. Einige Sprachen (einschließlich JavaScript) haben daher ihre eigenen Entwurfsmuster, die auf der Funktionalität oder dem von ihnen angebotenen syntaktischen Zucker basieren.
Im Allgemeinen würde ich sagen, dass traditionelle Entwurfsmuster genauso wichtig sind wie in anderen Sprachen, aber JavaScript-spezifische Muster sind wichtiger als herkömmliche.
Unter den wesentlichen JavaScript-Entwurfsmustern verwende ich hauptsächlich folgende:
1. Konstruktormuster (mit Prototypen)
Besonders auf der Serverseite beim Schreiben von node.js-Inhalten, da es sich gut zum Schreiben von Modulen eignet, obwohl es keine native Kapselung gibt. Es ist auch bei vielen anderen Entwicklern beliebt, wenn Sie in GitHub in Repositorys stöbern, sodass Sie durch die Kenntnis dieses Musters andere Codes besser verstehen können.
2. Aufdecken des Modulmusters
Bietet Modularität mit Kapselung.
3. TROCKENMUSTER
Dies ist eher szenariospezifisch, obwohl jeder Entwickler es so oft wie möglich verwenden sollte.
quelle
Entwurfsmuster werden in Entwurfsklassen für CS unterrichtet. Sie sind nicht wesentlich, aber sehr hilfreich, wenn Sie analoge Situationen finden, um eine durchdachte Lösung zu finden.
Es ermöglicht Programmierern auch eine einfachere Kommunikation. Sie können auch mit Ihrem Kollegen in Bezug auf die Muster sprechen. Wenn Sie hier sagen, ich habe meinen Beobachter, dann ist es ziemlich gut verstanden, was los ist.
Die Leute werden natürlich Lösungen finden, die von sich aus in ein Entwurfsmuster passen, aber die Entwurfsmuster helfen dabei, Terminologie und Standardideen zu definieren, die hilfreich sein können.
An den Mustern ist nichts besonders Bemerkenswertes. Das Schönste ist, dass es sich um Ideen handelt, die kanonisiert und so definiert werden, dass sie immer wieder nützlich sind.
quelle
Sie sind lebenswichtig.
Dies liegt daran, dass Konzepte für wiederverwendbare Lösungen die Sprache überschreiten können. - Änderungen an der Syntax - Änderungen an der Implementierung - Der Begriff für das Muster ist noch vorhanden.
Entwickler aus jeder Sprache können JS für Fortgeschrittene anhand von Lernmustern lernen, nicht anhand der Syntax. Wer das nicht weiß, verpasst es.
Es gibt Muster, die häufig verwendet werden, gegen die einige "argumentieren" würden. Sie sind jedoch gut zu wissen, da sie in fortgeschrittenem JS extrem verbreitet und mächtig sind.
1- Namespace - Hüllen Sie Ihren Code in ein Objekt.
var x = (function () {}) ();
2- ObjectConfiguration, Factory-ähnliches Muster. -Leiten Sie ein Objekt an eine Funktion weiter, nicht an eine Reihe von Variablen.
var product = factory ({});
3- Rückruffunktion. - Übergeben Sie eine Funktion als Parameter, die aufgerufen werden soll, wenn die Aufgabe abgeschlossen ist.
function longTask (function () {// ruf mich an, wenn du fertig bist});
Wie ich bereits sagte, mögen einige argumentieren, dass dies keine Muster sind, aber sie sind sehr häufig und sehr mächtig und sollten erwähnt werden, weil sie in der Tat sehr nützliche, wiederverwendbare Lösungen für häufige Probleme sind. Welches ist die Definition von Design Pattern.
Hervorragende Frage.
Hoffentlich hilft das.
quelle