Princípios de Projeto Orientado a Objetos – SRP

Share on facebook
Share on twitter
Share on linkedin
Share on whatsapp
Share on telegram
Share on pocket

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:

  1. SRP – Single reponsibility principle – Princípio da Responsabilidade Única;
  2. OCP – Open/closed principle – Princípio do Aberto e Fechado;
  3. LSP – Liskov substitution principle – Princípio da Substituição de Liskov;
  4. ISP – Interface segregation principle – Princípio da Segregação de Interface;
  5. 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

modelo

Classes Client, BirthdayCard e TriggerCards

classes2

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

modelo pre

Classes TriggerCards , LoadClientsAbstract, LoadClientsXml e LoadClientsJSON

triggercards

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

  1. http://en.wikipedia.org/wiki/Single_responsibility_principle
  2. http://www.objectmentor.com/resources/articles/srp.pdf
  3. http://thegodclass.tumblr.com/day/2011/09/03
  4. http://en.wikipedia.org/wiki/SOLID_(object-oriented_design)

[Webinsider]

…………………………

Leia também:

…………………………

Acesse a iStockphoto. O maior banco de imagens royalty free do mundo.

Acompanhe o Webinsider no Twitter e no Facebook.

Avatar de Italo Domingues

Italo Domingues (@italodom) é CEO da Missão Web.

Share on facebook
Share on twitter
Share on linkedin
Share on whatsapp
Share on telegram
Share on pocket

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *