{"componentChunkName":"component---src-templates-blog-post-js","path":"/en/writing/grandes-soluções-pequenas-funções/","result":{"data":{"site":{"siteMetadata":{"title":"Um site de um desenvolvedor de software","author":"Dheyson L. Alves","description":"Um site sobre computação e desenvolvimento","charSet":"utf8"}},"locales":{"edges":[{"node":{"ns":"translation","data":"{\"Home\":\"Home\",\"Escrita\":\"Writing\",\"Portfólio\":\"Portfolio\",\"Sobre\":\"About\",\"Últimas publicações\":\"Latest Posts\",\"Engenheiro de Software com mais de 3 anos de experiência na indústria. Ajudando empresas de diferentes nichos a atingir seu potencial com aplicativos de software.\":\"Software Engineer with more than 3 years of experience in the industry. Helping companies from different niches to reach their potential with software applications.\",\"Codando. Escrevendo. Aprendendo. Ensinando.\":\"Coding. Writing. Learning. Teaching.\",\"CSS, JAVASCRIPT, TYPESCRIPT, REACT E FRONT-END NO GERAL.\":\"CSS, JAVASCRIPT, TYPESCRIPT, REACT AND FRONT-END WORLD.\",\"Front-End Engineer\":\"Front-End Engineer\",\"Opa, e ai?\":\"Hey, what's up\",\"Página principal\":\"Main page\",\"Alguns artigos que escrevi\":\"Some articles I wrote\",\"Meus atuais projetos\":\"My current projects\",\"Que tal acender a luz?\":\"How about turning on the light?\",\"Que tal apagar a luz?\":\"How about turning off the light?\",\"Logo do Linkedin rede social\":\"Linkedin logo social network\",\"Minha rede profissional\":\"My professional network\",\"Logo do passado com cor branca do twitter\":\"Logo of the past with twitter color white\",\"Quer trocar uma ideia?, manda dm\":\"Want to exchange an idea?, send a dm\",\"social media\":\"Social Media\",\"Boa parte dos meus projetos\":\"Most of my projects\",\"Logo quadrada com fundo preto com texto DEV no meio de cor branca\":\"Square logo with black background with DEV text in the middle of white color\",\"Meus outros artigos em inglês\":\"My other articles in English\",\"Logo quadrada com fundo preto com símbolo de controle no meio\":\"Square logo with black background with control symbol in the middle\",\"Comunidade do discord da Coffer\":\"Coffer's discord community\",\"Todas as publicações\":\"All publications\",\"Postado em\":\"Posted in\",\"Uma página de erro que poderia encontrar a solicitação.\":\"An error page that could find the request.\",\"Ah não! Algo está errado...\":\"Oh no! Something is wrong...\",\"Você clicou em uma rota que não existe ... que pena.\":\"You clicked on a route that doesn't exist... what a pity.\",\"Dheyson L. Alves - Sobre\":\"Dheyson L. Alves - About\",\"Olá, sou Dheyson L. Alves\":\"Hi, I am Dheyson L. Alves\",\"Engenheiro de Software com 3 anos de experiência na indústria. Ajudando empresas de diferentes origens aatingir seu potencial com aplicativos de software.\":\"Software Engineer with 3 years of experience in the industry. Helping companies from different backgrounds reach their potential with software applications.\",\"Além disso, criei com estudantes universitários uma comunidade de desenvolvedores chamada CofferHub. Foco em ensinar e aprender juntos. Fico entusiasmado com as oportunidades em que posso trabalhar com produtos que impactam muitas pessoas. Além disso, trabalhar com uma equipe com uma mentalidade de crescimento e aprendizado.\":\"In addition, I created with college students a developer community called CofferHub. Focus on teaching and learning together. I am excited about the opportunities where I can work with products that impact many people. Also, working with a team with a growth and learning mindset.\",\"minutos de leitura\":\"reading time\",\"Escrito por\":\"Written by\",\"Pesquise por tags\":\"Search by tags\",\"artigo\":\"article\",\"artigos\":\"articles\",\"Artigo não encontrado\":\"Article not found\",\"Parece que você chegou a uma pesquisa que não existe. Por favor, use a navegação acima ou pesquise acima para encontrar o caminho de volta ao nosso site daora.\":\"It looks like you've come to a search that doesn't exist. Please use the navigation above or search above to find your way back to our cool website.\",\"Mais Artigos\":\"More Articles\"}","language":"en"}}]},"markdownRemark":{"id":"2543c022-c44d-5549-b53f-ef1d4cfc2162","excerpt":"Photo By Mani Bhargava Photo by Pierre-Axel Cotteret on Unsplash Estou lendo o livro Clean Code do Robert C. Martin, popularmente chamado de Uncle Bob, e estou…","html":"<br/>\n<p><img src=\"https://images.unsplash.com/photo-1599669550575-22795a95e36f?ixlib=rb-1.2.1&#x26;ixid=eyJhcHBfaWQiOjEyMDd9&#x26;auto=format&#x26;fit=crop&#x26;w=1350&#x26;q=80\" alt=\"Photo By Mani Bhargava\" title=\"Architecture image\"></p>\n<p>Photo by <a href=\"https://unsplash.com/@pierreaxel_?utm_source=unsplash&#x26;utm_medium=referral&#x26;utm_content=creditCopyText\">Pierre-Axel Cotteret</a> on <a href=\"https://unsplash.com/t/architecture?utm_source=unsplash&#x26;utm_medium=referral&#x26;utm_content=creditCopyText\">Unsplash</a></p>\n<p>Estou lendo o livro Clean Code do Robert C. Martin, popularmente chamado de Uncle Bob, e estou exatamente no capítulo sobre as funções. E uma frase que me deixou inquieto durante a semana de estudos e no trabalho foi essa:</p>\n<h2>The first rule of functions is that they should be small. The second rule of functions is that they should be smaller than that</h2>\n<hr>\n<p>Exatamente, simples, direto e que me causou um certo impacto na maneira de pensar. E venho tentado aplicar no meu dia-a-dia, seja no trabalho ou estudos pessoais. Você deve estar se perguntando, porque comecei falando sobre minhas leituras?</p>\n<p>Porque busquei aplicar alguns dos aprendizados do livro no código que mostrarei a seguir.</p>\n<h3>O desafio</h3>\n<p>Passei por um desafio interessante recentemente, eu precisava pegar o texto HTML de um editor, realizar uma requisição de um conjunto de palavras, e buscar cada uma delas dentro desse HTML. Essas palavras, eram de um dicionário, previamente cadastrado, em um cenário específico da regra de negócio. Provavelmente, você já deve ter percebido a divisão em um tipo de pseudocódigo na sentença acima. Então, vamos ao “Show me the code!“.</p>\n<p>Aparentemente, nada muito complicado - o que de fato, não é. Então vamos lá, vou passar por cada etapa do meu processo.</p>\n<h4>1.Dados</h4>\n<p>A estrutura de dados das palavras, e do HTML eram simples. Eu tinha uma estrutura de dados parecida com essa para as palavras:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> dictionaryWords <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n  <span class=\"token punctuation\">{</span>\n    word<span class=\"token operator\">:</span> <span class=\"token string\">\"Otorrinolaringologista\"</span><span class=\"token punctuation\">,</span>\n    title<span class=\"token operator\">:</span> <span class=\"token string\">\"Um tipo de médico.\"</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    word<span class=\"token operator\">:</span> <span class=\"token string\">\"Clínico\"</span><span class=\"token punctuation\">,</span>\n    title<span class=\"token operator\">:</span> <span class=\"token string\">\"Um típo de médico\"</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Temos também, o próprio HTML, vindo do editor de texto.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> html <span class=\"token operator\">=</span> \"<span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span><span class=\"token operator\">&lt;</span>span<span class=\"token operator\">></span><span class=\"token constant\">O</span> clínico\ntambém é um Otorrinolaringologista<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>span<span class=\"token operator\">></span>\n<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\"<span class=\"token punctuation\">;</span></code></pre></div>\n<p>Definido isso, sabemos que vamos precisar apenas do word do objeto e comparar com as palavras do HTML.</p>\n<h4>2.Tratamento do HTML</h4>\n<p>Busquei primeiro separar cada palavra do html e colocar em um array. Criei uma função para isso:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">splitString</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">value</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  value<span class=\"token punctuation\">.</span><span class=\"token function\">split</span><span class=\"token punctuation\">(</span><span class=\"token string\">\" \"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>O split retorna um array, e seu primeiro parâmetro informa a regra de separação ou split dos elementos. No nosso caso, eu precisava de tudo que possuia um espaço em branco entre eles. Mas temos um problema, existem tags HTML dentro. Que no nosso caso, não é interessante para realizar a comparação de palavras.</p>\n<p>Foi quando precisava de ajuda do RegEX para substituir cada tag HTML interna por vazio ou \"\". Então criei também uma função para fazer isso:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlStringReplacer</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">value</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  value<span class=\"token punctuation\">.</span><span class=\"token function\">replace</span><span class=\"token punctuation\">(</span><span class=\"token regex\"><span class=\"token regex-delimiter\">/</span><span class=\"token regex-source language-regex\">&lt;[^>]+></span><span class=\"token regex-delimiter\">/</span><span class=\"token regex-flags\">g</span></span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Com isso, pude substituir cada tag HTML por uma string vazia.</p>\n<h4>3. Pipeline de callbacks</h4>\n<p>Erick Elliot é um monstro do javascript, ele possui bastante conteúdo sobre Funcional programming e cursos relacionados. Mas comento dele aqui em específico de um vídeo do youtube dele, onde ele comenta sobre a simplicidade do código, o quanto isso é importante.\nE um trecho me chamou atenção, como ele utiliza dos reducers para criar soluções simples.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">pipe</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token operator\">...</span>functions</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token parameter\">value</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> functions<span class=\"token punctuation\">.</span><span class=\"token function\">reduce</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">currentValue<span class=\"token punctuation\">,</span>\n  currentFunction</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token function\">currentFunction</span><span class=\"token punctuation\">(</span>currentValue<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>O método reducer abaixo, nos permite reduzir um output para apenas um valor de retorno.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">  Array<span class=\"token operator\">&lt;</span>any<span class=\"token operator\">></span><span class=\"token punctuation\">.</span><span class=\"token function\">reduce</span><span class=\"token punctuation\">(</span><span class=\"token function-variable function\">callbackfn</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">previousValue<span class=\"token operator\">:</span> any<span class=\"token punctuation\">,</span>\n  currentValue<span class=\"token operator\">:</span> any<span class=\"token punctuation\">,</span> currentIndex<span class=\"token operator\">:</span> number<span class=\"token punctuation\">,</span>\n  array<span class=\"token operator\">:</span> any<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> any<span class=\"token punctuation\">,</span> initialValue<span class=\"token operator\">:</span> any<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> any</code></pre></div>\n<p>Nos seus parâmetros, informamos o valor anterior <strong>previousValue</strong> e o valor atual <strong>currentValue</strong>, que neste momento, são informações mais relevantes para nosso cenário.\nNa função <strong>pipe</strong> acima, reduzimos o conjunto de funções com o <strong>spread operator</strong> e tratamos cada resultado da função separadamente, o output anterior da função passada é utilizado como parâmetro da função atual. Como se fosse uma pequena escada, onde subimos cada degrau, um passo de cada vez para chegar a um fim.</p>\n<p>Com essa informação, podemos partir para o último passado do nosso desafio.</p>\n<h4>4. Resultado</h4>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">  cont data <span class=\"token operator\">=</span> <span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span>\n    htmlStringReplacer<span class=\"token punctuation\">,</span>\n    splitString<span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>html<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>As duas primeiras funções realizam o tratamento do dado <strong>html</strong>, onde a ordem importa, pois cada dado é passado, como passo a passo.\nO resultado do dado obtivo vem a seguir:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">  <span class=\"token punctuation\">[</span><span class=\"token string\">\"O\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"clínico\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"também\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"é\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"um\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">\"Otorrinolaringologista\"</span><span class=\"token punctuation\">]</span></code></pre></div>\n<p>Que é exatamente que estávamos buscando. Apenas as palavras e sem nenhum vestígio do HTML.</p>\n<h4>5. Conclusão</h4>\n<p>O grande ensinamento que retiro do pequeno desafio, é que podemos criar soluções com pequenas funções, e obter ótimos resultados, sem precisar criar elementos complexos, que podem tornar o trabalho confuso. Por hoje é isso, obrigado se leu até aqui.</p>\n<p>Gostou do conteúdo? Compartilha com seus amigo(a)s.</p>","timeToRead":4,"frontmatter":{"title":"Grandes soluções, pequenas funções","date":"October 20, 2020","description":"Passei por um desafio interessante recentemente, eu precisava pegar o texto HTML de um editor, realizar uma requisição de um conjunto de palavras, e buscar cada uma delas dentro desse HTML.","tags":["JAVASCRIPT"]}}},"pageContext":{"slug":"/grandes-soluções-pequenas-funções/","previous":{"fields":{"slug":"/1breakpoint/"},"frontmatter":{"title":"Breakpoint #1 - Front-end Mentors, Arquitetura CSS","tags":["CSS"]}},"next":{"fields":{"slug":"/2021-novo-ano-novos-desafios/"},"frontmatter":{"title":"2021 - Novo Ano, Novos Desafios","tags":["GERAL"]}},"language":"en","i18n":{"language":"en","languages":["pt","en"],"defaultLanguage":"pt","generateDefaultLanguagePage":false,"routed":true,"originalPath":"/writing/grandes-soluções-pequenas-funções/","path":"en/writing/grandes-soluções-pequenas-funções/"}}},"staticQueryHashes":["63159454"]}