Clean Code - Conceitos | Exemplos 🎈

CLEAN CODE para iniciantes:

Faaala turma, tranquilo!? aqui estão alguns conceitos básicos sobre Clean Code.

"Qualquer tolo pode escrever códigos que um computador possa entender. Bons programadores escrevem códigos que os humanos podem entender. " – Martin Fowler

Clean Code é uma habilidade crucial que todo dev deveria dominar! 🔥

A maioria dos exemplos foram retirados de Robert J. Martin's - Clean Code. Um clássico.


1. Como nomear variáveis

  • Não crie comentários para explicar o porquê de uma variavel estar sendo usada. Se um nome exigir um comentário, renomeie essa variável em vez de comentar.

"Um nome deve lhe dizer por que existe, o que faz e como é usado. Se um nome exigir um comentário, o nome não revelará sua intenção. " – Clean Code

Ruim:

var d; // tempo decorrido em dias

Bom:

var tempoDecorridoEmDias;
var diasDesdeACriacao;
var diasDesdeAModificacao;

2. Use nomes pronunciáveis

  • Se você não pode pronunciar um nome, não pode discuti-lo sem parecer um lerdão.

Ruim:

const yyyymmdstr = moment().format("YYYY/MM/DD");

Boa:

const currentDate = moment().format("YYYY/MM/DD");

3. Usar nomes pesquisáveis

  • Evite usar números mágicos no seu código. Opte por constantes pesquisáveis. Não use letras únicas (x,y,z,...).

  • Eles podem aparecer em muitos lugares e, portanto, não são facilmente encontradas.

Ruim:

if (student.classes.lenght < 7) {
    // Faça alguma coisa
}

Boa:

if (student.classes.lenght < MAX_CLASSES_PER_STUDENT) {
 // Faça alguma coisa
}

4. Funções: como escrever

  • As funções devem ser pequenas, muito pequenas! Quanto mais longa a função, é mais provável que ela faça várias coisas e tenha efeitos colaterais.

  • Certifique-se de que eles fazem apenas alguma coisa

Functions should do one thing. They should do it well. They should do it only. – Clean Code

  • A única coisa que essa função faz deve ser declarada em seu nome.

Pode ser difícil às vezes olhar para um função e ver se ela está fazendo várias coisas ou não. Uma boa maneira para se verificar é tentar extrair outras funções com um nome diferente. Se isso ocorrer, deve ser feita uma outra função.


5. Condicionais encapsuladas em funções

  • Refatorar a condição e colocá-la em uma função nomeada é uma boa maneira de tornar seus condicionais mais legíveis.

Este código é responsável por inserir um chip no tabuleiro de um jogo.

O isValidInsertion é o método na qual cuida em verificar a validade do número da coluna e nos permite focar na lógica de inserir o chip

public void insertChipAt(int column) throws Exception {
        if (isValidInsertion(column)) {
            insertChip(column);
            boardConfiguration += column;
            currentPlayer = currentPlayer == Chip.RED ? Chip.YELLOW : Chip.RED;
        } else {
            if (!columnExistsAt(column))
                throw new IllegalArgumentException();
            else if (isColumnFull(column - 1) || getWinner() != Chip.NONE)
                throw new RuntimeException();
        }
    }

Aqui está o código para isValidInsertion, se você estiver interessado.

    private boolean isValidInsertion(int column) {
        boolean columnIsAvailable = column <= NUM_COLUMNS && column >= 1 && numberOfItemsInColumn[column - 1] < NUM_ROWS;
        boolean gameIsOver = getWinner() != Chip.NONE;
        return columnIsAvailable && !gameIsOver;
    }

Sem o método, a condição se pareceria com isso:

if (column <= NUM_COLUMNS
 && column >= 1
 && numberOfItemsInColumn[column - 1] < NUM_ROWS 
 && getWinner() != Chip.NONE)

Nojento, certo? Concordo.


  • Conclusão

o Clean Code não é algo fácil de se adquirir do dia pra noite. É o poder do hábito, aplicando tais conceitos sempre que você ecrever algum código.

Espero que tenha aprendido algo com este artigo, como eu aprendi. Bons estudos!


Vídeos relacionados a CLEAN CODE na PRÁTICA:

Canais: Código Fonte | Rocketseat com Mayk Brito

Recentemente vi a necessidade (acima de deixar o código limpo ou não) de encapsular condicionais em funções separadas quando precisei ter certeza que minha biblioteca de validação tinha 100% de cobertura de código. A única forma de atingir era separando as condicionais em funções.

Então, dessa forma, sugiro acrescentar ao seu texto mais essa vantagem: Tornar o código mais testável.

