Engenharia de Software Orientada a
objetos
Prof. Rogério Celestino dos Santos
Introdução
Os princípios de projeto fornecem os fundamentos
necessários para o entendimento de o que é um bom
projeto
Entretanto, não é retratado claramente como se pode
obter um bom projeto
Para facilitar o entendimento de como fazer um bom
projeto, esse conhecimento foi codificado na forma de
padrões
Introdução
Padrões descrevem, em um formato estruturado, um
problema e uma possível solução para este problema
Padrões não são criados, são descobertos!
A solução descrita foi aplicada com sucesso por especialistas da área inúmeras vezes, podendo ser considerada uma boa solução
As principais utilidades de um padrão estão
relacionadas com
Formalização e propagação do conhecimento
Uniformização do vocabulário
Introdução
Uma linguagem de padrões agrega um conjunto de
padrões relacionados para um contexto em particular
No contexto de projeto orientado a objetos foi criada
uma linguagem de padrões conhecida como GRASP
(Larman, G.; 2007)
GRASP – General Responsability Assignment Software Patterns
Os padrões GRASP descrevem os princípios
fundamentais para a atribuição de responsabilidades em projetos OO
Padrões
Padrões Básicos
Especialista (“Expert”)
Criador (“Creator”)
Alta coesão (“High Cohesion”)
Baixo acoplamento (“Low Coupling”)
Controlador (“Controler”)
Padrão Especialista
FUNÇÃO : atribuir responsabilidade ao especialista
da informação - a classe que tem a informação
necessária para satisfazer uma responsabilidade.
Baseado na idéia de WIRFS-BROOKS -
classes-responsabilidades-colaboração (CRC)
Auxilia na determinação de métodos das classes e na
Padrão Especialista
1-Definir objetos de domínio do problema dentro do
use case
2-A partir dos eventos do use case, fazer a pergunta
“de quem é a responsabilidade por realizar isto?”. Em
primeira instância, seria da classe que tem as
informações necessárias para tal.
3-Definir agora que COLABORAÇÕES são
necessárias (informações necessárias) de outros
objetos para realizar a RESPONSABILIDADE do
objeto considerado.
‘4-Para cada objeto responsável pelas colaborações
(que têm a responsabilidade de realizá-las), repetir o
ítem 3.
Padrão Especialista
Ex:
Q: No use case Compra Itens, de quem é a
responsabilidade por calcular o total de vendas?
R: Quem tem as informações necessárias para tal é a classe VENDA.
Q: Que informação (colaboração) é necessária para determinar este total?
R: Precisamos conhecer instâncias de Item de Venda e a soma de seus subtotais. Assim, a
responsabilidade por calcular os subtotais é deste subtotal é da classe Item de Venda. Temos então uma mensagem indo de Venda para Item de Venda.
Padrão Especialista
Q: Para calcular o subtotal, o que precisa Item de
Venda conhecer?
R: O preço do produto. Quem tem esta informação é
o objeto Produto. Logo, cria-se uma mensagem de
Item de Venda para Produto (retornarPreço)
Padrão Especialista
2: c alc ul arS ubtota l V enda It em de
V enda
P roduto 1: c alc ularTotal
Padrão Especialista
Benefícios:
Leva a projetos onde o objeto de software faz o que o objeto real faria
Mantém o encapsulamento e não aumenta o acoplamento, pois utiliza informações próprias
Distribui o comportamento uniformemente entre as classes do sistema, aumentando a coesão das
mesmas
Também conhecido como
“Quem sabe, faz”
“Faço eu mesmo”
Padrão Criador
FUNÇÃO: Atribuir à classe B a responsabilidade de
criar uma instância da classe A se:
B contém objetos A (todo-parte);
B usa objetos A;
B possui dados de inicialização que serão passados para A quando for criado.
Padrão Criador
Ex:(Compra Itens)
A responsabilidade de criação de Itens de Venda deve ser de classe que contenha instâncias dos mesmos. Então a responsabilidade de criação da mesma deve ser da classe Venda.
Padrão Criador
V enda Item de V enda 2: c riar(quantidade) 1: c riarItem deV enda(quantidade)
Padrão Criador
Benefício:
Não aumenta o acoplamento, pois a visibilidade entre as classes envolvidas já existia
Padrão Baixo Acoplamento
FUNÇÃO: Atribuir uma responsabilidade de forma a
conseguir acomplamento fraco entre classes.
Atribuir a responsabilidade de modo que o
acoplamento (dependência entre classes) permaneça
baixo
O padrão Acoplamento Fraco deve ser utilizado como
Padrão Baixo Acoplamento
Controle de V enda
V enda
2: regis trarP agam ento() 1: regis trarP agam ento()
P agam e nto 3: Cri ar
Padrão Baixo Acoplamento
P aga me n to Controle de
V enda V enda
2: re gis t ra rP agam ento() 3: c riar 1: regis trarP agam ento()
Padrão Baixo Acoplamento
Benefícios
Responsabilidade não é (ou é pouco) afetada por mudanças em outros componentes
Responsabilidade é mais simples de entender isoladamente
Padrão Alta Coesão
FUNÇÃO: Atribuir uma responsabilidade de forma a
manter uma alta coesão.
A coesão mede quão fortemente relacionadas e
Padrão Alta Coesão
Níveis de coesão
Muito baixa
Um classe tem muitas responsabilidades em áreas funcionais bastantes diferentes
Baixa
Um classe é responsável por uma tarefa complexa de uma única área funcional
Padrão Alta Coesão
Níveis de coesão
Moderada
Um classe tem moderadas responsabilidades em uma única área funcional e colabora com outras classes para cumprir suas tarefas
Alta
Um classe tem responsabilidades leves apenas em algumas áreas que estão logicamente relacionadas com o conceito da classe
Padrão Alta Coesão
Alta coesão na prática:
Classes têm usualmente poucos métodos altamente relacionados
Tarefas mais complexas são delegadas a objetos associados
Analogia ao mundo real:
Pessoas que não delegam responsabilidades e fazem muitas coisas diferentes ao mesmo tempo tendem a não ser eficientes
Padrão Alta Coesão
Benefícios:
Clareza e facilidade de compreensão do projeto
Simplificação das atividades de manutenção
Favorecimento indireto do baixo acoplamento
Facilidade de reutilização, graças à classe ser muito específica
Alguns casos de coesão moderada trazem benefícios,
Padrão Controlador
Atribuir a responsabilidade de tratar uma mensagem
de evento de sistema a uma classe que trate eventos
de sistema de um use case.
Esta classe é uma classe de controle.
Os eventos de sistemas devem ser tratados por uma
das classes abaixo:
Representante do sistema como um todo (Facade)
Representante do negócio ou da organização
Representante do caso de uso em questão (tratador artificial)
Padrão Controlador
Benefícios
Maior chance de reuso
Melhor controle sobre o estado do caso de uso
A separação view-controller facilita a reutilização de componentes específicos de negócio e permite o uso dos serviços através de processamento em lote (batch)
A utilização de uma única classe para todos os eventos de um caso de uso possibilita a manutenção de estado do caso de uso como atributos dessa classe
Padrão Controlador
Considerações
Não sobrecarregar controlador com um número
excessivo de eventos, responsabilidades ou atributos
Adicionar mais controladores e/ou delegar responsabilidades
Evitar controladores representando papéis humanos
Risco de baixa coesão; responsabilidades devem ser delegadas para objetos contendo a informação necessária (padrão Especialista)
O controlador deve ser somente o maestro... não
deve tocar nenhum dos instrumentos (mesmo que dê
muita vontade)
Exercícios
1.
Como a UML pode auxiliar na elaboração de Projetos
Orientados a Objetos?
2.
Conceitue padrões.
3.
O que é GRASP?
4.
Existem 5 Padrões GRASP:
Criador
Especialista
Acoplamento Baixo
Controlador
Coesão Alta
Defina, pelo menos 3, dos padrões GRASP em um parágrafo e como eles podem ser aplicados.
Pesquise algumas aplicações para eles.