Voltar

São Paulo, Brasil

Boas práticas de programação

6 min de leitura

Descubra a importância de um código legível e organizado para o trabalho em equipe e manutenção posterior do software. Melhore suas práticas de programação.

Geral

logo-stg-icon-resized.png

Stage Consulting

Consulting


Compartilhe

Resumo

  • A qualidade do código é essencial para a eficiência do trabalho em equipe e manutenção a longo prazo do software.
  • O código legível facilita a colaboração e revisões em equipe, simplifica a manutenção e atualização, além de promover uma comunicação eficiente.
  • Utilização de nomes claros para variáveis, comentários explicativos e escolhas inteligentes na estrutura de dados.

Por que deixar o código bonito?

Bons programadores sabem que escrever código não é apenas uma tarefa mecânica para fazer um programa funcionar corretamente. Na verdade, a qualidade do código é essencial para garantir a eficiência do trabalho em equipe e a manutenção do software ao longo do tempo.

Portanto, é fundamental seguir boas práticas de programação, focadas em tornar o código mais legível, organizado e compreensível para outros programadores que podem estar trabalhando no mesmo projeto. Confira a seguir uma lista de práticas que podem facilitar o dia a dia durante o desenvolvimento do código.

Colaboração e revisões

Ao desenvolver um software, é comum trabalhar em equipe. Diversos desenvolvedores podem estar envolvidos no mesmo projeto, e o código precisa ser compreensível para todos eles. A legibilidade é crucial para facilitar a colaboração, uma vez que colegas de equipe precisarão revisar, modificar e melhorar o código escrito por outros. Um código bem escrito reduz a probabilidade de erros serem introduzidos durante as alterações, economizando tempo e esforço da equipe.

Manutenção e evolução do software

O ciclo de vida de um software não termina com sua primeira versão. Ao longo do tempo, novas funcionalidades serão adicionadas, bugs serão corrigidos e adaptações serão feitas para atender a novos requisitos. Um código claro e organizado simplifica essa manutenção contínua. Quando um programador precisa voltar a um trecho de código após meses ou anos, a legibilidade dele permite entender rapidamente a lógica empregada, acelerando o processo de atualização.

Comunicação eficiente

Além das revisões em equipe, os desenvolvedores frequentemente precisam discutir o código entre si. Quando o código é bem escrito, as discussões técnicas se tornam mais fáceis, já que a clareza na expressão das ideias facilita a troca de conhecimento e a solução de problemas. Código mal estruturado e confuso pode levar a mal-entendidos e atrasar o progresso do projeto.

Padrões de codificação

Seguir boas práticas de programação ajuda a estabelecer padrões de codificação no projeto. Isso torna o código consistente em todo o software, o que facilita a identificação de erros e a compreensão global da arquitetura do programa.

Legibilidade e eficiência

Embora o computador possa executar código não otimizado ou confuso, é essencial lembrar que os programas são feitos para serem lidos e compreendidos por seres humanos. Um código bem escrito pode ajudar a identificar possíveis gargalos de desempenho e melhorar a eficiência do programa como um todo.

Investir tempo e esforço em escrever código de forma legível e organizada é um investimento valioso para a equipe de desenvolvimento. Lembre-se de que um código bonito não é apenas sobre estética, mas sobre garantir que a inteligência humana possa facilmente compreender e aprimorar o que foi criado.

Na prática

Vamos estudar as possibilidades de melhora em uma aplicação prática: um cronômetro para partidas de xadrez. Teremos dois relógios, acionados de forma alternada, exibindo o tempo restante de cada jogador para decidir sua jogada. Uma vez que o tempo de um jogador acaba, a vitória é do seu adversário, independentemente da disposição das peças.

praticas-de-programacao.jpg

Vamos programar nossa aplicação usando React, uma biblioteca baseada em Javascript que facilita a customização e componentização de elementos gráficos . Porém, as dicas aqui também são "language-agnostic", podendo ser aplicadas em outros ambientes e linguagens.

(<h1>, <img>, <div>)

Todos no meu time vão entender o que essa função faz!

Um mito promovido pela falsa confiança! Nem todos os programadores pensam igual, e o nosso próprio modo de pensar muda com o tempo. Variáveis e funções devem ser sempre claras em seu funcionamento. Um nome comprido é preferível a um curto, bonito, e que não diz nada sobre sua utilidade!

const [ whiteTimer, setWhiteTimer ] = useState(TOTAL_TIME)

O que a variável "whiteTimer" guarda? A função de timer do jogador branco? O seu tempo restante? Um objeto com várias propriedades?

Vendo pela declaração, ela guarda o tempo restante. Então, por que não deixar essa informação destacada? Confira abaixo.

const [ remainingTimeWhite, setRemainingTimeWhite ] = useState(TOTAL_TIME)

Outro exemplo:

const [ turn, setTurn ] = useState("white") //in chess, white always starts

Como controlar de quem é a vez de jogar? Usando uma string? Quais são os valores disponíveis?

Veja a nossa sugestão de abordagem abaixo:

const [ isWhiteTurn, setIsWhiteTurn ] = useState(true) //in chess, white always starts