Clean code deveria ser entendido como uma prática contínua que te livra de maus hábitos. Fazendo uma analogia, é como sempre escrever português certo, com vírgula, ponto, acento, independente se é no WhatsApp ou na prova da escola/faculdade/trabalho. Fazendo o certo sempre, independendo da situação, o fazer certo sai naturalmente, sem esforço nenhum.

Apenas para complementar Kevaosz, SOLID são princípios que reforçam as boas práticas do código limpo. Na minha opinião, são conceitos mais fáceis de entender e aplicar!

O lado ruim (se é que há um lado ruim) é que são princípios desenhados para programação orientada a objeto. Então, para o desenvolvedor frontend react, por exemplo, muitas vezes é díficil perceber o valor desses conceitos, saca?

Esses dias eu achei esse vídeo aqui massa demais. Vale muito a pena pra reforçar a importância https://youtu.be/MSq_DCRxOxw

Bem lembrado `cassiorsfreitas`! os princípios **SOLID** nos ajudam bastante a ter um código mais limpo.

Para complementar o assunto, tem esse exelente site aqui: https://refactoring.guru/refactoring/what-is-refactoring

Essa parte de clean code não está traduzida, mas tem coisas lá super interessantes em PT-BR

acabei de comprar o livro, espero q seja um bom investimento

Ai simmm, show! Com certeza vai ser um baita investimento.

Também trabalho com programação, porém diferente das linguagens como C, C++, python, etc... Eu utilizo a linguagem Ladder para programação de CLPs. Apesar disso, seu post me inspirou a utilizar os princípios do Clean Code dentro da linguagem Ladder e tenho certeza que fazendo isso posso mudar para muito melhor a forma como eu e outras pessoas entenderão os programas a partir de agora.

Muito obrigado por compartilhar!

E funções simples assim, o que acham? To começando no JS

let avg = (a) => {
    let b = 0;
    for(c of a) b += c
    return b / a.length
}

Retorna a média de um array

Variáveis com nomes assim: **a, b, c, x, y, z** Não recomendo nenhum pouco, fica muito confuso o código. Se você manda isso pra alguém do nada, você acha que alguém vai entender pra que serve essas variáveis? **("avg", "a,b,c")** Recomendo você dar uma refatorada ai, vai ficar até mais fácil pra você. Dê uma olhada no **tópico 1** do artigo acima.
Eu faria algo assim: ```ts const list = [0, 1, 2, 3]; const sum = (list) => list.reduce((a, b) => a + b, 0); const average = (list) => (sum(list) / list.length) || 0; console.log(average(list)); // 1.5 ```

Para desenvolvedores que estão começando, como eu, é muito importante já iniciar aplicando essas boas práticas de programação. É muito mais fácil aprender da forma correta do que corrigir más práticas de programação.

Olhei esse post e pensei que poderia ter uma ferramenta/entensão que olha nosso código e nos diz se há erros de convenções.

Tem algumas como o Sonar que faz checagem de código.

Clean Code, é essencial para um bom desenvolvimento e quando se está em time é indispensável! Muito bom!

Faço algumas automacoes em JS e uso muito essa forma de nomear variáveis, nada desconexo do que estamos escrevendo, muito bom!

Opa, fiquei curioso quanto as automações em JS, pode dar uma exemplificada? Também trabalho com isso KKKKK

Muito bom! Simples e objetivo.

O mundo da programação seria melhor se todos aplicassem as praticas do clean code. Particularmente fico perdido num código desorganizado. A nomenclatura adequada no código pode poupar tempo e ajudar na manutenção. Código legado mal escrito é uma tortura para manipular. Por tempos melhores rs

Excelente, muito prático e objetivo.

Deu uma resumida absurda e eficiente do que se trata o livro do Tio Bob. Falou pouco, mas falou bonito. Muito bom!

Realmente é muito importante o clean code e importante começar o mais rapido possivel para se adptar a escrever códigos limpos

Clean Code em 5 minutos!

Imagino que todos os programadores que já trabalharam com uma equipe, tenham passado por uma ou duas situações de um código "sujo", ou simplesmente um serviço/API mal documentada.

Lembro até hoje uma função de uma biblioteca que usei, onde os parametros eram literalmente (a, b, c, d, e)

Sim, passei uns bons 30 minutos testando para descobrir o que cada um dos parâmetros faziam.

Muito bom a forma simples e direta como os conceitos foram apresentados, muito massa, a partir de hoje vou passar a estudar com toda certeza, thanks bro!

Muito bom mesmo, adorei as dicas!

Caramba, que tópico necessário! Tenho muitos problemas com Clean Code ainda, por ser um iniciante na área, ainda engatinhando kkkkkkkk Algo que me tira o sono direto é que eu me sinto um pouco paranóico de vez em quando, com relação a todo essa coisa de boas práticas/convenções. As vezes escrevo uma linha de código e passo meia hora me questionando se aquilo tá certo, se tá dentro das convenções da comunidade, sabe? Acho que falar de clean code é essencial, mas com moderação, como tudo na vida rsrsrs

Eai `jamesislan`, tranquilo? Se você ainda é iniciate, não fique preocupado em escrever códigos tão limpos, e sim em fazer ele **funcionar!** No artigo eu coloquei apenas alguns conceitos e exemplos simples, para que qualquer iniciante possa entender. A medida que você for evoluindo, busque conceitos mais complexos e aplique no seus códigos. Bons estudos!
Tudo ótimo `Kevaosz`, aliás, obrigado pela resposta! Concordo contigo, acho que é uma coisa um pouco inevitável de acontecer por estarmos sendo bombardeados de informação o tempo todo. E talvez eu também tenha um perfeccionismo com relação a essas coisas. Papo de sistemático hahahah, mas são coisas a se melhorar com o tempo. Valeu!!
> Se você ainda é iniciate, não fique preocupado em escrever códigos tão limpos, e sim em fazer ele funcionar! Kevaosz, só confirmando, então é melhor, **inicialmente**, primeiro fazer um código funcionar e depois vir corrigindo o clean code?

Uma dúvida: deve-se encapsular a condicional em função mesmo que ela seja usada apenas uma vez no código?

Se isso melhorar a legibilidade, sim.
Desculpe insistir, mas se a legibilidade melhora em função do nome da função - `isValidInsertion` -, não seria o caso de manter a condicional e apenas acrescer um comentário acima dela, do tipo "#checking if insertion is valid"? Pergunto porque encapsulando a condicional em uma função que é usada uma única vez, não há qualquer relevância para fins de DRY e, na leitura do código, você acaba, nessa parte, tendo que sair para encontrar a função se quiser verificar a condicional.
Você está focando apenas no princípio DRY (Don't Repeat Yourself), e realmente não há relevância no DRY ao criar uma função usada apenas uma vez. Mas pensa que existem outros princípios que são atendidos ao criar essa função. Se for algo que claramente pode ser reusado futuramente, você está facilitando o trabalho de manutenção do código. E como eu disse, boa legibilidade é um princípio super relevante. Só quem leu um código mau escrito por alguém sabe a dor de cabeça e o tempo gasto pra mexer em qualquer coisa nesse código. E incluir comentários explicando o código quase nunca é uma boa ideia. Os próprios nomes de variáveis e funções devem ser autoexplicativos sobre o que eles fazem. E esse é o ponto de criar uma função: o nome dela vai descrever exatamente o que ela faz, e isso vai te economizar uma linha de comentário, e um dev que ler seu código vai te agradecer pela facilidade na compreensão.
Ok, entendi seu ponto. Obrigado pela ajuda.
Não só outro dev irá te agradecer pela facilidade na compreensão, você mesmo fará isso quando precisar revisitar esse código depois de um tempo, pois por incrível que pareça, as vezes a gente não faz ideia da nossa linha de raciocínio de outrora.

[Salvando] Massa mano, é algo que to estudando bastante.

Acho que uma boa prática que todos deveriam utilizar são as normas que são utilizadas em sua respectiva linguagem, por exemplo eu desenvolvo em PHP, é essencial que eu leve em conta as famosas PSR's, são muitas? sim, são 20 aceitas até hoje, mas não é obrigatório decorar todas, apenas se adequar a elas com o tempo desenvolvendo. Segue link do site oficial das PSR's: https://www.php-fig.org/psr/

Simples, objetivo, e muito preciso. Que esse post seja uma campanha. Rsrs :D

Adiciono que a melhor pratica de todas é: sempre documente seu código.... prática negligenciada por muitos

Muito bom, sempre gosto de aprender sobre esse tema para melhorar cada vez mais meu código!

Obg por postar isso, eu nunca li esse livro, mas por causa da sua postagem, já fico querendo ler hehehe.

Parabéns pelo conteúdo! Eu gostaria de colocar a seguinte dúvida:

  • Existe um princípio onde criamos classes de domínio usando construtores, e até métodos para representar alguma regra de negócio, isso também faz parte do clean code ?

Muito bom o texto, é sempre bom ver conceitos de Clean Code na prática por aí. Nós programadores somos todos(as) escritores(as) e devemos sim nos importar com quem está lendo o nosso código, nesse caso, outros programadores. Escrever código entendível para máquinas é fácil, díficil mesmo é escrever código para que seres humanos possam entender, acredito que isso é o propósito em essência do Clean Code.

Parabéns pelo conteúdo.