Die Bedeutung von Entwurfsmustern mit Javascript, NodeJs et al


36

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.


5
Einige Leute argumentieren, dass Designmuster (insbesondere die GoF-Muster) Anzeichen für Sprachmängel sind (siehe diese Diskussion ). Da JavaScript prototypisch und funktional ist, würde ich sagen, dass eine andere Gruppe von Mustern anwendbar / nützlich ist.

Sehr interessiert an den Antworten ... +1 für die Frage :)
Usoban

2
Das Buch JavaScript Patterns von Stoyan Stefanov ist eine großartige Ressource für jede Menge Muster, die Sie in JS verwenden können. Viele von ihnen existieren speziell für JS und nicht für irgendeine andere Sprache.
IgorGanapolsky

Javascript hat seine eigenen Muster. Zusätzlich zu dem von Igor erwähnten Buch gibt es Addy Osmanis kostenloses Learning Javascript Design Patterns .
user16764

Antworten:


23

Halten Sie als Javascript-Entwickler die traditionellen Entwurfsmuster für wichtig oder weniger wichtig als in anderen Sprachen / Umgebungen?

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.

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.

Auch hier treffen Designmuster nicht wirklich zu, aber im Folgenden sind drei wichtige Konstrukte aufgeführt.

  1. Verwendung von Verschlüssen
  2. Verwendung von erstklassigen Funktionen
  3. Nutzung von Objektfabriken mit oder ohne 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.jsliegt einfach events.EventEmitter. In jQuerydiesem ist $.fn.bind&& $.fn.trigger. In backbonediesem ist Backbone.Events.triggerund Backbone.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 onchangedas 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 WebSocketProtokoll haben wir, .onwas wir verwenden, um on("message", ...Ereignisse zu binden . Auch dies ist sehr verbreitet, aber es ist eher ein Beobachter auf einem Stream als ein klassischer OOP-basierter while (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.

function SomeObject() {
    var internalState;

    this.toJSON = function() {
        return internalState;
    }

    this.set = function(data) {
        internalState = data;
    }

    this.restore = function(json) {
        internalState = JSON.parse(json);
    }
}

var o = new SomeObject();
o.set("foo"); // foo
var memento = JSON.stringify(o);
o.set("bar"); // bar
o.restore(memento);

In JavaScript unterstützen wir nativ eine API für Erinnerungsstücke. Definieren Sie einfach eine Methode, die toJSONfür ein beliebiges Objekt aufgerufen wird. Wenn Sie aufrufen JSON.stringify, wird .toJSONIhr 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.


Raynos, nette Antwort. Als Beispiel habe ich eher auf konzeptioneller Ebene gedacht. Zum Beispiel: "Ein Beobachtermuster hat in der Situation geholfen ..."

@ Lewis wählt ein paar Designmuster aus, die Ihnen gefallen, und ich werde später versuchen, geeignetere funktionale Alternativen vorzuschlagen.
Raynos

Der Aufwand Ansatz und die Antwort sind brillant Raynos. Vielen Dank.
Lewis

@Lewis Ich habe versucht, mir ein paar mehr anzuschauen, war aber ratlos, da sie alle auf die strengen klassischen OO-Sprachen zugeschnitten sind. Wenn es andere spezifische Designmuster gibt, die ich mir ansehen soll, lassen Sie es mich wissen.
Raynos

Du hast das Muster des Prototyps vergessen - alias dummes Javascript hat nicht einmal normales oop ;)
c69

10

Nehmen Sie diese Antwort als subjektive Meinung.

Betrachten Sie als Javascript-Entwickler die traditionellen Entwurfsmuster als wichtig oder weniger wichtig als in anderen Sprachen / Umgebungen?

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.

Nennen Sie 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

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.


Vielen Dank! Gute Antwort und die Art von Antwort, auf die ich gehofft hatte. Obwohl die Frage als subjektiv angesehen werden kann, deutet eine gute Antwort darauf hin, dass es eine angemessene Antwort gibt. Wartet auf weitere Antworten, bevor Sie sich abmelden.

2

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.


1

Halten Sie als Javascript-Entwickler die traditionellen Entwurfsmuster für wichtig oder weniger wichtig?

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.

Nennen Sie bitte die drei wichtigsten Entwurfsmuster, die Sie als Javascript-Entwickler regelmäßig verwenden

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.