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.
Sugestão de conteúdo
Abaixo temos alguns links de conteúdos que lhe ajudarão a escrever cada vez mais códigos de qualidade: