Você está na página 1de 18

08/09/2009

Padres GRASP

GoF e GRASP
Padres GoF

exploram solues mais especficas


Padres GRASP

refletem prticas mais pontuais da aplicao de


tcnicas OO ocorrem na implementao de vrios padres GoF

Anlise e Projeto OO com UML e Padres| 2

08/09/2009

Responsabilidades
Contrato ou obrigao de um tipo ou classe
[Booch e Rumbaugh]

Dois tipos de responsabilidades dos objetos:

De conhecimento (knowing):
sobre dados privativos e encapsulados; sobre objetos relacionados; sobre coisas que pode calcular ou derivar.

De realizao (doing):
fazer alguma coisa em si mesmo; iniciar uma ao em outro objeto; controlar e coordenar atividades em outros objetos.

Anlise e Projeto OO com UML e Padres| 3

Atribuio de Reponsabilidades
Atribuio a objetos durante o design (projeto)

Responsabilidades Classes e Mtodos traduo depende da granularidade da responsabilidade

Responsabilidades do tipo doing


Realizadas por um nico mtodo ou uma coleo de mtodos trabalhando em conjunto inferidas a partir do modelo conceitual (so os atributos e relacionamentos)

Responsabilidades do tipo knowing

Anlise e Projeto OO com UML e Padres| 4

08/09/2009

Responsabilidades e Diagramas de Interao


Diagramas de interao mostram escolhas ao atribuir responsabilidades a objetos
4: registraSessao(login)

No diagrama ao lado o ControladorLogin tm a responsabilidade de efetuar o login mtodo etuarLogin() O cumprimento dessa responsabilidade requer colaborao com CadastroContas

1: efetuarLogin(login, senha) : TelaLogin : ClienteAtor

2: efetuarLogin(login, senha) 3: existeConta(login, senha) : ControladorLogin : CadastroContas

Exemplo do Internet Banking


Anlise e Projeto OO com UML e Padres| 5

Padres GRASP
GRASP: General Responsibility and Assignment Software Patterns
descrevem os princpios fundamentais da atribuio de responsabilidades a objetos, expressas na forma de padres; Ajudam compreender melhor a utilizao de vrios do paradigma O-O em projetos mais complexos; Exploram os princpios fundamentais de sistemas OO Introduzidos no livro:

5 padres fundamentais 4 padres avanados

Anlise e Projeto OO com UML e Padres| 6

08/09/2009

Padres GRASP
Padres bsicos Padres avanados

Information Expert Creator High Cohesion Low Coupling Controller

Polymorphism Pure Fabrication Indirection Protected Variations

Anlise e Projeto OO com UML e Padres| 7

Expert (especialista de informao)


Problema

No design, quando so definidas interaes entre objetos Precisamos de um princpio para atribuir responsabilidades a classes Atribuir uma responsabilidade ao especialista de informao: classe que possui a informao necessria para cumpri-la Comece a atribuio de responsabilidades ao declarar claramente a responsabilidade

Soluo

Anlise e Projeto OO com UML e Padres| 8

08/09/2009

POS System
Para a ilustrao dos padres GRASP analisaremos o exemplo do POS System.

Padres GRASP so utilizados quase sempre durante a anlise.

POS System

Utilizado tipicamente em lojas (comrcio) Grava vendas (Sale) e gera pagamentos (Payment)

Payment

Sale

Foco dos casos de uso analisados aqui.

Anlise e Projeto OO com UML e Padres| 9

Expert
No sistema abaixo, uma classe precisa saber o total geral de uma venda (Sale). Que classe deve ser a responsvel?
Sale possui informaes sobre SalesLineItems (knowing)

slide com animao

Anlise e Projeto OO com UML e Padres| 10

08/09/2009

Expert [cont.]
A nova responsabilidade conduzida por uma operao no diagrama de interao

Um novo mtodo criado

slide com animao

Anlise e Projeto OO com UML e Padres| 11

Expert [cont.]
Mas como a classe Sale vai calcular o valor total?

Somando os subtotais. Mas quem faz isto?

