Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors

Melhores práticas de codificação: como escrever um código limpo e legível

Free code on computer screen

Olá leitores, hoje vamos aprender sobre as melhores práticas de codificação e como escrever um código limpo e legível. Ter um código bem estruturado não apenas facilita a compreensão e manutenção do software, mas também melhora a colaboração em equipe e a escalabilidade do projeto. Neste artigo, exploraremos algumas diretrizes essenciais que podem ajudar você a escrever um código de alta qualidade.

  • Escolha de nomes significativos e consistentes: Uma das primeiras coisas a se considerar ao escrever um código limpo é a escolha de nomes adequados para variáveis, funções, classes e outros elementos do código. Opte por nomes que sejam descritivos e representem claramente o propósito do elemento em questão. Evite abreviações confusas e certifique-se de que os nomes sejam consistentes ao longo de todo o código.
def calcular_media(lista_numeros):
    soma = sum(lista_numeros)
    quantidade = len(lista_numeros)
    media = soma / quantidade
    return media
  • Utilize camel case ou pascal case: Camel case e pascal case são convenções de nomenclatura comumente utilizadas em muitas linguagens de programação. O camel case é escrito com a primeira letra minúscula e cada palavra subsequente começa com uma letra maiúscula (por exemplo, minhaVariavel). Já o pascal case começa com uma letra maiúscula e cada palavra subsequente também inicia com uma letra maiúscula (por exemplo, MinhaVariavel). Escolha uma convenção de nomenclatura e siga-a de forma consistente em todo o código.
class Carro:
    def __init__(self, marca, modelo):
        self.marca = marca
        self.modelo = modelo
    
    def acelerar(self):
        print("O carro está acelerando.")
  • Divida o código em funções e classes significativas: Dividir o código em funções e classes pequenas e coesas é uma prática essencial para manter o código limpo e legível. Cada função ou classe deve ter uma responsabilidade clara e executar uma única tarefa. Evite funções ou classes muito extensas, pois isso torna mais difícil entender e depurar o código.

Código Sujo:

def processar_dados():
    # Leitura do arquivo de dados
    arquivo = open("dados.txt", "r")
    linhas = arquivo.readlines()
    arquivo.close()
    
    # Tratamento dos dados
    dados_processados = []
    for linha in linhas:
        partes = linha.strip().split(",")
        nome = partes[0]
        idade = int(partes[1])
        
        if idade >= 18:
            # Cálculo da idade em meses
            idade_meses = idade * 12
            
            # Cálculo do quadrado da idade
            idade_quadrado = idade ** 2
            
            # Adiciona os dados processados à lista
            dados_processados.append((nome, idade_meses, idade_quadrado))
    
    # Ordenação dos dados por idade
    dados_processados.sort(key=lambda x: x[1])
    
    # Impressão dos dados processados
    for dados in dados_processados:
        print(f"Nome: {dados[0]}, Idade em meses: {dados[1]}, Quadrado da Idade: {dados[2]}")

Código limpo:

def ler_arquivo(nome_arquivo):
    arquivo = open(nome_arquivo, "r")
    linhas = arquivo.readlines()
    arquivo.close()
    return linhas

def processar_linha(linha):
    partes = linha.strip().split(",")
    nome = partes[0]
    idade = int(partes[1])
    return nome, idade

def calcular_idade_meses(idade):
    return idade * 12

def calcular_quadrado_idade(idade):
    return idade ** 2

def ordenar_dados(dados):
    return sorted(dados, key=lambda x: x[1])

def imprimir_dados(dados):
    for nome, idade_meses, idade_quadrado in dados:
        print(f"Nome: {nome}, Idade em meses: {idade_meses}, Quadrado da Idade: {idade_quadrado}")

def processar_dados():
    linhas = ler_arquivo("dados.txt")
    
    dados_processados = []
    for linha in linhas:
        nome, idade = processar_linha(linha)
        
        if idade >= 18:
            idade_meses = calcular_idade_meses(idade)
            idade_quadrado = calcular_quadrado_idade(idade)
            dados_processados.append((nome, idade_meses, idade_quadrado))
    
    dados_processados = ordenar_dados(dados_processados)
    
    imprimir_dados(dados_processados)
  • Comente o código quando necessário: Comentários bem colocados podem fornecer insights valiosos sobre o funcionamento do código, especialmente em trechos complexos ou em partes que possam parecer obscuras. No entanto, não exagere nos comentários. Certifique-se de que eles sejam claros, concisos e relevantes, explicando apenas o necessário para facilitar a compreensão do código.
