Você, como desenvolvedor Javascript, considera os padrões de design tradicionais tão importantes ou menos importantes quanto em outros idiomas / ambientes ?.
Os padrões clássicos de design não se aplicam ao JavaScript.
O que se aplica é escrever código modular e funcional.
Você deve usar uma mistura de construtores e funções de primeira classe.
Como desenvolvedor de JavaScript, eu pessoalmente busco tratar o JavaScript como LISP e não como Java. Portanto, tente emular mônadas e código de estilo funcional de alto nível, em vez de emular o código OOP clássico.
Nomeie os três principais padrões de design que você, como desenvolvedor Javascript, usa regularmente e dê um exemplo de como eles ajudaram no seu desenvolvimento Javascript.
Novamente, os padrões de design não se aplicam muito, mas abaixo estão três construções importantes.
- Uso de fechamentos
- Uso de funções de primeira classe
- Uso de fábricas de objetos com ou sem
new
Deixe algum tipo de contexto para o qual eu possa mostrar exemplos desse tipo de técnica em comparação com o mesmo tipo de código usando padrões de design tradicionais.
Vamos dar uma olhada em alguns dos padrões de design clássicos e como implementá-los em js, bem como em padrões alternativos mais adequados para o próprio js:
Padrão do observador:
Nisto node.js
é simplesmente events.EventEmitter
. Em jQuery
este é $.fn.bind
&& $.fn.trigger
. Em backbone
este é Backbone.Events.trigger
e Backbone.Events.bind
. Esse é um padrão muito comum usado no código do dia a dia.
Eu nunca paro e penso "Hey, eu estou usando um padrão de observador aqui!". Não, essa é apenas uma maneira de baixo nível para transmitir mensagens ou uma maneira de mudar em cascata.
Por exemplo, no backbone, todas as visualizações do MVC se vinculam ao onchange
evento models , portanto, alterar o modelo envia em cascata as alterações automaticamente para a visualização. Sim, esse é um padrão poderoso, mas seu uso é tão comum em programação orientada a eventos que não estavam percebendo que estavam sendo usadas em todos os lugares.
No WebSocket
prototol, temos o .on
que usamos para vincular a on("message", ...
eventos. Novamente, isso é muito comum, mas é um observador em um fluxo, e não no seu POO clássico while (byte b = Stream.ReadNextByte())
.
Todos esses são usos poderosos do padrão Observer. Mas esse não é um padrão que você usa. Esta é uma parte simples do idioma. Isso é apenas código.
Padrão de lembrança:
Isso é simplesmente JSON. Permite serializar o estado de um objeto para desfazer uma ação.
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);
Em JavaScript, oferecemos suporte nativo a uma API para lembranças. Basta definir um método chamado toJSON
em qualquer objeto. Quando você chama, JSON.stringify
ele chama internamente .toJSON
seu objeto para obter os dados reais que você deseja serializar para JSON.
Isso permite que você faça instantaneamente instantâneos do seu código.
Novamente, não percebo que isso seja um padrão de lembrança. Isso é simplesmente usando a ferramenta de serialização que é JSON.
Padrão de Estado / Padrão de Estratégia:
Você não precisa de um padrão de estado. Você tem funções de primeira classe e tipos dinâmicos. Basta injetar funções ou alterar propriedades rapidamente.