A responsabilidade para cada subtotal atribuda ao objeto SalesLineItem (item de linha do pedido)

slide com animao

Anlise e Projeto OO com UML e Padres| 12

08/09/2009

Expert [cont.]
O subtotal depende do preo. ProductSpecification o especialista que conhece o preo, portanto ... a responsabilidade dele

slide com animao

Anlise e Projeto OO com UML e Padres| 13

Creator
Problema:

Que classe deve ser responsvel pela criao de


uma nova instncia de uma classe?

Soluo:

Atribua a B a responsabilidade de criar A se:


B agrega A objetos; B contm A objetos; B guarda instncias de A objetos; B faz uso de A objetos; B possui dados para inicializao de A.

Anlise e Projeto OO com UML e Padres| 14

08/09/2009

Creator
Que classe deve ser responsvel por criar uma instncia do objeto SalesLineItem abaixo?

Sale agrega vrios SalesLineItems

slide com animao

Anlise e Projeto OO com UML e Padres| 15

Creator
A nova responsabilidade conduzida por uma operao em um diagrama de interaes

Um novo mtodo criado na classe de design para expressar isto.

mtodo a ser criado em Sale

slide com animao

Anlise e Projeto OO com UML e Padres| 16

08/09/2009

Low Coupling
Problema

Como suportar baixa dependncia, baixo impacto


devido a mudanas e reuso constante?

Soluo

Atribuir uma responsabilidade para que o


acoplamento mantenha-se fraco.

Anlise e Projeto OO com UML e Padres| 17

Acoplamento
uma medida de quanto um elemento est conectado a, ou depende de outros elementos. Uma classe com acoplamento forte depende de muitas outras classes.

Por isto, acoplamento forte indesejvel

O acoplamento est associado coeso:


Quanto maior a coeso, menor o acoplamento e vice-versa.

Anlise e Projeto OO com UML e Padres| 18

08/09/2009

Low Coupling
Como devemos atribuir uma responsabilidade para criar Payment e associ-lo com Sale?
Payment Register Sale

Anlise e Projeto OO com UML e Padres| 19

Qual das opes abaixo possui menor acoplamento? 1

Anlise e Projeto OO com UML e Padres| 20

10

08/09/2009

High Cohesion
Problema

Como manter a complexidade sob controle? Classes que fazem muitas tarefas no
relacionadas so:
mais difceis de entender, de manter e de reusar, alm de serem mais vulnerveis mudana.

Soluo

Atribuir uma responsabilidade para que


a coeso se mantenha alta.

Anlise e Projeto OO com UML e Padres| 21

Coeso
Coeso [Funcional]

Uma medida de quo relacionadas ou


focadasesto as responsabilidades de um elemento. Exemplo: uma classe Co coesa se:
tem operaes relacionadas ao Co (morder, correr, comer, latir) e apenas ao Co (no ter por exemplo, validar, listarCaes, etc)

Alta coeso promove design modular


Anlise e Projeto OO com UML e Padres| 22

11

08/09/2009

High Cohesion
Que classe responsvel por criar um pagamento (Payment) e associ-lo a uma venda (Sale)?

Register assumiu responsabilidade por uma coisa que parte de Sale (fazer um pagamento no responsabilidade de registrar)
Anlise e Projeto OO com UML e Padres| 23

High Cohesion
Faz mais sentido que o pagamento seja parte de Sale

E no do registro, como aparecia na soluo anterior

Logo, Register delega a responsabilidade a Sale, diminuindo aumentando a coeso de Register

Anlise e Projeto OO com UML e Padres| 24

12

08/09/2009

Controller
Problema

Quem deve ser o responsvel por lidar com um


evento de uma interface de entrada?

Soluo

Atribuir responsabilidades para receber ou lidar


com um evento do sistema para:
uma classe que representa todo o sistema ou subsistema (faade controller); uma classe que representa cenrio de caso de uso (controlador de caso de uso ou de sesso). Que padro GoF a este padro GRASP ?
Anlise e Projeto OO com UML e Padres| 25

Que classe deve ser responsvel por receber eventos do sistema?

