Anderson Espindola
10/12/2020 Anderson Espindola

Clean code

blog-feature-image

Fala galerinha, venho aqui ajudá-los a entender como aplicar boas práticas na programação. 😉🤙

Quem já está desenvolvendo a algum tempo, com certeza já se deparou com códigos de difícil entendimento, seja por não seguir padrões pré-estabelecidos, por conter repetição de códigos, ou até mesmo, por estar abstrato a ponto de ocultar o que o código está executando. Mas fique calmo meu jovem, pois temos o Clean Code, ele está aí exatamente para te ajudar a desenvolver códigos menos complexos!

📑 O que é Clean Code?


O Clean Code é uma filosofia que reúne um conjunto de diretrizes que podem ser seguidas com intuito de facilitar a escrita e, consequentemente, a leitura de um código. 🤓

Ahh, e outro ponto muito relevante. Os benefícios advindos de um código desenvolvido com base no Clean Code, podem ser percebidos em todos os estágios do software: desenvolvimento, testes, manutenção, features, tudo se torna mais simples e ágil, quando conseguimos entender bem o código.

Mas como podemos fazer isso?

Agora vou explicar para vocês as principais diretrizes do Clean Code.

Os exemplos serão em JavaScript. No entanto, esses conceitos podem ser aplicados em qualquer linguagem 😜

1 – Nomenclatura


O código é composto por classes, variáveis, funções, objetos, instâncias, e todos estes “elementos”, precisam receber um nome. A definição desse nome é extremamente importante para tornar o código fácil de se entender.

Precisamos ser cautelosos ao nomear qualquer parte do código. É uma classe? Ok, então vamos pensar muito bem o que ela vai fazer, o que representa no contexto do código. É uma função? Diga-me o que essa função faz. Legal! Esse deve ser o nome da sua função! Isso mesmo, o nome da função deve descrever exatamente o que está sendo executado ali, sem preocupações com o tamanho do nome, viu? Melhor ser explícito, fica a dica!

Também vale criar padrões. Perceba as situações que se repetem no código, e nomeie o que é comum nessas situações seguindo sempre a mesma lógica.

Outro ponto bem importante, é quanto a utilização de siglas. Não use siglas, por favor! Pense que quem for dar manutenção no seu código, pode não ter conhecimento das siglas que você usa no seu dia-a-dia.

const data = '10/10/2005' //Ruim

const dataCriacaoDoAplicativo = '10/10/2005' //Bom

//Ruim
const nomeFuncionario = f => {
  //Implementação...
  return f.nome
}

//Bom
const buscarNomeFuncionario = funcionario => {
  //Implementação...
  return funcionario.nome
}

2 – Evite colocar números aleatórios


Estes números aleatórios são aqueles que ninguém sabe de onde vem, simplesmente estão ali no meio de uma condição. Entenda que você pode criar uma constante, com um nome bem explicativo, e atribuir um número a ela. Assim, outras pessoas que pegarem seu código, não terão problemas em entender a necessidade de aquele número estar ali.

const verificadorNivelAcesso = pessoas =>
  pessoas.map(pessoa => {
    const ehLiberado = pessoa.acesso === 10

    return { ...pessoa, ehLiberado }
  })

A pergunta aqui é, o que significa esse número 10 ali no meio?!? 🧐

const NIVEL_DE_LIBERACAO_TOTAL = 10

const verificadorNivelAcesso = pessoas =>
  pessoas.map(pessoa => {
    const ehLiberado = pessoa.acesso === NIVEL_DE_LIBERACAO_TOTAL

    return { ...pessoa, ehLiberado }
  })

Dessa forma sabemos o que significa aquele valor

3 – Funções


Sobre as funções, uma coisa é certa: devem ser “PEQUENAS”. Se você tiver uma função com muitas linhas de código ela fica difícil de ser entendida e ainda mais difícil de ser testada.

A ideia da função é apenas realizar algo e, muitas vezes, lhe dar um retorno. Se a função tem mais que uma responsabilidade, tem algo errado. O conceito de função está sendo quebrado. ☢️☢️

Crie funções simples e objetivas. Sempre que possível, reutilize-as. Isso vai deixar seu código mais limpo e bonito!

function multiplicar(primeiroValor, segundoValor) {
  return primeiroValor * segundoValor
}

const resultadoFinal = multiplicador(2, 4)

console.log(resultadoFinal) // 8

Ah, não esqueça! Antes de criar uma função, consulte se não existe nada nativo da sua linguagem de programação que faça o que você precisa. Usar as funções nativas é mais prático, reduz linhas de código e melhora a performance de execução.

4 – Comentários


/*Ruim*/
//Colaborador não pode ser do sexo masculino e nem ser idoso
if (!ehMasculino(colaborador) && !ehIdoso(colaborador)) {
}

/*Bom*/
function naoEhMasculinoNemIdoso(colaborador) {
  return !ehMasculino(colaborador) && !ehIdoso(colaborador)
}

if (naoEhMasculinoNemIdoso(colaborador)) {
}

Os comentários devem ser evitados, meus amigos!

Isso mesmo! Se você se atentar à nomenclatura de todos os elementos, o código vai falar por si só. A variável vai deixar claro o motivo da sua existência, a função vai explicar o que ela executa, a classe vai dizer que entidade está representando… Assim, o comentário se torna desnecessário, e você ainda consegue economizar algumas linhas hehehe. 👻👻

Sabe qual o maior problema de comentários? É que eles são esquecidos. Quando o código passar por manutenção, com 99% de certeza, o comentário não será corrigido. Assim, teremos código e comentário que não condizem.

Se você sente necessidade de explicar o que está acontecendo em determinada parte do código, melhore a forma como foi escrito. Tente usar as palavras que colocaria na explicação, na própria nomenclatura.

//Busca os pedidos e armazena na variável pedidos
const pedidos = await buscarPedidos(numeroPedido)

5 – DRY


Don’t repeat yourself (não repita a si mesmo).

A ideia deste conceito é que não existam duas partes do programa executando a mesma funcionalidade.

Sempre que você se perceber escrevendo a mesma linha de código mais de uma vez, crie uma função. E chame-a quantas vezes precisar. 😁

const pessoasComMenosVinteAnos = pessoa =>
  pessoa.idade < 20 ? 'menos de 20 anos' : 'mais de vinte anos'

const separarPessoasIdade = pessoa => {
  if (pessoa.idade < 20) {
    return 'menos de 20 anos'
  }

  if (pessoa.idade > 20) {
    return 'mais de 20 anos'
  }
}

6 – Encapsular condições


Códigos encapsulados são mais fáceis de entender e manter. Criar constantes com nomes explicativos e usá-las no decorrer do código, torna tudo mais explícito. Sem contar que, quando uma regra mudar, você vai precisar fazer a alteração apenas em um lugar.

//Ruim
if (status == 0) {
}

//Bom
const statusInvalido = status == 0

if (statusInvalido) {
}

7 – Testes


E também precisamos garantir que o código esteja funcionando. Para isso, precisamos testar. Então vamos falar um pouquinho de testes limpos? 🕵🏻‍♂️

A ideia do teste é que ele seja simples, claro e consistente. Nesse sentido, podemos dizer que é importante testar pequenas funcionalidades, e diferentes cenários para tal. Testar por partes também evita que os testes fiquem dependentes, ou seja, quando um falhar, o outro ainda pode continuar passando. Mas depois de testar todas as funcionalidades individualmente, não podemos esquecer de fazer um teste de integração, para garantir que as funcionalidades estejam consistentes.

📖 Conclusão


É crucial entender que o código sempre pode ser melhorado. Então devemos pensar nas diretrizes do Clean Code, e sempre nos perguntar: o que pode ser aplicado pra melhorar isto aqui? Tornar a nomenclatura mais explícita, encapsular mais, criar funções a fim de eliminar alguma repetição de código, e assim por diante. É preciso ter olhar analítico sob o código, e sempre que perceber uma possibilidade de melhoria, implementá-la!

Com pequenas melhorias, você já estará contribuindo para construção de um projeto mais limpo! 🌳


🔗 Referências


“Bons programadores entendem linhas de códigos, os melhores sabem o que fazer com elas.” 🧙‍♂️

Anderson Espindola.

comments powered by Disqus

NOS ACOMPANHE NAS REDES SOCIAIS