{"componentChunkName":"component---src-templates-blog-post-js","path":"/blog/2016/10/10/sobre-padroes-de-escrita-de-codigo","result":{"data":{"site":{"siteMetadata":{"title":"Vinicius Dacal","url":"https://www.viniciusdacal.com","author":"Vinicius Dacal"}},"markdownRemark":{"id":"899d00e8-ce8b-5b12-bd8b-dcc1d183d01f","excerpt":"Logo quando comecei a trabalhar no projeto Compufácil, há mais ou menos dois anos atrás, uma das coisas que me incomodava no Frontend era a inconsistência na…","html":"<p>Logo quando comecei a trabalhar no projeto <a href=\"http://compufacil.com.br/\">Compufácil</a>, há mais ou menos dois anos atrás, uma das coisas que me incomodava no Frontend era a inconsistência na escrita de código. O Backend já estava bem resolvido quanto a isso. Feito em PHP, todo o Backend já estava com as regras do <a href=\"http://www.php-fig.org/psr/psr-2/\">PSR-2</a> e algumas docs sobre padrões de criação de arquivos e novos módulos. No post <a href=\"https://techblog.compufacil.com.br/code-style-on-compuf%C3%A1cil-a0958ecbe112#.b4qu6329o\"><em>Code Style At Compufácil</em></a> o <a href=\"https://medium.com/u/5fef03f5a76c\">Jean Carlo Machado</a> fala sobre esse processo.</p>\n<p>No Frontend, não tínhamos padrão nenhum, nós usávamos espaços, ponto e vírgula e declarávamos variáveis onde bem entendêssemos. Quando a equipe é pequena, isso não afeta tanto, mas quando a mesma começa a crescer, a necessidade de criar e utilizar um padrão se mostra necessária.</p>\n<p>Leve em consideração o código abaixo:</p>\n<p>function <strong>create</strong>(entity, otherParam){\n…\n}</p>\n<p>function <strong>update</strong> (entity,otherParam)\n{\n…\n}</p>\n<p>function <strong>delete</strong>(id,otherParam) {\n…\n}</p>\n<p>Como podemos observar, não há padrão nenhum. É estranho você encontrar num mesmo arquivo, funções que são definidas com chave de abertura na mesma linha e outra função que tem a chave de abertura na outra linha. Em um lugar é utilizado espaço depois do nome da função, em outros não. Espaços para separar os parâmetros em um lugar e em outro não.</p>\n<p>Pode ser que você olhe para aquela chave de abertura na outra linha e diga: — Que coisa bizarra, ninguém vai fazer aquilo em javascript.</p>\n<p>Imagine que alguém do backend, que esteja acostumado à um determinado padrão, venha editar um arquivo Javascript para incluir apenas uma função. <strong>Sim, isso acontece, não pense que não</strong>.</p>\n<p>Acredite, quando você não tem um linter no projeto com um padrão combinado pela equipe, você facilmente chega no cenário acima, porque inúmeras pessoas vão editar o arquivo ao longo do projeto e cada uma vai escrever o código da maneira que bem entender.</p>\n<h3>Mas quais as reais vantagens de se ter um padrão?</h3>\n<p>O maior motivo de todos é que a nossa mente se dá bem com padrões. Uma vez que ela se adapta a um padrão, seu esforço cognitivo no momento de leitura diminuí. Considerando que grande parte do tempo que estamos programando, nós passamos <strong>lendo o código</strong>, isso impacta diretamente em nossa produtividade.</p>\n<p>Um código bem organizado e bem escrito é muito mais fácil de entender, dar manutenção e até de refatorar. Você economiza tempo e esforço e todo mundo sai ganhando.</p>\n<h3>Quais os primeiros passos para implantar um padrão?</h3>\n<p>Você e sua equipe devem começar pela escolha de um padrão, existem vários, mas alguns são mais conhecidos:</p>\n<p><a href=\"https://github.com/airbnb/javascript\">Airbnb</a></p>\n<p><a href=\"https://github.com/rwaldron/idiomatic.js/\">IdiomaticJS</a></p>\n<p><a href=\"https://github.com/feross/standard\">StandardJS</a></p>\n<p>Nessa hora não comece um <a href=\"https://en.wiktionary.org/wiki/bikeshedding\">bikeshedding</a>, mais importante do que determinar se o padrão será X ou Y, é ter um padrão estabelecido. Dê preferência para os mais utilizados em projetos open source, eles já foram validados por inúmeras pessoas.</p>\n<p>Após a escolha do padrão, você pode utilizar o <a href=\"http://eslint.org/\">ESLint</a> para verificar se o seu código está de acordo com o padrão. O ESLint pode ser colocado junto ao seu processo de build, que pode estar no npm script, gulp, grunt ou em um bash script.</p>\n<p>É possível também incluir o ESLint no hook de pre-commit do <strong>git</strong>, não deixando nem ser feito commit das alterações caso o arquivo não esteja dentro do padrão. Essa abordagem funcionou bem para nós, uma vez que no pre-commit nós rodávamos o linter apenas nos arquivos alterados, o que permitiu que fizéssemos as correções gradualmente, mas que mesmo gradualmente, todo programador era educado a escrever o novo código dentro do padrão.</p>\n<h3>Instalação</h3>\n<p>Utilizando o npm, o ESLint pode ser instalado tanto globalmente quanto localmente. Dê preferência por instalá-lo localmente e incluí-lo como uma dependência do projeto. Dessa forma, assim que o dev instala o projeto, o linter já está incluso, não sendo necessário nenhuma instalação adicional para o uso do mesmo.</p>\n<p>npm i —save-dev eslint</p>\n<p>Após instalarmos o ESLint, precisamos instalar o módulo contendo as regras do padrão que foi escolhido:</p>\n<p><strong>Para fins de exemplo</strong>, vamos levar em consideração que escolhemos o <a href=\"https://github.com/airbnb/javascript\">padrão do airbnb</a>. Nesse caso, o processo de instalação seria o seguinte:</p>\n<p>npm i —save-dev eslint-config-airbnb</p>\n<p>Após a instalação é só criar um novo arquivo com o nome <strong>.eslintrc,</strong> na raiz do projeto, com o seguinte conteúdo:</p>\n<p>{\n“extends”: “airbnb”\n}</p>\n<p>Você também pode colocar sua regras customizadas nesse arquivo, como no exemplo abaixo:</p>\n<p>{\n“extends”: “airbnb”,\n“rules”: {\n“no-use-before-define”: 0\n}\n}</p>\n<p>Acesse o <a href=\"http://eslint.org/docs/rules/\">eslint.org</a> para ver as regras disponíveis.</p>\n<p>Após a criação do arquivo, vamos incluir o comando no npm scripts:</p>\n<p>“scripts”: {\n“lint”: “eslint path/to/js”,\n“lint:fix”: “npm run lint — —fix”\n},</p>\n<p>Para a utilização do mesmo, basta executar:</p>\n<p>npm run lint</p>\n<p>O comando acima executa apenas o lint e imprime os erros. O ESLint ainda conta com um autofix, para corrigir os erros mais simples. Como já incluímos ele no npm script, basta executar:</p>\n<p>npm run lint:fix</p>\n<p><strong>O autofix deve ser executado com muita atenção! Caso utilizá-lo, verifique os diffs nos seus arquivos.</strong></p>\n<h3>Incluindo o lint no pre-commit</h3>\n<p>Como mencionado acima, é possível incluir um script no hook do pre-commit do git. Dessa forma, toda vez que alguém for fazer commit, o lint será executado nos arquivos alterados, fazendo com que os desenvolvedores coloquem dentro do padrão os arquivos que editarem.</p>\n<p>Para isso, a partir da pasta raiz do seu repositório git, edite o arquivo: <strong>.git/hooks/pre-commit</strong></p>\n<p>Inserindo o conteúdo abaixo:</p>\n<h1>!/usr/bin/env bash</h1>\n<p>SFILES=” JS_STAGED_FILES_CMD=`git diff —cached —name-only —diff-filter=ACMR HEAD | egrep ’\\.(<strong>js</strong>)$’`\nSFILES=${SFILES:-$JS_STAGED_FILES_CMD}</p>\n<p>for FILE in $SFILES; do\nnode path/to/node_modules/eslint/bin/eslint.js > /dev/null 2>&#x26;1</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">if \\[ $? != 0 \\]; then\n    echo &quot;Fix file: $FILE&quot;\n    exit 1\nfi</code></pre></div>\n<p>done</p>\n<p>exit $?</p>\n<p>Basicamente, o que o script acima irá fazer, é pegar todos os arquivos com a extensão .<strong>js</strong> que estão no estado <a href=\"https://git-scm.com/book/en/v2/Getting-Started-Git-Basics#The-Three-States\"><strong>staged</strong></a>  do git e executar o lint em todos. Se houver algum erro, o script corta a execução retornando <strong>1,</strong> o que não permitirá que seja feito commit dos arquivos alterados.</p>\n<h3>Code Style Guides</h3>\n<p>Padrões de escrita de código não se limitam apenas a espaçamentos ou onde colocar ponto e vírgula  ou não. Também existem style guides que definem a organização e arquitetura do projeto, além de possuir orientação sobre como escrever um novo service, factory, classe e etc…</p>\n<p>Essas práticas ajudam a manter um padrão dentro do projeto, o tornando mais intuitivo. Isso auxilia desde a curva de aprendizado de novos desenvolvedores no time, até a produtividade de desenvolvedores experientes.</p>\n<p>Gostou do post e achou útil? Dê um <strong>like</strong> ❤️ abaixo para ajudar na divulgação e para que mais pessoas tenham acesso :)</p>","fields":{"slug":"/blog/2016/10/10/sobre-padroes-de-escrita-de-codigo"},"frontmatter":{"title":"Sobre padrões de escrita de código","date":"10 de Outubro de 2016","datetime":"2016-10-10 13:49:35","description":"Logo quando comecei a trabalhar no projeto Compufácil, há mais ou menos dois anos atrás, uma das coisas que me incomodava no Frontend era a…","language":"pt-br","keywords":[],"imageBy":null,"image":{"id":"3e9fbdbd-21e5-50a1-badd-a8b703c8c0a8","publicURL":"/static/1__fDCDg________xV7Zx6zeLgXMQ-24f8070ac3dcbe93934fac1babc32b8d.jpeg","childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAHABQDASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAT/xAAWAQEBAQAAAAAAAAAAAAAAAAADAAH/2gAMAwEAAhADEAAAAYRbWBf/xAAaEAACAgMAAAAAAAAAAAAAAAABAgADERIT/9oACAEBAAEFArDlq02HGf/EABcRAAMBAAAAAAAAAAAAAAAAAAABAxH/2gAIAQMBAT8BmjEf/8QAFxEBAAMAAAAAAAAAAAAAAAAAAAECEf/aAAgBAgEBPwG8tf/EABkQAAMAAwAAAAAAAAAAAAAAAAABETFBUf/aAAgBAQAGPwK7g+GWf//EABkQAAIDAQAAAAAAAAAAAAAAAAARASFBUf/aAAgBAQABPyFFpaBUfSE2A//aAAwDAQACAAMAAAAQf8//xAAXEQEAAwAAAAAAAAAAAAAAAAAAARFh/9oACAEDAQE/EILYP//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAgEBPxCjT//EABoQAQACAwEAAAAAAAAAAAAAAAEAESExQYH/2gAIAQEAAT8QM5MarsawFih2nkvDRYBJ/9k=","aspectRatio":2.67,"src":"/static/24f8070ac3dcbe93934fac1babc32b8d/7c190/1__fDCDg________xV7Zx6zeLgXMQ.jpg","srcSet":"/static/24f8070ac3dcbe93934fac1babc32b8d/e66c2/1__fDCDg________xV7Zx6zeLgXMQ.jpg 480w,\n/static/24f8070ac3dcbe93934fac1babc32b8d/7c190/1__fDCDg________xV7Zx6zeLgXMQ.jpg 801w","sizes":"(max-width: 801px) 100vw, 801px"}}}}}},"pageContext":{"slug":"/blog/2016/10/10/sobre-padroes-de-escrita-de-codigo","language":"pt-br","dateFormat":"DD [de] MMMM [de] YYYY","previous":{"fields":{"slug":"/blog/2016/09/15/o-sentimento-de-propriedade-do-codigo","identifier":"/2016/o-sentimento-de-propriedade-do-codigo/"},"frontmatter":{"title":"O sentimento de propriedade do código","date":"Sep 15, 2016"}},"next":{"fields":{"slug":"/blog/2016/10/19/como-react-e-redux-me-fizeram-um-programador-melhor","identifier":"/2016/como-react-e-redux-me-fizeram-um-programador-melhor/"},"frontmatter":{"title":"Como React e Redux me fizeram um programador melhor","date":"Oct 19, 2016"}}}}}