Clean Code
Tags: cleancode, beginners, programming, tutorial
Published: 2023-09-01 23:38:52

## **O que é Clean Code?**


"Uma das principais funções do desenvolvimento de software é realizar a manutenções, mas para isso acontecer é preciso ser feito uma avaliação e leitura de diversos códigos fontes de programas desenvolvidos anteriormente, por outras pessoas. E essa atividade só daria certo caso os antigos desenvolvedores seguissem boas práticas de programação e conceitos adequados."



"Clean Code, é também conhecido/significa código limpo, é uma prática bastante conhecida no mundo da programação por se tratar de uma metodologia de boas práticas, para que o código desenvolvido seja de fácil leitura, manutenção e  entendimento para qualquer desenvolvedor que leia consiga desenvolver novas demandas e manutenções sobre este código."



"Então o objetivo do Clean Code é garantir que o código seja de qualidade e de fácil manutenção e reutilização"



**Clean Code: Por que usar?**

"Bom desenvolvimento com regras de código limpo ajuda a evitar problemas como ex:'fazer uma pequena alteração que pode impactar no funcionamento de todo o sistema, ai caso isso aconteça é necessário fazer varias outras alterações', em muitos cenários como esse, temos a percepção que o código ta tão mal escrito que seria mais fácil a criação do código todo do zero"





**Clean Code: Algumas Regras:**



## 1 - Nomenclatura de Fácil entendimento



"Ah nomenclatura é utilizada de diversas formas, como em variáveis, funções, classes, parâmetros e ate nos nomes dos arquivos.

É importante que a nomenclatura faça sentindo com a finalidade do código, uma função que valida a variável nome seria validarNome().

Assim deixando de forma mais intuitiva este código, caso alguém esteja lendo entendera que esta função ira validar a variável nome, também deve se nomear variáveis de forma substantiva e funções como verbos"



## 2 - Seguir os Padrões do código



"Devemos seguir os padrões já existentes no código, ex: caso uma variável seja feita em camelcase nomePessoa ou se é feita snakecase nome_pessoa.

Seguir o padrão já existente no código para fácil entendimentode outros programadores"



## 3 - Mantenha os dados de configuração separado do código do sistema



"Dados de configuração como uma string do banco de dados, ou a porta do servidor, que sejam mantidos em um JSON na pasta raiz do código, assim podendo até serem ocultados pelo gitIgnore caso queira usar versionamento"



## 4 - Evite repetição de código



"Tente codificar código mais curtos e ter somente uma específica responsabilidade ou faça somente uma função, ou seja, retorne somente um valor.

Evite repetições demasiadas como, por exemplo vários if aninhados, pois podem complicar a leitura e entendimento do código, evite também duplicidade de código, não deve se ter trechos diferentes que desempenhem a mesma função."



## 5 - Comentários excessivos



"É comum termos comentários no código, mas devem ser evitado, caso esse comentário indique alguma ação ao programador, como várias alterações a fazer ou alguma falha em determinado ponto do código.

Ah o risco desses comentários em excesso não serem removidos quando houver alguma alteração no código, um trecho de comentário as vezes podem conter informações ou explicação referente a um determinado trecho de código ou algum algoritmo que foi criado, que pode não mais corresponder a função daquele trecho de código, por isso deve ser cuidadoso com os comentários caso queira trabalhar com anotações para mentalizar um ponto do código ou mentalizar um algoritmo que precisa ser criado opte por um bloco de notas ou algo parecido."



## 6 - Tratamento de Erros



"Um dos maiores problemas de um software é a negligência com os erros do software, pode ser que a mensagem exibida a pessoa que é usuária do software às vezes não seja a mais correta, devem ser usadas com moderação e alteradas caso necessário.

Por isso é importante fazer tratamento de erros para garantir a usualidade do software e garantir que o erro exibido para o usuário seja o mais esclarecedor possível."



## 7 - Criar Testes Limpos