Normalmente, o controlador no realiza o trabalho, mas delega para outras subpartes do sistema. Anlise e Projeto OO com UML e Padres|

26

13

08/09/2009

Possveis escolhas

A primeira soluo representa o sistema inteiro A segunda soluo representa o destinatrio ou handler de todos os eventos de um caso de uso

A escolha depender de outros fatores, que veremos a seguir.

Anlise e Projeto OO com UML e Padres| 27

Padres GRASP avanados


Domine primeiro os cinco bsicos antes de explorar estes quatro:

Polymorphism Indirection Pure Fabrication Protected Variations

Anlise e Projeto OO com UML e Padres| 28

14

08/09/2009

Polymorphism
Problema

Como lidar com alternativas baseadas no tipo? Como criar componentes de software plugveis? Deseja-se evitar variao condicional (if-then-else): pouco extensvel. Deseja-se substituir um componente por outro sem afetar o cliente. No use lgica condicional para realizar alternativas diferentes baseadas em tipo. Atribua responsabilidades ao comportamento usando operaes polimrficas Refatore!
Anlise e Projeto OO com UML e Padres| 29

Soluo

Exemplo
No nosso sistema, possumos vrias calculadores de taxas, cujo comportamento varia de acordo seu tipo. Atravs de polimorfismos, podemos criar vrios adaptadores semelhantes (mesma interface), que recebem uma venda e adaptam para diferentes calculadoras externas.

Anlise e Projeto OO com UML e Padres| 30

15

08/09/2009

Pure Fabrication
Problema

Que objeto deve ter a responsabilidade, quando voc no quer violar High Cohesion e Low Coupling, mas as solues oferecidas por Expert no so adequadas? Atribuir responsabilidades apenas para classes do domnio conceitual pode levar a situaes de maior acoplamento e menos coeso. Atribuir um conjunto altamente coesivo de responsabilidades a uma classe artificial que no representa um conceito do domnio do problema

Soluo

Anlise e Projeto OO com UML e Padres| 31

Exemplo
Apesar de Sale ser a candidata lgica para ser a Expert para salvar a si mesma em um banco de dados, isto levaria o projeto a ter baixo acoplamento, alta coeso e baixo reuso. Uma soluo seria criar uma classe responsvel somente por isto.

Anlise e Projeto OO com UML e Padres| 32

16

08/09/2009

Protected Variations
Problema

Como projetar objetos, subsistema e sistemas para que as variaes ou instabilidades nesses elementos no tenha um impacto indesejvel nos outros elementos? Identificar pontos de variao ou instabilidade potenciais. Atribuir responsabilidades para criar uma interface estvel em volta desses pontos. Encapsulamento, interfaces, polimorfismo, indireo e padres; mquinas virtuais e brokers so motivados por este princpio Evite enviar mensagens a objetos muito distantes.

Soluo

Anlise e Projeto OO com UML e Padres| 33

Exemplo
O exemplo anterior das calculadores de taxa so um exemplo de proteo variaes. O sistema deve estar protegido variaes externas dos sistemas de calculadora.

Anlise e Projeto OO com UML e Padres| 34

17

08/09/2009

Indirection
Problema

Onde atribuir uma responsabilidade para evitar acoplamento direto entre duas ou mais coisas? Como desacoplar objetos para que seja possvel suportar baixo acoplamento e manter elevado o potencial de reuso? Atribua a responsabilidade a um objeto intermedirio para mediar as mensagens entre outros componentes ou servios para que no sejam diretamente acoplados. O objeto intermedirio cria uma camada de indireo entre os dois componentes que no mais dependem um do outro:
agora ambos dependem da indireo.

Soluo

Anlise e Projeto OO com UML e Padres| 35

No exemplo da calculadora de taxas, o sistema e a calculadora so intermediados pelo adaptador.

O exemplo de persistncia (PersistentStorage) tambm suporta indireo.


A maioria dos problemas em cincia da computao podem ser resolvidos por um outro Anlise nvelede indireo. Dijkstra Projeto OO com UML e Padres| 36

18

Você também pode gostar