Melhorando como Pragramador com princípios SOLID
TL;DR
Defina uma única responsabilidade para as suas classes, isso vai tornar seu cógido mais legível e irá facilitar criação de testes unitários. Refatore suas classes extraindo comportamentos para outras classes e compartilhe esses comportamentos através da composição.
Melhorando como Pragramador com princípios SOLID
Vamos falar de SOLID? WTF? Vamos falar de estado solido da matéria? É sobre química ou desenvolvimento de software que vamos falar? Na verdade SOLID é um termo de desenvolvimento de software elaborado por Robert C. Martin (Uncle Bob) no começo dos anos 2000.
Mas afinal o que é SOLID?
Letra | Princípio |
---|---|
S | Single responsibility |
O | Open/Close |
L | Liskov substitution |
I | Interface segregation |
D | Dependency inversion |
Para não ficar muito pesado hoje vamos falar de sobre o Princípio de Responsabilidade Única.
Single responsibility
O princípio de responsabilidade única segundo Uncle Bob é que uma classe deve fazer apenas uma coisa e muito bem feita, ou seja, ela deve ter apenas uma responsabilidade. Isso também facilita a crição de seus testes, afinal o trabalho daquela classe é muito bem definido, ela tem um proposíto e realizar seus teste unitários ficam bem simples.
Agora vamos ilustrar melhor o cenário. Abaixo temos uma famosa classe sabe tudo.
Esse código pegamos de produção de um nossos serviços da empresa onde trabalho, foram omitidas algumas partes e exagerada em outras para ilustrarmos melhor, no caso o programador teve de fazer vários comentários durante o código para que não ficasse perdido. Isso já pode ser um cheiro que seu código está fazendo mais do que deve.
Repare que esse código sabe desde as configurações de ambiente, informações sobre o relatório, busca, upload e envio de email, ou seja, isso não é nada bom.
O que podemos fazer para esse código ficar melhor
A primeira coisa que devemos fazer é começar a extrair determinados comportamentos para clases mais específicas. Exemplo devemos extrair a busca do relatório, envio para Amazon S3 e envio de e-mail, deixando nosso código mais limpo. Alguns detalhes de implementação vou pular pois nosso objetivo é apenas mostrar como podemos deixar o código mais elegante.
Buscando registros
A primeira coisa que podemos fazer é separar a query do activerecord para um scope.
Gerar CSV
Um próximo passo bem interessante seria separar a classe responsável por gerar o CSV, podemos deixar da seguinte forma:
Upload para Amazon S3
Outra parte que deve ser separada é o upload do relatório, apenas retornando sua URL pública.
Envio de e-mail
Outra tarefa importante é o envio de e-mail
Juntando as partes
Bom agora precisamos de um cara para poder chamar todas as partes necessárias para montar esse relátorio. No caso estamos fazendo um relátorio de pedidos da semana então vamos criar uma classe para isso.
Para utilizar seria apenas
Como pode observar dividimos o código em diversas partes, pense em dividir para conquistar, agora cada parte tem sua responsabilidade bem definida facilitando a legibilidade do código e criação de testes.