"Bom a técnica do Clean Code deve ser implementada também aos testes do sistema como os testes unitários, por isso deve ser os testes deve ser escritos com pouca linha, não faça testes que venha a testar todo o código de uma vez só, crie pequenos código para cada caso ou função, ou trecho de código, como testas negativas que deveriam existir caso uma variável não seja inserida.

Assim a evolução dos testes não sera prejudicada com novos erros, pois aquele código está testando somente um trecho, função ou validação do código.

É importante que tenha um ambiente de teste para que o código seja testado quantas vezes for necessário."



## 8 - KISS: Mantenha as coisas simples



"É o primeiro princípio de usabilidade do design do produto, mas também é um dos principais conceitos de codificação.

Existem diversas formas de se escrever algo complexo no código de maneira curta e precisa e isso não quer dizer somente simplificar as coisas,

você precisa olhar com os olhos de alguém que não escreveu este código que você esta implementando, quais seriam as dúvidas dessa pessoa? Oque ela precisa compreender para chegar na compreensão que você chegou.

Todos os códigos que você implementa são para outras pessoas, como você um programador, que lerão e farão alterações e manutenção futuramente. 

Assim tornando responsabilidade sua deixar esse código mais legível e fácil de compreensão possível. Seu objetivo como programador é oferecer a melhor experiência de código para o usuário.



## 9 - Regra do Escoteiro



"Escoteiros tem uma regra: deixar o acampamento o mais limpo possível do que encontraram antes.

Esse principio do Clean Code faz parte da melhoria contínua do código, com isso fazendo com que a equipe que está trabalhando sobre esse código consiga melhorar a qualidade do código e entregar valor para seus usuários."



## 10 - Dados de configuração em Alto nível



"Já que temos dados de configuração em muitos lugares, faz sentido manter eles em alto nível, assim sera de fácil modificação"



## 11 - Use polimorfismo ao invés de "If"



"Usar if ou uma condicional é uma tomada de decisão, que pode aumentar a complexidade da aplicação, por isso devemos evitar ao máximo o uso de "ifs" em série um atras do outro.

Se isso acontecer tente utilizar o "polimorfismo" do que ficar utilizando condicionais pelo código."



## 12 - Mult-thread



"Programação multithreading é um conceito bem amplo. Pode ser considerado muitos tipos de processamento na mesma maquina.

A programação multithread é a programação de vários threads de execução simultânea. Esses threads podem ser executados em um único processador. Ou pode haver vários threads em execução em vários núcleos de processador."



## 13 - Separe codigos mult-thread



"É recomendado deixar o que é assíncrono separado do síncrono, dessa forma a gente não força um método a ser ou não ser assíncrono por causa de outra parte de código."



## 14 - Utilize async em métodos assíncronos



"Ao utilizar um código async normalmente você está esperando o retorno de X coisa, que pode levar algum tempo para ser processado, como obter alguns valores em um banco de dados como no exemplo abaixo.



```

async createPeople(input: any): Promise {


 const people = await this.peopleRepository.createPeople(input)

   if(!people.firstName){


       throw new Error('Pessoa não pode ser criada sem o nome!')

    }

 return people;

}

```

Se a função contiver o await, ele interrompe a execução e diz que a próxima linha de código não sera executada a menos que a promessa seja resolvida.
Mas isso não significa um bloqueio no código, assim que o codigo Javascript chegar no await, ele sairá da função e vera se tem algo a mais para ser processado, assim que a promessa for resolvida, ira retornar para essa função e conclui-la."



## 15 - Evite configuração desnecessária



"Não deixe configurações no sistema, por falta de definição por parte de alguém. Isso faz o código ficar poluído e deixa tudo mais complexo desnecessariamente."



## 16 - Utilize Injeção de Dependência