Seguindo o padrão de nomenclatura "isSomething" para variáveis tipo "boolean", todos os programadores conseguem saber quais estados ela pode ter (true / false), e seu significado é obvio: é a vez das peças brancas (ou das pretas). Nomenclaturas padrão agregam valor ao código!

Comentário? Meu código se explica sozinho!

Variáveis bem nomeadas ajudam bastante na clareza do código. Mas às vezes isso não é o bastante. É fácil entender o que essa função faz?

useEffect(() => { 

  const timer = setTimeout(() => { 

    if (isWhiteTimerRunning) { 

      setRemainingTimeWhite(remainingTimeWhite - 1) 

    } 

  }, 1000) 

  if (remainingTimeWhite === 0) {clearTimeout(timer)} 

}) 


Pequenos comentários podem tirar grandes dúvidas. Confira no exemplo.


//White timer 


//dec remainingTime by 1 sec each 1 sec 

useEffect(() => { 

  const timer = setTimeout(() => { 

    if (isWhiteTimerRunning) { 

      setRemainingTimeWhite(remainingTimeWhite - 1)	//dec 1 sec 

    } 

  }, 1000)    //each 1 sec 

  if (remainingTimeWhite === 0) {clearTimeout(timer)} 

}) 

O uso do número "1000" indica que a função deve ser chamada a cada 1000 milisegundos, ou seja, 1 minuto. Sem um comentário claro, ele parece um "número mágico" - expressão usada na programação para definir valores aparentemente arbitrários que resolvem o problema de forma enigmática. 

### Estrutura de dados


Nosso relógio começa com 15 minutos para cada jogador, sendo esse valor decrementado a cada segundo. Como salvar essas variáveis no código?

const [ remainingMinutes, setRemainingMinutes ] = useState(15) 

const [ remainingSeconds, setRemainingSeconds ] = useState(0) 

//Tempo:	14:02 -> 14:01 -> 14:00 -> 13:59 

//observar todas as mudanças no valor "remainingSeconds", 

//e chamar essa função toda vez que "remainingSeconds" for menor que zero 

function resetMinutes() { 

//TODO: 

//resetar "remainingSeconds" para 59; 

//diminuir em 1 o valor de "remainingMinutes"; 

} 


Já que a aplicação terá dois relógios, todo esse código terá que ser duplicado para salvar e acompanhar os minutos e segundos dois jogadores. Nada muito escalável.

Como a diferença entre "minutos" e "segundos" só será usada na parte visual, o código pode salvar o tempo restante como uma quantidade absoluta, e tratar apenas como vamos exibir essa informação:

const TOTAL_TIME = 15 * 60	//15min * 60s/min = 900s 

  const [ remainingTimeWhite, setRemainingTimeWhite ] = useState(TOTAL_TIME) 

  const [ remainingTimeBlack, setRemainingTimeBlack ] = useState(TOTAL_TIME) 

  //60s -> 1:00;   7s -> 0:07 

  function formatTime(time: number) { 

    return `${Math.floor(time / 60)}:${String(time % 60).padStart(2, '0')}` 

  } 

Observe que, exibindo o valor de retorno da função "formatTime", tratamos os casos como os anteriores:

Segundos que passam de "00" para "59"

Valores menores que "10" ganham um zero a esquerda

Fazendo escolhas inteligentes, deixamos o código mais organizado.

Lembrando, um código bem construído ajuda tanto os seus colegas de trabalho quanto você. Siga as boas práticas de programação para ter sempre um produto de qualidade!

logo-stg-icon-resized.png

Stage Consulting

Consulting


Compartilhe

Relacionados

A história da Stage Consulting

5 min de leitura

logo-stg-icon-resized.png

Stage Consulting

Consulting

Geral

Leia também

A história da Stage Consulting

logo-stg-icon-resized.png

Stage Consulting

Consulting

5 min de leitura


100+ projetos concluídos: transformando negócios com uma nova consultoria

logo-stg-icon-resized.png

Stage Consulting

Consulting

5 min de leitura


Boas práticas de programação

logo-stg-icon-resized.png

Stage Consulting

Consulting

6 min de leitura


Entenda o que são os Microsserviços

logo-stg-icon-resized.png

Stage Consulting

Consulting

5 min de leitura


Quebrando passwords com a RTX 4090

Miguel Couto.png

Miguel Couto

Manager

3 min de leitura


Gamificação no trabalho: aumentando o engajamento dos colaboradores

João Tenshin 500x500.png

João Tenshin

UX/UI Designer I

4 min de leitura


4 dicas de UX para UI

logo-stg-icon-resized.png

Stage Consulting

Consulting

4 min de leitura


Como ser o melhor desenvolvedor frontend?

logo-stg-icon-resized.png

Stage Consulting

Consulting

7 min de leitura


Equipamento de $25 hackeou o Starlink

Miguel Couto.png

Miguel Couto

Manager

4 min de leitura


Background Consultoria

O que vamos
construir juntos?

logo-stg-icon-resized.png

Stage Consulting

Consulting

Geral

Compartilhe

HomeStrategyExperienceTeamBlog

Acompanhe nossas mídias sociais


2022 Stage Consulting. Todos os direitos reservados.