{"componentChunkName":"component---src-templates-blog-post-js","path":"/js-design-patterns/","result":{"data":{"markdownRemark":{"html":"<h2 id=\"Introducao\" style=\"position:relative;\">Introdução<a href=\"#Introducao\" aria-label=\"Introducao permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>JavaScript é uma linguagem moderna e dinâmica onde temos muita flexibilidade pois sua tipagem é fraca, possibilitando com que possamos fazer muitas manipulações em nosso código, é uma linguagem multiparadigma o que significa que possui elementos de POO (Programação Orientada a Objetos) e também de programação funcional.</p>\n<p>No exemplo vamos entender como usamos os mecanismos internos do JavaScript para fazer herança, por meio de <em>Prototypes</em>, como podemos adicionar comportamentos em um objeto já existente e como podemos criar um histórico das transformações que ocorreram em nosso código.</p>\n<h2 id=\"Definicao-do-projeto\" style=\"position:relative;\">Definição do projeto<a href=\"#Definicao-do-projeto\" aria-label=\"Definicao do projeto permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Então vamos ao nosso projeto, vamos supor que trabalhamos em um empresa de tecnologia e temos três tipos de funcionários, o dev. <strong>Júnior</strong>, o <strong>Pleno</strong> e o <strong>Sênior</strong> e que cada um pode realizar uma tarefa distinta, o <strong>Júnior</strong> pode fazer <em>commit</em> do seu código em um repositório da empresa, o <strong>Pleno</strong> pode fazer <em>commit</em> e revisar o código e o <strong>Sênior</strong> faz tudo isso e ainda faz o deploy.</p>\n<p><em>Isso é só um exemplo prático não refletindo a realidade ou enviesando como deve ser um fluxo de trabalho no dia-a-dia</em></p>\n<h2 id=\"Prototype\" style=\"position:relative;\">Prototype<a href=\"#Prototype\" aria-label=\"Prototype permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Aqui vamos abordar o padrão criacional <strong>Prototype</strong>, esse padrão serve para criar objetos a partir de outros existentes, criando uma cópia do objeto e podendo adicionar mais atributos nele.</p>\n<p>No <strong>JavaScript</strong> a idéia de protótipos é muito forte, pois todo objeto em <strong>JS</strong> possui propriedades internas, que são chamados de <strong>Prototype</strong> que é uma referência para outro objeto; resumindo é a forma como o <strong>JS</strong> faz herança.</p>\n<p>*Tem muito mais conteúdo sobre o assunto de <strong>Prototype</strong> e pode ser encontrado <a href=\"https://github.com/cezaraugusto/You-Dont-Know-JS/blob/portuguese-translation/this%20%26%20object%20prototypes/ch5.md\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">aqui</a>*</p>\n<p>Para o nosso exemplo vamos começar criando a estrutura base do que seria um funcionário, na pasta <em>prototype</em> no arquivo <em>index.js</em> vamos criar a nossa <em>function</em> <strong>Developer</strong> que recebe <em>name</em> e <em>registration</em>. Com isso temos a base (protótipo) para a criação de novos objetos, mais abaixo vamos começar a criar os nossos objetos especializados e adicionar neles a propriedade <em>position</em> onde é informado a senioridade do funcionário:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">Developer</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">name<span class=\"token punctuation\">,</span> registration</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> name<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>registration <span class=\"token operator\">=</span> registration<span class=\"token punctuation\">;</span>\n\n<span class=\"token punctuation\">}</span>\n\nexports<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">createJunior</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">name<span class=\"token punctuation\">,</span> registration</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> Object<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Developer</span><span class=\"token punctuation\">(</span>name<span class=\"token punctuation\">,</span> registration<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> position<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> value<span class=\"token operator\">:</span> <span class=\"token string\">'Junior'</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\nexports<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">createPleno</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">name<span class=\"token punctuation\">,</span> registration</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> Object<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Developer</span><span class=\"token punctuation\">(</span>name<span class=\"token punctuation\">,</span> registration<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> position<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> value<span class=\"token operator\">:</span> <span class=\"token string\">'Pleno'</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\nexports<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">createSenior</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">name<span class=\"token punctuation\">,</span> registration</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> Object<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Developer</span><span class=\"token punctuation\">(</span>name<span class=\"token punctuation\">,</span> registration<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> position<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> value<span class=\"token operator\">:</span> <span class=\"token string\">'Senior'</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Com isso feito agora quando quisermos criar um funcionário basta que chamemos a função criadora respectiva e nos será devolvido o funcionário com sua <em>position</em> correta como no exemplo de uso abaixo:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span>createJunior<span class=\"token punctuation\">,</span> createPleno<span class=\"token punctuation\">,</span> createSenior<span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./prototype'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> junior <span class=\"token operator\">=</span> <span class=\"token function\">createJunior</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"junior\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"123\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> pleno <span class=\"token operator\">=</span> <span class=\"token function\">createPleno</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"pleno\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"456\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> senior <span class=\"token operator\">=</span> <span class=\"token function\">createSenior</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"senior\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"789\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"Decorator\" style=\"position:relative;\">Decorator<a href=\"#Decorator\" aria-label=\"Decorator permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>O padrão <strong>Decorator</strong> nos permite adicionar comportamentos em um objeto de forma dinâmica. Pensando em como isso pode nos ajudar nesse projeto podemos imaginar que temos ações que cada desenvolvedor pode ou não fazer e podemos adicionar esse comportamento em tempo de execução, tornando o nosso código mais flexível. Podemos aproveitar isso fazendo as nossas validações do que cada desenvolvedor poderá fazer, em nossa pasta <em>decorator</em> iremos adicionar o seguinte código.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">exports<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">commit</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">Developer</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> c <span class=\"token operator\">=</span> Developer<span class=\"token punctuation\">.</span><span class=\"token function\">commit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> c <span class=\"token operator\">+</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Developer </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>Developer<span class=\"token punctuation\">.</span>position<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> can committing\\n</span><span class=\"token template-punctuation string\">`</span></span>\n<span class=\"token punctuation\">}</span>\n\nexports<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">codeReview</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">Developer</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> cr <span class=\"token operator\">=</span> Developer<span class=\"token punctuation\">.</span><span class=\"token function\">codeReview</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> test <span class=\"token operator\">=</span> Developer<span class=\"token punctuation\">.</span>position <span class=\"token operator\">===</span> <span class=\"token string\">'Junior'</span> <span class=\"token operator\">?</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Developer </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>Developer<span class=\"token punctuation\">.</span>position<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> can not make code review</span><span class=\"token template-punctuation string\">`</span></span> <span class=\"token operator\">:</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Developer </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>Developer<span class=\"token punctuation\">.</span>position<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> can make code review</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> cr <span class=\"token operator\">+</span> test <span class=\"token operator\">+</span> <span class=\"token string\">'\\n'</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\nexports<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">deploy</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">Developer</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> d <span class=\"token operator\">=</span> Developer<span class=\"token punctuation\">.</span><span class=\"token function\">deploy</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> test <span class=\"token operator\">=</span> Developer<span class=\"token punctuation\">.</span>position <span class=\"token operator\">!==</span> <span class=\"token string\">'Senior'</span> <span class=\"token operator\">?</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>Developer<span class=\"token punctuation\">.</span>position<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> can not deploy</span><span class=\"token template-punctuation string\">`</span></span> <span class=\"token operator\">:</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Only Developers </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>Developer<span class=\"token punctuation\">.</span>position<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> can deploy</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> d <span class=\"token operator\">+</span> test <span class=\"token operator\">+</span> <span class=\"token string\">'\\n'</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Também adicionamos as funções no nosso arquivo onde temos a definição de <strong>Developer</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">Developer</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">name<span class=\"token punctuation\">,</span> registration</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> name<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>registration <span class=\"token operator\">=</span> registration<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function-variable function\">commit</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token string\">\"Can I to commit?\\n\"</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function-variable function\">codeReview</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token string\">\"Can I to do code review?\\n\"</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function-variable function\">deploy</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token string\">\"Can I to do a deploy?\\n\"</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>E podemos usar da seguinte forma:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span>createJunior<span class=\"token punctuation\">,</span> createPleno<span class=\"token punctuation\">,</span> createSenior<span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./prototype'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span>commit<span class=\"token punctuation\">,</span> codeReview<span class=\"token punctuation\">,</span> deploy<span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./decorator'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> junior <span class=\"token operator\">=</span> <span class=\"token function\">createJunior</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"junior\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"123\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">commit</span><span class=\"token punctuation\">(</span>junior<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">codeReview</span><span class=\"token punctuation\">(</span>junior<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">deploy</span><span class=\"token punctuation\">(</span>junior<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> pleno <span class=\"token operator\">=</span> <span class=\"token function\">createPleno</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"pleno\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"456\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">commit</span><span class=\"token punctuation\">(</span>pleno<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">codeReview</span><span class=\"token punctuation\">(</span>pleno<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">deploy</span><span class=\"token punctuation\">(</span>pleno<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> senior <span class=\"token operator\">=</span> <span class=\"token function\">createSenior</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"senior\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"789\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">commit</span><span class=\"token punctuation\">(</span>senior<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">codeReview</span><span class=\"token punctuation\">(</span>senior<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">deploy</span><span class=\"token punctuation\">(</span>senior<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Executando esse código temos o resultado:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">Can I to commit?\nDeveloper Junior can committing\n\nCan I to <span class=\"token keyword\">do</span> code review?\nDeveloper Junior can not <span class=\"token function\">make</span> code review\n\nCan I to <span class=\"token keyword\">do</span> a deploy?\nJunior can not deploy\n\nCan I to commit?\nDeveloper Pleno can committing\n\nCan I to <span class=\"token keyword\">do</span> code review?\nDeveloper Pleno can <span class=\"token function\">make</span> code review\n\nCan I to <span class=\"token keyword\">do</span> a deploy?\nPleno can not deploy\n\nCan I to commit?\nDeveloper Senior can committing\n\nCan I to <span class=\"token keyword\">do</span> code review?\nDeveloper Senior can <span class=\"token function\">make</span> code review\n\nCan I to <span class=\"token keyword\">do</span> a deploy?\nOnly Developers Senior can deploy</code></pre></div>\n<h2 id=\"Memento\" style=\"position:relative;\">Memento<a href=\"#Memento\" aria-label=\"Memento permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Agora veremos o padrão <strong>Memento</strong>, esse padrão comportamental nos permite salvar os estados dos nossos objetos, criando uma lista como um histórico das ações realizadas. No nosso cenário seria muito útil se pudéssemos ter um histórico de tudo o que cada desenvolvedor tentou fazer em nossa aplicação. </p>\n<p>Para isso vamos precisar ter a representação do nosso <strong>Memento</strong> que é o nosso Snapshot, uma fotografia do nosso objeto naquele momento exato. Precisamos também da representação do objeto que é nosso <strong>Originador</strong> que salva e recupera os nossos <strong>Mementos</strong> e por fim a nossa classe “cuidadora” que é quem mantem os registros. </p>\n<p>O código ficaria assim:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">Memento</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">state</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state <span class=\"token operator\">=</span> state<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function-variable function\">getState</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">Originator</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function-variable function\">add</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">state</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state <span class=\"token operator\">=</span> state<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function-variable function\">save</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Memento</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function-variable function\">restore</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">memento</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> memento<span class=\"token punctuation\">.</span><span class=\"token function\">getState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">Historic</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>states <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>originator <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Originator</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function-variable function\">add</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">state</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>originator<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span>state<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>states<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>originator<span class=\"token punctuation\">.</span><span class=\"token function\">save</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function-variable function\">getByIndexOrLast</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">i</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>states<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>i <span class=\"token operator\">&amp;&amp;</span> i <span class=\"token operator\">!==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            i <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>states<span class=\"token punctuation\">.</span>length <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>originator<span class=\"token punctuation\">.</span><span class=\"token function\">restore</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>states<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function-variable function\">countSteps</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>states<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function-variable function\">getStates</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>states<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span>\n\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    Historic<span class=\"token operator\">:</span> Historic\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>E aqui temos o nosso <strong>Memento</strong> que é somente a classe do nosso estado, a <strong>Originator</strong> que é quem produz e o <strong>Historic</strong> que é quem adiciona, recupera e lista os nossos estados. </p>\n<p>Com isso podemos executar o seguinte código e poder recuperar o histórico de cada desenvolvedor:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> Historic <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./memento'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>Historic<span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">let</span> juniorHistoric <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Historic</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\njuniorHistoric<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Created Junior\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\njuniorHistoric<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Junior trying to commit\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\njuniorHistoric<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Junior trying to do code review\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\njuniorHistoric<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Junior trying to deploy\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\njuniorHistoric<span class=\"token punctuation\">.</span><span class=\"token function\">getStates</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">memento</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>memento<span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">let</span> plenoHistoric <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Historic</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nplenoHistoric<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Created Pleno\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nplenoHistoric<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Pleno trying to commit\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nplenoHistoric<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Pleno trying to do code review\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nplenoHistoric<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Pleno trying to deploy\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nplenoHistoric<span class=\"token punctuation\">.</span><span class=\"token function\">getStates</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">memento</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>memento<span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">let</span> seniorHistoric <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Historic</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nseniorHistoric<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Created Senior\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nseniorHistoric<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Senior trying to commit\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nseniorHistoric<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Senior trying to do code review\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nseniorHistoric<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Senior trying to deploy\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nseniorHistoric<span class=\"token punctuation\">.</span><span class=\"token function\">getStates</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">memento</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>memento<span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>E temos a seguinte saída:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">Created Junior\n\nJunior trying to commit        \n\nJunior trying to <span class=\"token keyword\">do</span> code review\n\nJunior trying to deploy        \n\nCreated Pleno\n\nPleno trying to commit\n\nPleno trying to <span class=\"token keyword\">do</span> code review\n\nPleno trying to deploy\n\nCreated Senior\n\nSenior trying to commit\n\nSenior trying to <span class=\"token keyword\">do</span> code review\n\nSenior trying to deploy</code></pre></div>\n<p>Temos o histórico e podemos navegar nessa “linha do tempo”.</p>\n<h2 id=\"Codigo-fonte\" style=\"position:relative;\">Código fonte<a href=\"#Codigo-fonte\" aria-label=\"Codigo fonte permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>O código fonte pode ser encontrado <a href=\"https://github.com/guilhermegarcia86/js-design-patterns\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">aqui</a></p>","fields":{"slug":"/js-design-patterns/"},"frontmatter":{"date":"01 de outubro de 2020","description":"Utilizando padrões Prototype, Decorator e Memento","title":"Padrões de projeto com JavaScript","tags":["Desenvolvimento","JavaScript","Design Patterns"],"author":"Guilherme Alves","image":{"id":"2d5c9ebb-8a6c-5144-9c9a-0684350651b6","publicURL":"/static/4087a5a05f06d5f1a816989d089ed0ee/JS-Design-Patterns.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACJklEQVQoz2VTS2gTURR900zMNDbpNJE0k2Rm0vrBbroR3UQRigiCW7cFF1ILBUuLbaUVCqIQBAXduBL8bNy4kaIoIrqppSqIFcV+bWv9pFKMSfyU9vjufUwc6+Ixj3fvPfecc++IH7MOsOQCn1z8nHNQmbFBb3S8O77KeMHle3naxuq8fFvJAt/k+exynpcrSlM2Ru8k8eBWAsuvM/g971QTqEFx0saVfAzXLsXxXd6p+dx4GheGGzDUXY+RmwmsffhLQBTf2ehsr0NudwjXZdHqggoQEwIvTGQghMCWWA0XTY2mkLUD/Oadk51R4KOLkqwRlPTyoYXHtxvx7F6SgVjajAIk1pvDGpx0gGWf6TcZZPBEFON3kzi438CNy3GsLSo7BLFZl5Spw7qPesUHWGtoyFgKcLi3ngF7j0fYPxSlj1/cKhHhGU106euZ62dohDS4mQB7+uqRhWidxqAkPT9kYuWtzVaVPcl+Vl4DGsCv98pDAmxydC6koYyNJHGozah62JYzOEYNq4B+YLagoCygxHCtxmx4ylIeltUaked794QY9OrFOK/XfwxJ5psnKfR0RDD9NIXZsTQX7NiqM/OzAyaOHA5j4XkaqDTx6lD8/GmTd/MfQNpJnmSfSoo31MBqVCvSdTTCsQP7lFQzqqFle5DvQV3gxX2LFYmNcskHYpIfNNHaEsTObTq6j0XYS1pgkn3ulIldrZvQ7OrsJf0UtCVU9wdUUhrQZ9r6qwAAAABJRU5ErkJggg==","aspectRatio":1.7777777777777777,"src":"/static/4087a5a05f06d5f1a816989d089ed0ee/0823f/JS-Design-Patterns.png","srcSet":"/static/4087a5a05f06d5f1a816989d089ed0ee/c67b7/JS-Design-Patterns.png 320w,\n/static/4087a5a05f06d5f1a816989d089ed0ee/d3930/JS-Design-Patterns.png 640w,\n/static/4087a5a05f06d5f1a816989d089ed0ee/0823f/JS-Design-Patterns.png 1280w,\n/static/4087a5a05f06d5f1a816989d089ed0ee/c730b/JS-Design-Patterns.png 1920w,\n/static/4087a5a05f06d5f1a816989d089ed0ee/55bfe/JS-Design-Patterns.png 2240w","sizes":"(max-width: 1280px) 100vw, 1280px"}}}},"timeToRead":6}},"pageContext":{"slug":"/js-design-patterns/","previous":{"fields":{"slug":"/python-design-patterns/"},"frontmatter":{"title":"Padrões de projeto com Python","date":"28 set, 2020"}},"next":{"fields":{"slug":"/spring-security-jwt/"},"frontmatter":{"title":"Spring Security e JWT","date":"14 dez, 2020"}}}},"staticQueryHashes":["63159454"]}