Do you as a Javascript developer
consider the traditional Design
Patterns as important or less
important than they have been with
other languages / environments?.
Gli schemi di design classici non si applicano a JavaScript.
Ciò che è applicabile è scrivere codice modulare e funzionale.
Dovresti utilizzare una combinazione di costruttori e funzioni di prima classe.
Come sviluppatore JavaScript, personalmente spingo verso il trattamento di JavaScript come LISP piuttosto che Java. Quindi cerca di emulare monadi e codice di stile funzionale di alto livello piuttosto che provare a emulare il codice OOP classico.
Please name the top three design
patterns you, as a Javascript
developer use regularly and give an
example of how they have helped in
your Javascript development.
Anche in questo caso i pattern di design non si applicano molto ma sotto ci sono tre costrutti importanti.
- Uso delle chiusure
- Uso di funzioni di prima classe
- Uso di fabbriche oggetto 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 schemi di design tradizionali.
Diamo un'occhiata ad alcuni dei classici Design Patterns e a come implementarli in js, nonché a modelli alternativi più adatti a js stesso:
Pattern osservatore:
In node.js
questo è semplicemente events.EventEmitter
. In jQuery
questo è $.fn.bind
& & %codice%. In $.fn.trigger
questo è backbone
e Backbone.Events.trigger
. Questo è un modello molto comune utilizzato nel codice giorno per giorno.
Non mi fermo mai e penso "Hey sto usando uno schema di osservatori qui!". No, questo è solo un modo di livello basso per trasmettere messaggi in giro o un modo per cambiare a cascata.
Ad esempio in backbone tutte le viste MVC si associano ai modelli Backbone.Events.bind
event, quindi la modifica del modello comporta la sovrapposizione automatica di eventuali modifiche alla vista. Sì, questo è uno schema potente, ma il suo uso è così comune nella programmazione guidata dagli eventi che non si stavano rendendo conto di averlo utilizzato ovunque.
Nel prototco onchange
abbiamo WebSocket
che usiamo per associare agli eventi .on
. Di nuovo questo è molto comune ma è un osservatore su uno stream piuttosto che il tuo classico OOP basato su on("message", ...
.
Questi sono tutti usi potenti del modello di Osservatore. Ma questo non è uno schema che usi. Questa è una parte semplice della lingua. Questo è solo codice.
Memento Pattern:
Questo è semplicemente JSON. Permette 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 while (byte b = Stream.ReadNextByte())
su qualsiasi oggetto. Quando chiami toJSON
chiamerà internamente JSON.stringify
sul tuo oggetto per ottenere i dati reali che desideri serializzare su JSON.
Questo ti permette di creare istantaneamente il tuo codice.
Ancora una volta non mi rendo conto che questo è un modello di memento. Questo è semplicemente utilizzando lo strumento di serializzazione che è JSON.
Pattern stato / modello di stato:
Non hai bisogno di uno schema di stato. Hai funzioni di prima classe e tipi dinamici. Basta iniettare funzioni o modificare le proprietà al volo.