"Não da para prever como o código ficará no futuro enquanto estiver sendo desenvolvido, no caso de diversos desenvolvedores atuando no mesmo código, pode não ser fácil identificar as dependências de uma classe, isso pode ocorrer porque elas foram codificas de forma diferente e pode acarretar diversos problemas e erros.

Ah Solução seria a injeção de dependência e aqui vamos ver alguns bons pontos para la utiliza.



 1. Manutenibilidade

"A injeção de dependência é uma técnica que melhora a manutenibilidade do código separando a construção de uma classe de seu uso.

Uma classe não cria suas dependências. Em vez disso, eles são fornecidos externamente, geralmente como argumentos para o construtor ou passados ​​para um método."



 2. Legibilidade

"A pouca legibilidade de um código é um dos problemas mais relevantes encontrados na engenharia de software. Sendo assim injeção de dependência é uma maneira eficaz de melhorar a legibilidade, garantindo que as partes do sistema sejam desacopladas. 

Isso torna o código mais fácil de ler porque separa uma classe e sua funcionalidade de objetos relacionados, tornando o código mais leve e simples."



 3. Testabilidade

"Um código bem testado é uma grande e boa preocupação dos programadores. Quando o código é mal testado, pode nos levar a erros no ambiente de produção. Injeção de dependência facilita na hora do sistema ser testado, removendo as dependências difíceis de ser substituídas."



## 17 - Lei de Deméter



A Lei de Deméter é uma diretriz de design com o objetivo de criar um acoplamento frouxo entre objetos. Também é conhecido como o princípio do menor conhecimento. Esta é a lei dos métodos: quanto menos um método souber sobre outros métodos de objetos, menos acoplamento você terá.



As Regras Deméter:  



 1. Um método de um objeto pode chamar métodos desse objeto;



 2. Um método pode chamar um método de seus parâmetros;

 3. Um método pode chamar um método de qualquer objeto criado ou instanciado por esse método;

 4. Um método pode chamar um método de objetos que são dependências do objeto de métodos;

 5. Um método pode chamar um método de uma variável global que é acessível pelo objeto do método.



Bem, isso significa que um método deve ser capaz de chamar métodos em um objeto que ele tenha disponível de acordo com essas regras. Mas você só pode chamar um método de um nível de profundidade. Você não deve aninhar chamadas de método porque então você está sabendo muito. Muito conhecimento neste caso significa muito acoplamento em seu código.



As principais vantagens de satisfazer a Lei de Deméter são as seguintes:



As dependências entre classes e acoplamentos são reduzidas;

Reutilize as aulas com facilidade;

O código é mais fácil de testar;

O código é mais sustentável e flexível a mudanças.



## 18 - Utilize variáveis auto-explicativas



"Já falamos que é preferível um código autoexplicativo, exemplo quando falamos de nomes escolhidos para variável e métodos"

Ex: 

int timeout = 5; // timeout in seconds



int timeoutInSeconds = 5;



## 19 - Evite condicionais negativas com "!"



"Bom o negativo são bem mais difícil de compreensão do que o positivo, portanto tente não usar a "!" caso uma pessoa não tenha conhecimento do que é isso no código, ou tente explica-la sobre"



## 20 - Não quebre a indentação do código



"A formatação do código é vem muito de comunicação, e a comunicação é a das primeiras coisas que você tem que ser competente como programador.

O tipo de codificação e a legibilidade costuma continuar mesmo.

Ao formatar o código, você deve considerar os cenários abaixo."



 1. Separe os conceitos verticalmente;

 2. O código relacionado deve aparecer verticalmente denso;

 3. Declare variáveis ​​próximas ao seu uso;

 4. As funções dependentes devem ser fechadas;

 5. Funções semelhantes devem ser fechadas;

 6. Coloque as funções em uma direção descendente;

 7. Mantenha as linhas curtas;

 8. Não use alinhamento horizontal;

 9. Use espaço em branco para associar coisas relacionadas e desassociar fracamente relacionadas;

 10. Não quebre o recuo.