Escolar Documentos
Profissional Documentos
Cultura Documentos
Padres GRASP
GoF e GRASP
Padres GoF
08/09/2009
Responsabilidades
Contrato ou obrigao de um tipo ou classe
[Booch e Rumbaugh]
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.
Atribuio de Reponsabilidades
Atribuio a objetos durante o design (projeto)
08/09/2009
No diagrama ao lado o ControladorLogin tm a responsabilidade de efetuar o login mtodo etuarLogin() O cumprimento dessa responsabilidade requer colaborao com CadastroContas
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:
08/09/2009
Padres GRASP
Padres bsicos Padres avanados
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
08/09/2009
POS System
Para a ilustrao dos padres GRASP analisaremos o exemplo do POS System.
POS System
Utilizado tipicamente em lojas (comrcio) Grava vendas (Sale) e gera pagamentos (Payment)
Payment
Sale
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)
08/09/2009
Expert [cont.]
A nova responsabilidade conduzida por uma operao no diagrama de interao
Expert [cont.]
Mas como a classe Sale vai calcular o valor total?
A responsabilidade para cada subtotal atribuda ao objeto SalesLineItem (item de linha do pedido)
08/09/2009
Expert [cont.]
O subtotal depende do preo. ProductSpecification o especialista que conhece o preo, portanto ... a responsabilidade dele
Creator
Problema:
Soluo:
08/09/2009
Creator
Que classe deve ser responsvel por criar uma instncia do objeto SalesLineItem abaixo?
Creator
A nova responsabilidade conduzida por uma operao em um diagrama de interaes
08/09/2009
Low Coupling
Problema
Soluo
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.
08/09/2009
Low Coupling
Como devemos atribuir uma responsabilidade para criar Payment e associ-lo com Sale?
Payment Register Sale
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
Coeso
Coeso [Funcional]
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
12
08/09/2009
Controller
Problema
Soluo
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
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.
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
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.
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
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.
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
18