Existem vários padrões para solucionar diversos problemas em diferentes cenários. Você deve estar se perguntando: “Ok, e dai? Isso eu já sabia!”. Ok, ok. Então vamos direto ao assunto.
Para um melhor entendimento sobre padrões de projeto, é necessário ter um sólido conhecimento sobre Orientação e Objetos, e a essência pra quem deseja desenvolver uma aplicação Orientada a Objetos é conhecer os Princípios de Projeto Orientado a Objetos, a base para criação de diversos Padrões de Projeto, princípios básicos que devemos seguir para termos uma aplicação robusta, organizada, flexível e reutilizável.
Existem cinco princípio que são apresentados como S.O.L.I.D, que são eles:
- SRP – Single reponsibility principle – Princípio da Responsabilidade Única;
- OCP – Open/closed principle – Princípio do Aberto e Fechado;
- LSP – Liskov substitution principle – Princípio da Substituição de Liskov;
- ISP – Interface segregation principle – Princípio da Segregação de Interface;
- DIP – Dependency inversion principle – Princípio da Inversão de Dependência;
SPR – Single responbilility principle – Princípio da Responsabilidade Única
- Uma classe deve ter uma e apenas uma responsabilidade OU
- Uma classe deve ter apenas um motivo para mudar.
Vamos supor que lhe foi solicitado a criação de um componente que deverá enviar um Cartão de Feliz Aniversário a todos os clientes aniversariantes do mês, pra isso, a ferramenta de CRM da empresa disponibiliza os aniversariantes do mês em um documento XML a partir da url: http://crm.empresa.com.br/aniversariantes.xml
Modelo do XML
Já possuindo as informações necessárias para desenvolver nosso componente, vamos elaborar o primeiro modelo preliminar.
Modelo preliminar 1
Classes Client, BirthdayCard e TriggerCards
Bom, criamos uma classe Client para representar o cliente, criamos a classe BirthdayCard para representar o cartão de aniversário e por fim a classe TriggerCards que irá disparar os cartões por e-mail, nosso componente já estaria teoricamente pronto para ser colocado em produção, afinal, ele já envia o cartão de aniversário perfeitamente para o cliente aniversariante, mas vamos analisar com calma.
Analisando nossas classes utilizando a definição do SRP que é: Uma classe deve ter uma e apenas uma responsabilidade, podemos enxergar claramente que a nossa classe TriggerCards, ela está sendo responsável em obter os clientes aniversariantes do arquivo XML pelo método loadClients() e está responsável em enviar os cartões por e-mail pelo método sendCard()!
Acabamos de identificar a violação do princípio SRP! Perceba que a classe TriggerCards possui mais que uma responsabilidade. Vamos imaginar a adição do seguinte requisito ao componente.
Foi solicitado também que o componente criado, possa obter os dados no formato JSON que será disponibilizado por uma empresa parceira e que utilizará o mesmo componente.
E agora? Como vamos poder reutilizar esse componente adicionando essa nova funcionalidade com esse modelo que fizemos? Ou seja, obter os clientes a partir de um JSON? Essa classe está violando também outro principio, o OCP que será abordado no próximo artigo.
Bom, vamos remodelar essa solução aplicando o principio SRP, tornando a classe TriggerCards com uma única responsabilidade e adicionar a leitura de clientes a partir de um documento JSON.
Modelo preliminar 2
Classes TriggerCards , LoadClientsAbstract, LoadClientsXml e LoadClientsJSON
Veja que para solucionar o problema da classe TriggerCards, criamos uma classe abstrata LoadClientsAbstract que será referência para criarmos as classes concretas LoadClientsXML, LoadClientsJSON ou qualquer outro formato que possa vir ser adicionado. Refatoramos também a classe TriggersCards, deixando-a com uma única responsabilidade que é enviar os cartões por e-mail, tornando assim nosso componente flexível e reutilizável seguindo o principio SRP.
Espero que tenha ficado claro como identificar e como aplicar o princípio SRP.
No próximo artigo irei falar sobre o princípio OCP – Open/closed principle.
Referências
- http://en.wikipedia.org/wiki/Single_responsibility_principle
- http://www.objectmentor.com/resources/articles/srp.pdf
- http://thegodclass.tumblr.com/day/2011/09/03
- http://en.wikipedia.org/wiki/SOLID_(object-oriented_design)
[Webinsider]
…………………………
Leia também:
- Conselhos para o desenvolvedor
- Linguagens de programação, qual devo escolher?
- Como gerenciar o escopo em métodos ágeis?
…………………………
Acesse a iStockphoto. O maior banco de imagens royalty free do mundo.