Você ainda não é assinante?

Muitas vezes, principalmente quando temos pouca experiência, escrevemos códigos que atendem seu objetivo mas não estão bem escritos. Apesar de isso normalmente resolver o problema rapidamente, a manutenção desse código acaba sendo prejudicada.

Para evitar certos problemas comuns é importante seguir boas práticas ao escrever código. Nesse DevCast apresentaremos e analisaremos alguns problemas frequentes (más práticas) e como evitá-los.

Problemas comuns

Um bom código não é apenas aquele que funciona/atende seu objetivo. Escrever um bom código envolve desde manter uma boa estética (espaçamento, uso de letras maiúsculas e minúsculas, quebras de linha, etc) até seguir boas práticas para torná-lo mais eficiente e fácil de ler.

Aqui analisamos alguns problemas comuns que encontramos em códigos e sugestões de como corrigi-los.

Indentação

Indentação é o espaçamento aplicado no início das linhas de código que ajuda a manter uma hierarquia visual. Na maioria das linguagens esse não é um elemento que impede o código de ser compilado, mas manter o código indentado é fundamental para facilitar sua leitura.

Abaixo temos um exemplo de código mal indentado. Note que todas as linhas estão "coladas" do lado esquerdo, dificultando a identificação dos blocos lógicos.


<?php
if ($nota >= 7) {
echo "Você foi aprovado!";
} else { if ($nota > 3) {
echo "Você precisa fazer prova final!";
} else {
echo "Você foi reprovado!";
}
}

A seguir temos uma proposta de melhoria na indentação desse código. Observe como fica mais fácil de ler e identificar qual linha pertence a qual bloco:


<?php
if ($nota >= 7)
{
  echo "Você foi aprovado!";
}
else
{
  if ($nota > 3)
  {
    echo "Você precisa fazer prova final!";
  }
  else
  {
    echo "Você foi reprovado!";
  }
}

Longas listas de parâmetros

Como o nome sugere, esse é um problema que ocorre quando temos métodos esperando um número grande de parâmetros. Normalmente isso também indica outro problema chamado "Obsessão primitiva", que é a tendência por usar sempre tipos primitivos ao invés de classes. Observe abaixo um exemplo de método com essa característica:


public function salvar($valor,$nomeProduto,$nomeCliente,
    $valorDesconto,$valorComissao,$telCliente,
    $enderecoCliente,$nomeVendedor,$idProduto,$quantidade){

}

Essa grande quantidade de parâmetros pode ser agrupada em classes, como vemos abaixo:


public function salvar(Venda $Venda,Cliente $Cliente){

}

Nomes ruins

A nomenclatura dos métodos, classes e variáveis é fundamental para manter o código legível e facilitar sua utilização e manutenção. Aqui a dica é usar sempre nomes objetivos, que indiquem exatamente o que aquele código faz. Veja abaixo um exemplo nomenclatura ruim, tanto no método quanto nos seus parâmetros.


function processaDadosClienteAtendimentoExternoEInternoComDesconto($nC,$telC){
}

Agora analise uma proposta de melhoria para esse caso:


function processaDadosCliente($nomeCliente,$telefoneCliente){       
}

Números mágicos

Números mágicos são constantes numéricas usadas no código de forma que à primeira vista não é fácil identificar seu significado. Esse problema também ocorre com textos (strings mágicas) e normalmente é usado para definir validações de dados a partir de regras fixas. Por exemplo, veja abaixo o uso do número 12 na validação da venda:


class Venda{
    public function finalizar()
    {
        if($this->numeroParcelas <= 12){
            //finalizar compra
        } else {
            throw new Exception("Erro ao finalizar venda");
        }
    }
}

Perceba que lendo esse código o número 12 não deixa claro o que ele indica. Para melhorar esse trecho poderíamos criar uma constante com um nome claro indicando que se trata, na verdade, do número máximo de parcelar permitido para a venda:


<?php 
class Venda{
    const NUMERO_MAXIMO_PARCELAS = 12;

    public function finalizar()
    {
        if($this->numeroParcelas <= NUMERO_MAXIMO_PARCELAS){
            //finalizar compra
        } else {
            throw new Exception("Erro ao finalizar venda: O número de parcelas é
                maior que o permitido (".NUMERO_MAXIMO_PARCELAS.")");
        }
    }
}

Aqui também é possível notar uma melhoria na mensagem de erro. Antes a mensagem não era clara o bastante e após a correção ela indica exatamente o problema que ocorreu.

Repetição de código

Repetir o código é um problema que ocorre com frequência. Sua correção normalmente envolve utilizar classes e métodos para centralizar os blocos de código que se repetem. Por exemplo, veja que na classe abaixo a variável $path é definida em todos os métodos, apontando para o diretório de upload dos arquivos. Caso esse diretório mude, será necessário alterar esse caminho em todos os locais em que ele foi referenciado.


class Upload{
    public function enviarImagem($file){
        $path = __DIR__ . "/public/imagem";
        $this->salvar($path,$file);
    }

    public function enviarDoc($file){
        $path = __DIR__ . "/public/doc";
        $this->salvar($path,$file);
    }

    public function enviarVideo($file){
        $path = __DIR__ . "/public/video";
        $this->salvar($path,$file);
    }
}

Nesse caso o código que se repete e pode dificultar a manutenção é a definição do caminho de upload dos arquivos. Para enviar essa repetição podemos centralizar a definição desse path em uma classe e se for necessário mudar esse caminho, basta mudarmos o caminho nessa classe:


class Upload {
    public function enviarImagem($file) {
        $this->salvar(Path::getFullPath("imagem"),$file);
    }

    public function enviarDoc($file) {
        $this->salvar(Path::getFullPath("doc"),$file);
    }

    public function enviarVideo($file) {
        $this->salvar(Path::getFullPath("video"),$file);
    }
}

Agora usamos a classe Path para ober o caminho de upload.

Dicas de estudo

Como bons programadores precisamos estar sempre estudando e nos atualizando, certo? Para lhe ajudar nesse processo deixamos abaixo algumas sugestões de livros que acreditamos que vão lhe ajudar a escrever melhores códigos e aprimorar suas técnicas de programação

  • Clean Code. Do autor Robert C. Martin, também conhecido como "Uncle Bob".
  • Code Complete. Do autor Steve McConnel.
  • The Pragmatic Programmer. Dos autores Andrew Hunt e Dave Thomas.
[/conteudo-mvp]