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.
- Verwendung von Verschlüssen
- Verwendung von erstklassigen Funktionen
- 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.js
liegt einfach events.EventEmitter
. In jQuery
diesem ist $.fn.bind
&& $.fn.trigger
. In backbone
diesem ist Backbone.Events.trigger
und 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 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, 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 toJSON
für ein beliebiges Objekt aufgerufen wird. Wenn Sie aufrufen JSON.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.