Recentemente retomei a leitura do livro Código limpo de Robert C. Martin e vou compartilhar por aqui algumas boas práticas sobre como criar e manter seu código limpo. Pra começar vou explicar a importância de criar um código de forma limpa. Muitos programadores tem o "dom" de enquanto está criando seu código alterar sua forma de programar, às vezes por estar saturado de fazer uma coisa de um jeito ou mesmo porque pesquisando por aí viu que tem uma forma mais fácil de resolver o mesmo problema e o faz. No entanto o trecho de código escrito anteriormente (de forma "errada") permanece, pois afinal de contas, tá funcionando não tá? Pois bem manter o código limpo significa escrever o mesmo de forma legível, mas legível pra quem, se eu quem estou criando esse "troço"? Legível pra programadores, incluíndo você! Pense na seguinte situação: Você atendeu um cliente que queria um e-commerce, você o fez, não se importou se o código ficou legível ou não, afinal de contas tinha prazo pra entregar o e-commerce. Até aqui tudo bem! Agora pense o que aconteceria se 5 meses depois da finalização o cliente resolve fazer um upgrade no sistema e adicionar um novo método de pagamento ou entrega. Você começa a ver seus códigos de meses atrás e tenta entender o que está se passando, em que momento o produto é adicionado ao carrinho, em que momento é obtido seu peso para cálculo do frete e em que momento no código ocorre a soma do valor unitário x quantidade + frete x quantidade e é enviado para o método de pagamento. Este processo é relativamente simples em sua definição, mas mesmo com essa simplicidade pode lhe demandar algumas horas de leitura em seu código escrito de forma não tão clara.
function dadosE($string)
??? É bem obscura sua real funcionalidade. Agora se essa mesma função for escrita assim: function obterDadosClientePorEmail($emailCliente)
você consegue entender facilmente que esta função serve para que no momento em que você fornecer o email do cliente obter como resposta todos os dados dele, esta mesma função pode ser aplicada no caso de um login.
- Nomeie sempre as funções com verbos (obter, salvar, consultar) pois elas fazem "coisas" pra você.
- Funções devem executar apenas uma coisa, se ela faz mais de uma não é código limpo. Por exemplo: para realizar o login são necessaárias no mínimo 3 funções com o seguinte ciclo: 1 -> receber os dados, 2 -> comparar os dados recebidos, 3 -> gravar os dados de acesso (data e hora), 1 -> retornar informando que o login ocorreu com sucesso para que possa ser redirecionado para a página requisitada.
Parece complicado separar tudo não? Não! Eu já separei meus logins dessa forma e garanto que fica muito mais fácil de você entender seu código pois você sabe exatamente o que está sendo feito e onde, o contrário de uma programação com código não limpo em que você olha a função login e não sabe exatamente onde está comparando a senha digitada pelo usuário e a senha retornada do banco de dados, onde está sendo inicializada a sessão, onde está sendo gravado a data e hora do último acesso do usuário, onde está retornando se houve sucesso ou falha no login e nem onde está o redirecionamento. Você não entenderia esta última situação porque todas as 4 ações (receber, comparar, gravar e redirecionar) estão aninhadas dentro de uma única função.
3 - Funções com poucos parâmetros de entrada: A coisa mais tensa que existe é você integrar com alguma API de pagamentos por exemplo e ter que chamar uma função mais ou menos assim:
ufa! Cansa né!!!
No livro recomenda o uso de no máximo 3 parâmetros de entrada, seria maravilhoso se os desenvolvedores de gateways de pagamento lessem o mesmo livro que estou lendo, facilitaria muito a vida dos programadores.
Vamos mostrar agora como ficaria muito mais fácil de entender se resumirmos a apenas 3 parâmetros, vou transformar os parâmetros de entrada em array pra vocês verem como fica muito mais fácil de você entender e não se confundir quando chamar a função:
Muito mais fácil de entender não acham??? Veja bem, basta lembrar que o 1º parâmetro são as credenciais do vendedor (site), o 2º do comprador e o 3º da compra. Moleza, pena que eles não pensam assim!
E sabia que dar pra ficar mais simples ainda?! Daria pra trabalhar com objetos concretos para passar nos parâmetros, exemplo:
$vendedor = new Vendedor(...); $comprador = new Comprador(...); $compra = new Compra(...); $NomeApiPagamento->criaRequisicao($vendedor, $comprador, $compra);4 - Variáveis com nome significativos: o que o trecho de código abaixo faz?
Tá um pouco estranho né??? E se eu te disser que supomos que seja sobre um jogo de tabuleiro estilo campo minado onde se o valor for igual a 4 é sinal que o campo recebeu uma bandeira? Ficou um pouco mais fácil não? Olhe o mesmo código com nomes mais expressivos.
Detalhe: estes trechos de código são somente simulações, possivelmente você não o faria desta forma. Segui o exemplo do livro (em Java) traduzindo-o para PHP.
Viu só o que os nomes de variáveis, classes e funções são capaz de fazer? Com certeza o código de baixo você entende o que está se passando, enquanto no de cima tem que imaginar ou testar.
Bem, por hoje é só, estarei criando outros posts à medida que eu estiver lendo o livro. O conteúdo deste post foi um resumo básico dos 3 primeiros capítulos, ainda temos muito a aprender sobre um bom código!
Até mais!!!