Come sviluppatore di Javascript consideri i tradizionali modelli di design importanti o meno importanti di quanto lo siano stati con altri linguaggi / ambienti ?.
I modelli di design classici non si applicano a JavaScript.
Ciò che si applica è la scrittura di codice modulare e funzionale.
È necessario utilizzare una combinazione di costruttori e funzioni di prima classe.
Come sviluppatore JavaScript spingo personalmente verso il trattamento di JavaScript come LISP piuttosto che Java. Quindi prova a emulare monadi e codice di stile funzionale di alto livello piuttosto che provare a emulare il codice OOP classico.
Indica i tre principali modelli di design che utilizzi regolarmente come sviluppatore Javascript e fornisci un esempio di come hanno contribuito allo sviluppo di Javascript.
Ancora una volta i modelli di progettazione non si applicano molto, ma di seguito sono riportati tre importanti costrutti.
- Uso di chiusure
- Uso di funzioni di prima classe
- Uso delle fabbriche di oggetti con o senza
new
Per favore, lascia un qualche tipo di contesto per il quale posso mostrare esempi di questo tipo di tecniche rispetto a fare lo stesso tipo di codice usando i modelli di progettazione tradizionali.
Diamo un'occhiata ad alcuni dei modelli di design classici e come implementarli in js così come modelli alternativi più adatti a js stesso:
Modello osservatore:
In node.js
questo è semplicemente events.EventEmitter
. In jQuery
questo è $.fn.bind
&& $.fn.trigger
. In backbone
questo è Backbone.Events.trigger
e Backbone.Events.bind
. Questo è un modello molto comune usato nel codice quotidiano.
Non mi fermo mai e penso "Ehi, sto usando un modello di osservatore qui!". No, questo è solo un modo di basso livello per trasmettere messaggi o un modo per cambiare in cascata.
Ad esempio, nel backbone tutte le viste MVC si legano onchange
all'evento dei modelli , quindi cambiando il modello si sovrappongono automaticamente eventuali modifiche alla vista. Sì, questo è un modello potente, ma il suo uso è così comune nella programmazione guidata dagli eventi che non si rendevano conto che lo stavano usando ovunque.
Nel WebSocket
prototipo abbiamo quello .on
che usiamo per legare agli on("message", ...
eventi. Ancora una volta questo è molto comune, ma è un osservatore su uno stream piuttosto che sulla tua classica OOP while (byte b = Stream.ReadNextByte())
.
Questi sono tutti potenti usi del modello Observer. Ma questo non è uno schema che usi. Questa è una parte semplice della lingua. Questo è solo codice.
Motivo ricordo:
Questo è semplicemente JSON. Ti consente di serializzare lo stato di un oggetto in modo da poter annullare un'azione.
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 supportiamo nativamente un'API per i ricordi. Basta definire un metodo chiamato toJSON
su qualsiasi oggetto. Quando lo chiami JSON.stringify
, chiamerà internamente .toJSON
il tuo oggetto per ottenere i dati reali che vuoi serializzare su JSON.
Ciò ti consente di realizzare in modo banale istantanee del tuo codice.
Ancora una volta non mi rendo conto che questo è un modello ricordo. Questo sta semplicemente usando lo strumento di serializzazione JSON.
Pattern di stato / Pattern di strategia:
Non hai bisogno di un modello di stato. Hai funzioni di prima classe e tipi dinamici. Basta iniettare funzioni o modificare le proprietà al volo.