A importância dos Padrões de Design com Javascript, NodeJs et al

36

Com o Javascript aparecendo como a linguagem de programação onipresente da Web nos próximos anos, novas estruturas surgindo a cada cinco minutos e a programação orientada a eventos assumindo a liderança do servidor e do cliente:

Você, como desenvolvedor Javascript, considera os padrões de design tradicionais tão importantes ou menos importantes quanto em outros idiomas / ambientes ?.

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.

Lewis
fonte
5
Algumas pessoas argumentam que os padrões de design (especialmente os do GoF) são sinais de deficiência de linguagem (consulte esta discussão ). Como o JavaScript é prototípico e funcional por natureza, eu diria que outro conjunto de padrões é aplicável / útil.
muito interessado nas respostas ... +1 para a pergunta :)
usoban
2
O livro JavaScript Patterns, de Stoyan Stefanov, é um ótimo recurso para toneladas de padrões que você pode usar em JS. Muitos deles existem especificamente para JS, e não para qualquer outro idioma.
IgorGanapolsky
Javascript tem seus próprios padrões. Além do livro mencionado por Igor, há também o Learning Javascript Design Patterns de Addy Osmani , que é gratuito.
user16764

Respostas:

23

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.

  1. Uso de fechamentos
  2. Uso de funções de primeira classe
  3. 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 jQueryeste é $.fn.bind&& $.fn.trigger. Em backboneeste é Backbone.Events.triggere 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 onchangeevento 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 WebSocketprototol, temos o .onque 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 toJSONem qualquer objeto. Quando você chama, JSON.stringifyele chama internamente .toJSONseu 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.

Raynos
fonte
Raynos, boa resposta. Quanto a exemplos, eu estava pensando mais do nível conceitual. Por exemplo: "um padrão de observador ajudou na situação ..."
@Lewis escolhe alguns padrões de design que você gosta e tentarei sugerir alternativas funcionais mais apropriadas posteriormente.
Raynos
A abordagem e a resposta do esforço são brilhantes Raynos. Obrigado.
Lewis
@Lewis Tentei olhar para mais alguns, mas fiquei perplexo, pois todos são adaptados para linguagens OO clássicas estritas. se houver outros padrões de design específicos que você queira que eu observe, informe-me.
Raynos 7/11/11
Você esqueceu Prototype padrão - aka javascript estúpido nem sequer tem oop normais ;)
C69
10

Tome esta resposta como opinião subjetiva.

Você, como desenvolvedor Javascript, considera os Padrões de Design tradicionais tão importantes ou menos importantes quanto em outros idiomas / ambientes?

Se você quer dizer padrões de design tradicionais como o Gang of Four , a maioria das técnicas é independente de linguagem / plataforma como "Programar em uma interface, não uma implementação" ou "Favorecer a composição do objeto sobre a herança de classe" e são igualmente importantes também para desenvolvedores de JavaScript.

Padrões mais específicos, como criacionista, estrutural e comportamental, podem ou não ser usados ​​da mesma maneira ou com a mesma frequência que em outros idiomas, porque os recursos do idioma podem afetar seu uso em grande medida. Algumas linguagens (JavaScript incluído), portanto, têm seus próprios padrões de design com base na funcionalidade ou no açúcar sintático que oferecem.

Em geral, eu diria que os padrões de design tradicionais são tão importantes quanto em outras línguas, mas os padrões específicos de JavaScript são mais importantes que os tradicionais.

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

Entre os padrões essenciais de design do JavaScript, eu principalmente os utilizo:

1. Padrão do construtor (com protótipos)

Especialmente no lado do servidor ao escrever o arquivo node.js, porque é adequado para escrever módulos, embora não possua encapsulamento nativo. Também é popular para muitos outros desenvolvedores se você procurar repositórios no GitHub, portanto, a familiaridade com esse padrão pode ajudá-lo a entender melhor outros códigos.

2. Revelando o padrão do módulo

Oferece modularidade com encapsulamento.

3. Padrão SECO

Isso é bastante específico do cenário, embora todos os desenvolvedores devam usá-lo o máximo possível (im).

yojimbo87
fonte
Obrigado! Boa resposta, e o tipo de resposta que eu estava esperando. Embora a pergunta possa ser vista como subjetiva, uma boa resposta como essa sugere que existe uma resposta apropriada. Esperará por mais respostas antes de 'sair'.
2

Os padrões de design são ministrados nas aulas de design para CS. Eles não são essenciais, mas realmente úteis se você puder encontrar situações análogas para ter uma solução que foi pensada.

Também permite que os programadores se comuniquem mais facilmente. Você também pode conversar com seu colega de trabalho em termos de padrões. Se você diz aqui que eu tenho meu Observador, então é bem compreendido o que está acontecendo.

As pessoas naturalmente encontrarão soluções que se encaixam em um padrão de design por conta própria, mas os padrões de design ajudam a definir terminologia e idéias padrão que podem ser úteis.

Não há nada de extraordinário nos padrões, o mais interessante é que são idéias canonizadas e definidas de maneiras que são repetidamente úteis.

adesivos personalizados
fonte
1

Você, como desenvolvedor Javascript, considera os Padrões de Design tradicionais como importantes ou menos importantes?

Eles são vitais.

Isso ocorre porque os conceitos de soluções reutilizáveis ​​podem transcender a linguagem. - alterações de sintaxe - alterações de implementação - A noção de padrão ainda existe.

Desenvolvedores de qualquer idioma podem aprender JS avançado aprendendo padrões, não sintaxe. Aqueles que não sabem disso estão perdendo.

Nomeie os três principais padrões de design que você, como desenvolvedor Javascript, usa regularmente

Existem padrões usados ​​com freqüência contra os quais alguns "argumentariam". No entanto, é bom saber porque são extremamente comuns e poderosos em JS avançado.

1- Espaço para nome - agrupe seu código em um objeto.

var x = (função () {}) ();

2- ObjectConfiguration, padrão de fábrica. Passe um objeto para uma função, não um monte de vars.

var product = factory ({});

3- Função de retorno de chamada. - Passe uma função como parâmetro, a ser chamada quando a tarefa estiver concluída.

function longTask (function () {// me liga quando terminar});

Como eu disse, alguns podem argumentar que esses não são padrões, mas são muito comuns e muito poderosos, e devem ser mencionados porque são, de fato, soluções reutilizáveis ​​muito úteis para problemas comuns. Qual é a definição de Design Pattern.

Excelente pergunta.

Espero que ajude.

Jack Stone
fonte