Princípios de Projeto Orientado a Objetos – SRP

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.

Deixe um comentário

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