# Implementação do algoritmo de ordenação bubble sort
def bubble_sort(lista):
    # Laço externo para percorrer toda a lista
    for i in range(len(lista)):
        # Laço interno para comparar pares de elementos adjacentes
        for j in range(len(lista) - i - 1):
            if lista[j] > lista[j+1]:
                # Troca os elementos se estiverem fora de ordem
                lista[j], lista[j+1] = lista[j+1], lista[j]
  • Organize o código com indentação e espaçamento: Uma formatação consistente e adequada do código é fundamental para sua legibilidade. Utilize indentação adequada para destacar a estrutura lógica do código e utilize espaços em branco para separar blocos de código relacionados. Isso tornará o código mais claro e facilitará a identificação de erros e a manutenção futura.

Exemplo em JavaScript com uma indentação desorganizada:

function calcularSoma(a, b) {
return a + b;
}

function calcularMedia(listaNumeros) {
let soma = 0;
for (let i = 0; i < listaNumeros.length; i++) {
soma += listaNumeros[i];
}
return soma / listaNumeros.length;
}

function verificarAprovacao(media) {
if (media >= 7) {
console.log("Aprovado!");
} else {
console.log("Reprovado!");
}
}

let numeros = [5, 7, 8, 4, 9];
let soma = calcularSoma(3, 5);
let media = calcularMedia(numeros);
verificarAprovacao(media);

Agora, aqui está o mesmo código com uma indentação correta:

function calcularSoma(a, b) {
return a + b;
}

function calcularMedia(listaNumeros) {
let soma = 0;
for (let i = 0; i < listaNumeros.length; i++) {
soma += listaNumeros[i];
}
return soma / listaNumeros.length;
}

function verificarAprovacao(media) {
if (media >= 7) {
console.log("Aprovado!");
} else {
console.log("Reprovado!");
}
}

let numeros = [5, 7, 8, 4, 9];
let soma = calcularSoma(3, 5);
let media = calcularMedia(numeros);
verificarAprovacao(media);
  • Evite duplicação de código: A duplicação de código é um problema comum que pode levar a inconsistências e dificuldades na manutenção do código. Sempre que possível, procure agrupar trechos de código semelhantes em funções ou métodos reutilizáveis. Isso não apenas reduzirá a redundância, mas também facilitará a aplicação de correções e melhorias.

Maneira errada:

# Função para calcular o preço total de uma compra
def calcular_preco_total(produto1_quantidade, produto1_preco, produto2_quantidade, produto2_preco):
    subtotal_produto1 = produto1_quantidade * produto1_preco
    subtotal_produto2 = produto2_quantidade * produto2_preco
    preco_total = subtotal_produto1 + subtotal_produto2
    return preco_total

# Uso da função
produto1_quantidade = 2
produto1_preco = 10.99
produto2_quantidade = 3
produto2_preco = 5.99
total = calcular_preco_total(produto1_quantidade, produto1_preco, produto2_quantidade, produto2_preco)

Maneira correta:

# Função para calcular o subtotal de um produto
def calcular_subtotal(quantidade, preco):
    return quantidade * preco

# Função para calcular o preço total de uma compra
def calcular_preco_total(produtos):
    subtotal = 0
    for produto in produtos:
        subtotal += calcular_subtotal(produto['quantidade'], produto['preco'])
    return subtotal

# Uso das funções
produtos = [
    {'quantidade': 2, 'preco': 10.99},
    {'quantidade': 3, 'preco': 5.99}
]
total = calcular_preco_total(produtos)
  • Utilize constantes ou enumerações para valores mágicos: Evite usar valores literais diretamente no código sem uma explicação clara do seu significado. Em vez disso, atribua esses valores a constantes com nomes descritivos ou utilize enumerações, tornando o código mais legível e facilitando a manutenção.

Exemplo errado:

def calcular_preco_final(preco_unitario, quantidade):
    total = preco_unitario * quantidade * 1.08
    return total

Exemplo correto:

TAXA_IMPOSTO = 1.08

def calcular_preco_final(preco_unitario, quantidade):
    total = preco_unitario * quantidade * TAXA_IMPOSTO
    return total
  • Utilize tratamento de erros adequado: Sempre trate e reporte os erros de forma apropriada. Utilize blocos try-except para capturar exceções e trate-as de acordo com a situação. Isso ajuda a identificar e lidar com problemas no código de forma mais robusta e evita a quebra do programa.

Exemplo errado:

lista = [1, 2, 3]
print(lista[5])

Exemplo correto:

lista = [1, 2, 3]
try:
    print(lista[5])
except IndexError:
    print("Erro: Índice inválido")
  • Realize testes de unidade: Os testes de unidade são essenciais para garantir que o código funcione corretamente e continue funcionando conforme você realiza alterações. Escreva testes de unidade para validar o comportamento esperado das funções e classes e verifique se eles são executados com êxito. Isso ajuda a identificar problemas antes que eles se tornem bugs em produção.

Maneira errada:

# Função para calcular a média de uma lista de números
def calcular_media(lista_numeros):
    soma = sum(lista_numeros)
    media = soma / len(lista_numeros)
    return media

# Teste de unidade
lista = [5, 7, 8, 4, 9]
media_calculada = calcular_media(lista)
if media_calculada == 6.6:
    print("Teste passou!")
else:
    print("Teste falhou!")

Nessa maneira errada, o teste de unidade é realizado manualmente ao comparar o resultado da função calcular_media com um valor esperado. No entanto, esse método não é escalável e não é adequado para casos mais complexos. Além disso, se houver uma falha no teste, pode ser difícil identificar qual parte do código está com problema.

Maneira correta:

import unittest

# Função para calcular a média de uma lista de números
def calcular_media(lista_numeros):
    soma = sum(lista_numeros)
    media = soma / len(lista_numeros)
    return media

# Classe de teste de unidade
class TestCalcularMedia(unittest.TestCase):
    def test_media_lista(self):
        lista = [5, 7, 8, 4, 9]
        media_calculada = calcular_media(lista)
        self.assertAlmostEqual(media_calculada, 6.6)

if __name__ == '__main__':
    unittest.main()

Nessa maneira correta, utilizamos o módulo unittest para criar uma classe de teste de unidade chamada TestCalcularMedia. Dentro dessa classe, definimos um método de teste chamado test_media_lista. Dentro desse método, definimos uma lista de números e chamamos a função calcular_media para obter a média calculada. Em seguida, utilizamos o método assertAlmostEqual para verificar se a média calculada é aproximadamente igual ao valor esperado (6.6). Se o teste falhar, o módulo unittest irá indicar qual parte do código causou o problema.

Agora, vamos discutir por que é importante implantar testes de unidade através do código:

  1. Garantir a funcionalidade correta: Os testes de unidade permitem verificar se as funções e classes estão funcionando conforme o esperado. Eles ajudam a identificar problemas ou erros no código antes de serem implantados em um ambiente de produção.
  2. Facilitar a identificação de bugs: Com testes de unidade, é mais fácil identificar e isolar bugs ou erros específicos em funções ou classes. Os testes fornecem uma maneira estruturada de validar o comportamento esperado e verificar se as alterações no código não introduziram problemas adicionais.
  3. Simplificar a manutenção e refatoração: Ao ter testes de unidade, você pode fazer alterações no código com mais confiança. Os testes servem como salvaguarda para garantir que as alterações não causem regressões ou quebras de funcionalidade. Eles fornecem uma base sólida para refatoração do código, permitindo que você faça melhorias sem medo de introduzir problemas.
  4. Promover a documentação viva do código: Os testes de unidade servem como documentação viva do comportamento esperado das funções e classes. Eles fornecem exemplos claros de uso e validação dos resultados. Isso é especialmente útil quando outros desenvolvedores trabalham no código ou quando você volta a trabalhar em um código após um longo período de tempo.

Em resumo, implantar testes de unidade através do código é fundamental para garantir a qualidade do software, identificar problemas precocemente e facilitar a manutenção e refatoração do código.

Agora, aqui está o mesmo código com uma indentação correta:Seguindo essas melhores práticas de codificação, você estará no caminho certo para escrever um código limpo, legível e de alta qualidade. Lembre-se de que a clareza e a manutenibilidade do código são tão importantes quanto sua funcionalidade. Ao adotar essas diretrizes, você estará facilitando o trabalho de você mesmo e de outros desenvolvedores envolvidos no projeto.

Espero que este artigo tenha sido útil para você. Se você tiver mais dicas ou práticas que gostaria de compartilhar, sinta-se à vontade para deixar seus comentários abaixo. Boa codificação!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para cima