Melhoria da Manutenibilidade
Criado: Set/2005
Atualizado: Nov/2010
Eliane Martins - Instituto de Computação - UNICAMP
Tópicos
• Manutenibilidade
• Técnicas para melhoria da manutenibilidade
• Métricas
Eliane Martins - Instituto de Computação - UNICAMP
2
Referências
CHIOSSI, T.S. “Técnicas de Desenvolvimento para a Manutenibilidade”. Cap2 do livro
sobre Manutenção de Software, em andamento.
DESCHAMPS, F. “Padrões de Projeto. Uma Introdução”. Notas de Aula. Departamento
de Automação e Sistemas (DAS). Universidade Federal de Santa Catarina.
KON, F. “Padrões de Projeto de Software Orientado a Objetos”. Notas de Aula.
IME/USP, 2005. URL: www.ime.usp.br/~kon/MAC5714/2005/aulas/slides/GoF.ppt
JANDL, P. Jr. “Uma Introdução aos Padrões de Projeto com Java”. 2003. Obtido na
Internet em ago/2005.
PRESSMAN, R.S. “Sw Engineering: a Practitioner’s Approach”. McGraw-Hill, 3ª ed,
1992.
SOMMERVILLE, I.. “Sw Engineering”, 6ª ed, 2001, cap27.
GAMMA, E., HELM, R., JOHNSON, R., VLISSIDES, J. "Design Patterns: Elements of
Reusable Object-Oriented Software". Reading, MA: Addison Wesley, 1995.
Eliane Martins - Instituto de Computação - UNICAMP
3
Manutenibilidade
• Algumas definições
– Facilidade com que um sistema ou componente de software
pode ser modificado para se corrigir falhas, melhorar
desempenho (ou outros atributos), ou ser adaptado a
mudanças no ambiente; (IEEE 610.12, 1990)
– Facilidade para corrigir um sw, quando possui falhas ou
deficiências, e também para expandir ou contrair o sw para
satisfazer a novos requisitos (Martin e McClure 1983)
– Conjunto de atributos relativos ao esforço necessário para
se realizar modificações em um sw (ISO/IEC 8402 1986)
Eliane Martins - Instituto de Computação - UNICAMP
Considerações
• Todos os sistemas são igualmente fáceis de manter ?
Porque não ?
– Sistemas não são desenvolvidos visando manutenibilidade

– manutenibilidade deve ser uma das metas do desenvolvimento
• Que critérios usar para determinar se um sw é fácil de
manter ou não ?
• É possível estimar o grau de manutenibilidade de um sw ?
Eliane Martins - Instituto de Computação - UNICAMP
Como determinar se o sw é ou não fácil de
manter?
• Manutenibilidade é uma característica que deve ser considerada ao
longo de todo o desenvolvimento. Isso se deve ao fato de que alguns
fatores relacionados ao desenvolvimento a influenciam [PRESSMAN
92; SOMMERVILLE 01]:
–
–
–
–
–
–
–
–
Modularidade
Linguagem de programação
Estilo de programação
Verificação e Validação (V&V)
Disponibilidade dos testes
Depurador (debugger)
Documentação
Controle de Configuração
Eliane Martins - Instituto de Computação - UNICAMP
Fatores de influência
• Modularidade
– Quanto melhor a estruturação do sistema, isto é, quanto mais
independentes forem os módulos que o compõem, mais fácil fica
modificar um componente sem afetar todos os outros.
• Linguagem de programação
– programas escritos em linguagem de alto nível são geralmente
mais fáceis de entender, e conseqüentemente, de manter. O uso
linguagens padronizadas também é útil.
• Estilo de programação
– a forma como um programa é escrito (uso de comentários, escolha
de nomes mnemônicos para variáveis e constantes, uso de
indentação, entre outros) contribui para a sua inteligibilidade, e
conseqüentemente, para a facilidade em mantê-lo.
Eliane Martins - Instituto de Computação - UNICAMP
Fatores de influência
• Verificação e Validação (V&V)
– em geral, quanto maior o esforço com V&V, menor o número de
falhas residuais no sistema, diminuindo assim a necessidade de
manutenções corretivas
• Disponibilidade dos testes
– a aplicação de testes de regressão é necessária a cada modificação
do sistema. A disponibilidade dos testes aplicados facilita a geração
dos testes na fase de manutenção.
• Depurador (debugger)
– a existência de ferramentas de auxílio à depuração (“debugging”)
de programas facilita o diagnóstico das falhas encontradas.
Eliane Martins - Instituto de Computação - UNICAMP
Fatores de influência
• Documentação
– quanto mais a documentação é clara, completa e atualizada, mais
fácil se torna entender o sistema. O uso de uma padronização para
a documentação facilita a criação e manutenção da mesma.
• 47% - 62% é a % de esforço requerido para a compreensão de
programas e documentos [Pigosrki 1996]
• Controle de Configuração
– um dos aspectos importantes na manutenção é o controle de todos
os produtos que foram gerados durante o processo de construção
do sistema.
Eliane Martins - Instituto de Computação - UNICAMP
Fatores externos
• Além dos fatores internos, relativos à forma como o sw é
desenvolvido, fatores externos também influenciam na
manutenibilidade:
–
–
–
–
–
–
Equipe
Domínio da aplicação
Idade do sistema
Dependência do ambiente externo
Estabilidade do hw
Disponibilidade de ferramentas de desenvolvimento
Eliane Martins - Instituto de Computação - UNICAMP
Fatores externos
• Equipe
– idealmente a manutenção de um sistema seria realizada pela equipe
que o desenvolveu. Se tal não é possível, recomenda-se que a
equipe de manutenção acompanhe o processo de desenvolvimento.
• Domínio da aplicação
– se o domínio da aplicação é conhecido e pode ser facilmente
compreendido e definido, os requisitos em geral são completos e
estáveis, e com isso a necessidade de manutenção perfectiva
diminui. Em domínios mais complexos, ou não muito conhecidos,
a tendência é que os requisitos mudem com mais freqüência, e com
isso a manutenção preventiva é mais necessária.
• Métodos evolutivos (ex.: métodos ágeis)  a manutenção preventiva
é intrínseca ao desenvolvimento
Eliane Martins - Instituto de Computação - UNICAMP
Fatores externos
• Idade do sistema
– quanto mais velho um sistema, mais modificações ele sofreu ao
longo do tempo, e, portanto, mais complexo ele se torna. A
manutenção preventiva (reengenharia) tem por objetivo melhorar a
sua manutenibilidade.
• Dependência do ambiente externo
– se um sistema é muito dependente do ambiente externo ele precisa
ser alterado a cada mudança nesse ambiente.
Eliane Martins - Instituto de Computação - UNICAMP
Fatores externos
• Estabilidade do hw
– geralmente são necessárias modificações para adaptar o software a
uma nova plataforma.
• Disponibilidade de ferramentas de desenvolvimento
– as ferramentas CASE evoluem ou podem sair do mercado. É útil
guardar versões das ferramentas usadas para desenvolver o
sistema. A manutenção se torna mais fácil, pois pode-se atualizar
diagramas e documentos de Análise/Projeto, modificar código
fonte escrito em linguagens que caíram em desuso, atualizar os
testes, entre outros.
A implicação disto é que às vezes o hw em que a ferramenta roda
precisa ser preservado!
Eliane Martins - Instituto de Computação - UNICAMP
Manutenibilidade
• Como medir ?
• Como conseguir ao longo do desenvolvimento?
Eliane Martins - Instituto de Computação - UNICAMP
Técnicas de desenvolvimento 
manutenibilidade
• Muitos métodos são utilizados durante as diferentes etapas
do desenvolvimento de software com o objetivo de garantir
qualidade. Alguns exemplos:
– Reutilização de software
– Uso de mecanismos de separação de interesses:
• reflexão computacional
• orientação a aspectos
Eliane Martins - Instituto de Computação - UNICAMP
Reutilização em Engenharia de Software
• “Qualquer procedimento que produza (ou ajude a
produzir) um sistema tornando a utilizar algo desenvolvido
previamente”
[Peter Freeman 1987, citado em Pressman95, cap.26]]
• Reutilização é algo praticado há muito tempo em
Engenharia de Software, só que de maneira ad hoc
• Dada a pressão por produzir sw de boa qualidade em pouco
tempo  necessidade de reutilizar de forma sistemática
Eliane Martins - Instituto de Computação - UNICAMP
Níveis de Abstração
• Reutilização pode ser considerada em todas as fases do
desenvolvimento
• Pode-se reutilizar:
–
–
–
–
–
Artefatos intermediários  padrões de software
Sistemas de aplicação
Componentes
Classes
Funções
Eliane Martins - Instituto de Computação - UNICAMP
Padrões
• Padrão, s.m.[do latim patronu, protetor]
1. Modelo oficial de pesos e medidas. 2. Aquilo que serve de base ou
norma para a avaliação de qualidade ou quantidade. 3. Qualquer
objeto que serve de modelo à feitura de outro. ...
[FERREIRA, Aurélio B. H. “Novo Dicionário da Língua Portuguesa”. Rio
de Janeiro, RJ: Nova Fronteira, 2ª edição, 1986.]
Eliane Martins - Instituto de Computação - UNICAMP
Padrões de software
• Porquê
– Aumentar a possibilidade de reuso de boas soluções para problemas
freqüentes, garantindo, com isso, melhor qualidade para o software
– Reutilizar soluções para problemas surgidos em trabalhos anteriores
é uma tendência entre especialistas
– Os padrões surgem com a experiência prática
Experiência de especialistas pode ser compartilhada com novatos
Eliane Martins - Instituto de Computação - UNICAMP
Uma definição
• “Um padrão descreve um problema que ocorre
repetidamente no nosso ambiente, descrevendo a essência
de uma solução para este problema, de forma que pode-se
usar esta solução milhares de vezes, sem fazê-lo da mesma
forma duas vezes.”
[ALEXANDER, Christopher, 1977 --> propôs padrões a serem usados
em Arquitetura, de onde surgiu a idéia de utilizar do mesmo recurso
em software]
[ALEXANDER, C., ISHIKAWA, S., SILVERSTEIN, M., JACOBSON, M., FIKSDAHL-KING,
I., ANGEL, S. "A Pattern Language". New York, NY (USA): Oxford University Press, 1977].
Eliane Martins - Instituto de Computação - UNICAMP
Outra definição
• “Um padrão de software nomeia, motiva e explica uma
solução genérica a um problema recorrente que surge em
uma situção específica. Ele descreve o problema, a solução,
quando é aplicável e quais as conseqüências de seu uso.”
[Gamma et al]
Eliane Martins - Instituto de Computação - UNICAMP
Características [Jandl 2003]
• Descrevem e justificam soluções para problemas concretos e
bem definidos.
• Documentam a experiência existente e comprovada.
• Fornecem um vocabulário comum aos desenvolvedores de
software.
• Descrevem relações entre conceitos, estruturas e
mecanismos existentes nos sistemas.
• Podem ser utilizados em conjunto com outros padrões.
Eliane Martins - Instituto de Computação - UNICAMP
Uso de padrões
• Padrões podem ser utilizados nas diversas etapas de
desenvolvimento de software:
– Análise (M.Fowler 1997)
– Arquitetura, Projeto e Codificação (Gamma e al;
Buschmann 1996.)
– Testes (R.Binder 1999)
– Manutenção (Barry 2003; Hammouda 2004)
– Reengenharia (Demeyer 2003)
...
Eliane Martins - Instituto de Computação - UNICAMP
Padrões de Arquitetura
• Representam esquemas para estruturar o software. Definem conjunto de
subsistemas pré-definidos, especificam suas responsabilidade e as regras para
organizar os relacionamentos entre eles.
– Ex.: Modelo em camadas
Apresentação
Entradas do usuário
Exibição de resultados na tela
Controle do Negócio  Lógica do negócio
Dados
 Comunicação com serviços: conexão
com banco de dados, troca de mensagens,
controle de transações, ...
– Ex.: padrões IBM para e-business (www128.ibm.com/developerworks/patterns/)
Eliane Martins - Instituto de Computação - UNICAMP
Padrões de Projeto e Idiomas
• Padrões de Projeto
– Permitem refinar os subsistemas da arquitetura, ou os
relacionamentos entre eles
– Focam em aspectos típicos de projeto, tais como: interface-usuário,
criação de objetos, entre outros
– São os mais comuns na literatura
• Idiomas
– São padrões de baixo nível, específicos para linguagens de
programação
– Descrevem como implementar aspectos dos subsistemas ou dos
relacionamentos entre eles, usando características de uma
determinada linguagem de programação
Eliane Martins - Instituto de Computação - UNICAMP
Outros padrões
• Padrões de análise
– Fazem parte da Especificação de Requisitos ou da Modelagem Conceitual
– Definem conjunto de objetos do mundo real, seus relacionamentos e as
regras que definem seu comportamento
– São dependentes da aplicação pois descrevem aspectos específicos do
domínio do problema
• Padrões de manutenção
– Regras e restrições que devem ser satisfeitas por entidades de um programa
(classes, métodos e atributos) para facilitar a manutenção, mais
especificamente, a documentação (HAMMOUDA 2004)
• Padrões para reengenharia
– padrões para refatoração
• Padrões de teste
– Definem procedimentos, modelos de falhas, entre outros, para descrever
métodos de testes (Binder 2000)
Eliane Martins - Instituto de Computação - UNICAMP
Gang of Four (GoF)
•
Existem diversas formas de descrever um padrão. Para os padrões de projeto a forma
mais comum é aquela descrita no livro de Gamma et al, denominado Gang of Four
(GoF):
• E. Gamma and R. Helm and R.
Johnson and J. Vlissides.
Design Patterns - Elements of
Reusable Object-Oriented
Software. Addison-Wesley,
1995.
[Kon2005]
Eliane Martins - Instituto de Computação - UNICAMP
O Formato dos padrões no GoF
– Nome (inclui número da página)
• um bom nome é essencial para que o padrão caia na boca do povo
– Objetivo / Intenção ou Motivação
• um cenário mostrando o problema e a necessidade da solução
– Aplicabilidade
• como reconhecer as situações nas quais o padrão é aplicável
– Estrutura
• uma representação gráfica da estrutura de classes do padrão
– Participantes
• as classes e objetos que participam e quais são suas responsabilidades
– Colaborações
• como os participantes colaboram para exercer as suas responsabilidades
[Kon2005]
Eliane Martins - Instituto de Computação - UNICAMP
O Formato dos padrões no GoF
– Conseqüências
• vantagens e desvantagens, trade-offs
– Implementação
• com quais detalhes devemos nos preocupar quando implementamos o padrão
• aspectos específicos de cada linguagem
– Exemplo de Código
• no caso do GoF, em C++ (a maioria) ou Smalltalk
– Usos Conhecidos
• exemplos de sistemas reais de domínios diferentes onde o padrão é utilizado
– Padrões Relacionados
• quais outros padrões devem ser usados em conjunto com esse
• quais padrões são similares a este, quais são as dierenças
[Kon2005]
Eliane Martins - Instituto de Computação - UNICAMP
Exemplo – padrão de teste de regressão
•
– Critérios de entrada:
Nome:
• Delta já foram testados
• Conjunto de testes previamente
aplicados já existe
• Matriz associando casos de uso
aos casos de teste foi criada
• O ambiente de testes já foi
configurado igual aos dos testes
prévios
– Teste de caso de uso de maior risco
•
Problema
– Útil quando não se dispõe de
tempo, recursos ou pessoal
suficiente para reaplicar todos os
testes
•
Solução
– Usar critérios de risco para avaliar
os casos de uso a serem testados
– Aplicar os critérios para obter o
subconjunto de testes a ser
reaplicado
– Usar como oráculo os resultados
do conjunto de testes aplicado
anteriormente
– Critérios de saída
• Todos os testes selecionados
foram aplicados e os bugs
devidamente registrados
•
Conseqüências
– Risco moderado de não revelar
uma falha de regressão
– Baixo custo de análise para seleção
de casos de teste
...
Não é do GoF, mas usou o mesmo formato de descrição
Eliane Martins - Instituto de Computação - UNICAMP
[Binder 2000, c.15]
Padrões de projeto
• No GoF, padrões de projeto podem ser divididos nas
seguintes categorias:
– Padrões de criação (creational): abstraem o processo de criação de
objetos a partir da instanciação de classes
• Ex.: Abstract Factory, Builder, Singleton
– Padrões estruturais (structural): tratam da forma na qual classes e
objetos estão organizados para a formação de estruturas maiores
• Ex.: Adapter, Composite, Decorator, Façade
– Padrões comportamentais (behavioral): tratam de algoritmos e da
atribuição de responsabilidades a objetos.
• Ex.: Iterator, Mediator, Observer, State, Visitor
Eliane Martins - Instituto de Computação - UNICAMP
Padrões de criação
• Abstract Factory
– Fornece uma interface para a criação de uma família de objetos
relacionados ou dependentes, sem especificar as suas classes
concretas
• Usos conhecidos:
– sistemas que necessitam de suporte a diferentes tipos de interfaces gráficas
(Motif, Windows, ...).
– Sistemas que devem ser configurados em uma dentre várias famílias de
produtos.
Eliane Martins - Instituto de Computação - UNICAMP
Abstract Factory
- Motivação
• Considere uma aplicação com interface gráfica que é implementada para
plataformas diferentes (Motif para UNIX e outros ambientes para Windows e
MacOS).
• As classes implementando os elementos gráficos não podem ser definidas
estaticamente no código. Precisamos de uma implementação diferente para cada
ambiente. Até em um mesmo ambiente, gostaríamos de dar a opção ao usuário
de implementar diferentes aparências (look-and-feel).
• Podemos solucionar este problema definindo uma classe abstrata para cada
elemento gráfico e utilizando diferentes implementações para cada aparência ou
para cada ambiente.
• Ao invés de criarmos as classes concretas com o operador new, utilizamos uma
Fábrica Abstrata para criar os objetos em tempo de execução.
• O código cliente não sabe qual classe concreta utilizamos.
[Kon2005]
Eliane Martins - Instituto de Computação - UNICAMP
Abstract Factory -
Aplicabilidade
Use uma fábrica abstrata quando:
• um sistema deve ser independente da forma como seus produtos
são criados e representados;
• um sistema deve poder lidar com uma família de vários produtos
diferentes;
• você quer oferecer uma biblioteca de classes de produtos mas não
quer revelar as suas implementações, quer revelar apenas suas
interfaces.
[Kon2005]
Eliane Martins - Instituto de Computação - UNICAMP
Exemplo de utilização do abstract factory
Define uma interface para as operações que
criam objetos como produtos abstratos
IGuiAbstrata
GUIAbstrata
criaBarraRolagem ( )
criaJanela ( )
GUIMotif
Fábrica Abstrata: classe abstrata contendo
o código comum às classes concretas
(fábricas) que têm um tema comum (ex.:
interface-usuário)
GUIWindows
criaBarraRolagem ( )
criaJanela ( )
criaBarraRolagem ( )
criaJanela ( )
Fábrica: Implementa as operações que
criam objetos para os produtos
concretos
concretas
Eliane Martins - Instituto de Computação - UNICAMP
Exemplo de utilização do abstract factory
usa
IGuiAbstrata
cliente
usa
GUIAbstrata
abstratas
criaBarraRolagem ( )
criaJanela ( )
GUIMotif
GUIWindows
criaBarraRolagem ( )
criaJanela ( )
criaBarraRolagem ( )
criaJanela ( )
Janela
janelaWindows
usa
janelaMotif
BarraRolagem
cria
BarraRolagem
Windows
cria
Eliane Martins - Instituto de Computação - UNICAMP
BarraRolagem
Motif
Abstract Factory -
Participantes
•
•
•
•
AbstractFactory (GUIAbstrata)
ConcreteFactory (GUIMotif, GUIWindows)
AbstractProduct (Janela, Barra de Rolagem)
ConcreteProduct (JanelaMotif, BarraRolagemMotif,
JanelaWindows, BarraRolagemWindows)
• Cliente - usa apenas as interfaces declaradas pela
AbstractFactory e pelas classes AbstratProduct
Eliane Martins - Instituto de Computação - UNICAMP
Abstract Factory -
Colaborações
• Normalmente, apenas uma instância de ConcreteFactory é
criada em tempo de execução.
• Esta instância cria objetos através das classes
ConcreteProduct correspondentes a uma família de produtos.
• Uma AbstractFactory deixa a criação de objetos para as suas
subclasses ConcreteFactory.
[Kon2005]
Eliane Martins - Instituto de Computação - UNICAMP
Abstract Factory -
Conseqüências
O padrão
1. isola as classes concretas dos clientes;
2. facilita a troca de famílias de produtos (basta trocar uma linha
do código pois a criação da fábrica concreta aparece em um
único ponto do programa);
3. promove a consistência de produtos (não há o perigo de
misturar objetos de famílias diferentes);
4. dificulta a criação de novos produtos ligeiramente diferentes
(pois temos que modificar a fábrica abstrata e todas as fábricas
concretas).
[Kon2005]
Eliane Martins - Instituto de Computação - UNICAMP
Padrões de criação
• Singleton
– Garante a existência de uma única instância de uma
determinada classe e fornece um ponto global de acesso
para ela.
• Uso conhecido:
– programas que só podem ter uma instância sendo executada em um
determinado momento.
Eliane Martins - Instituto de Computação - UNICAMP
Exemplo: Singleton
// SingletonImpl.java
public final class SingletonImpl {
private static SingletonImpl instance = null;
Singleton
private SingletonImpl() { ... }
static InstanciaUnica: Singleton
public static SingletonImpl getInstance() {
if (instance==null) {
instance = new SingletonImpl();
}
return instance;
}
static getinstance ( ): Singleton
retorna a
instância criada
}
// usando o sigleton
public class UsoDoSingletonImpl {
:
SingletonImpl obj;
:
obj = SingletonImpl.getInstance();
[Jandl2003]
:
Eliane Martins - Instituto de Computação
- UNICAMP
}
Padrões estruturais
• Composite
– Compõe objetos em estrutura de árvore para representar hierarquias
do tipo partes-todo.
– Permite que se trate de maneira uniforme objetos individuais e
composição de objetos, permitindo que objetos complexos sejam
compostos, recursivamente, de objetos mais simples.
– Uso conhecido:
• representar hierarquias de agregação (parte-todo)
Eliane Martins - Instituto de Computação - UNICAMP
Exemplo: Composite
Componente
Cliente
usa
+Operação ( )
+Adicionar (in Componente)
+Remover (in Componente)
+BuscarParte (in índice: int)
*
ImplemComponente
Composite
+Operação ( )
+Operação ( )
+Adicionar (in Componente)
+Remover (in Componente)
+BuscarParte (in índice: int)
Eliane Martins - Instituto de Computação - UNICAMP
1
Padrões estruturais
• Decorator
– Atribui, dinâmicamente, responsabilidades adicionais a um objeto,
para facilitar o uso de subclasses para extensão de funcionalidades.
– Só as responsabilidades do objeto são alteradas, não sua interface.
– Uso conhecido:
• atribuição de enfeites gráficos e outras funcionalidades acessórias a
widgets
Eliane Martins - Instituto de Computação - UNICAMP
Exemplo: Decorator
Componente_visual
Desenhar()
Visualizador_Texto
Decorator
Desenhar ()
Desenhar()
Borda
Espessura _borda
Barra_Rolagem
Posição-rolagem
Desenhar()
Desenhar_borda ()
Desenhar()
Rolar ()
[Thelma2005]
Eliane Martins - Instituto de Computação - UNICAMP
Mais alguns padrões estruturais
• Facade
– Fornece uma interface única para um conjunto de interfaces de um
subsistema.
– Define uma interface de alto nível, tornando o subsistema mais fácil
de usar.
– Uso conhecido:
• interface única em sistemas complexos
Eliane Martins - Instituto de Computação - UNICAMP
Exemplo: Facade
Interface única para o
subsistema ou componente
Facade
Subsistema ou componente
Eliane Martins - Instituto de Computação - UNICAMP
Mais alguns padrões estruturais
• Adapter
– Converte a interface de uma classe em outra, na forma esperada
pelas suas clientes. Permite que classes com interfaces que, de outra
forma, seriam incompatíveis, possam colaborar.
– Uso conhecido:
• wrapper, serve para adaptar interface de classes
Eliane Martins - Instituto de Computação - UNICAMP
Adapter (wrapper)
Cliente
-Alvo: alvo1
Alvo
+ void operacao_cliente ( )
Adapter
- Servidor: servidor1
+ void operacao_cliente ( )
void operação_cliente( )
{
servidor1.operação_servidor( )
}
Eliane Martins - Instituto de Computação - UNICAMP
Servidor
- Servidor: servidor1
+ void operacao_servidor ( )
Padrões comportamentais
• Iterator
– Fornece uma forma de aceder seqüencialmente aos elementos de
uma coleção sem expor sua representação subjacente
– Uso conhecido:
• bibliotecas C++, Java
Eliane Martins - Instituto de Computação - UNICAMP
Exemplo: Iterator
IColeção
getIterator( ): Iterator
IIterator
hasNext( ): boolean
next ( ): Object
ImplemColeção
getIterator( ): Iterator
return new ImplemIterator (this)
Eliane Martins - Instituto de Computação - UNICAMP
ImplemIterator
Padrões comportamentais
• Mediator
– Define um objeto que encapsula a interação entre um conjunto de
objetos.
– Promove o acoplamento fraco, evitando que os objetos refiram
explicitamente uns aos outros.
– Uso conhecido:
• arquitetura de aplicações
Eliane Martins - Instituto de Computação - UNICAMP
Mediator
Mediador
Mediador_concreto
mediador
Colaborador
Colaborador_concreto1
Eliane Martins - Instituto de Computação - UNICAMP
Colaborador_concreto2
Mais alguns padrões comportamentais
• Observer
– Permite que todos os dependentes de um objeto sejam notificados e
atualizados automaticamente quando o objeto (sujeito) muda de
estado.
– Utiliza um mecanismo de registro que permite ao sujeito notificar
aos interessados sobre mudanças.
– Uso conhecido: propagação de modificações e atualizações com
acoplamento fraco entre os objetos
Eliane Martins - Instituto de Computação - UNICAMP
Exemplo: Observer
Observado
+attach (in Observer)
+detach (in Observer)
+notify ( )
*
Observador
+update ( )
o  {Observador}: o.update( )
Observado_concreto
estado
sujeito
Observador_concreto
estadoObservado
+update ( )
+getEstado ( )
estadoObservado = sujeito.getEstado( )
Eliane Martins - Instituto de Computação - UNICAMP
Os padrões do GoF
• Criação:
–
–
–
–
–
• Estruturais:
Abstract Factory
Builder
Factory Method
Prototype
Singleton
Eliane Martins - Instituto de Computação - UNICAMP
–
–
–
–
–
–
–
Adapter
Bridge
Composite
Decorator
Façade
Flyweight
Proxy
Os padrões do GoF
• Comportamentais:
–
–
–
–
–
–
Chain of Responsibility
Command
Interpreter
Iterator
Mediator
Memento
–
–
–
–
–
Observer
State
Strategy
Template Method
Visitor
Consultar o catálogo!
Eliane Martins - Instituto de Computação - UNICAMP
Como selecionar um padrão
• Examine a seção de Problemas do padrão.
• Considere como o padrão seleciona um determinado
problema.
• Estude como os padrões se interrelacionam.
• Estude padrões de finalidade semelhante.
• Determine a causa para a re-estruturação do projeto.
• Determine como o padrão podem melhorar o projeto.
Eliane Martins - Instituto de Computação - UNICAMP
Como usar um padrão
•
•
•
•
Leia o padrão por inteiro, para ter uma visão geral.
Estude as seções de descrição do problema e da solução.
Olhe os exemplos de código do padrão.
Escolha nomes para os elementos do padrão que façam
sentido para o contexto da aplicação.
• Defina as classes.
• Escolha nomes para as operações que façam sentido para o
contexto da aplicação.
• Implemente as operações de forma a apoiar as
responsabilidades e colaborações específicas da aplicação.
[Deschamps]
Eliane Martins - Instituto de Computação - UNICAMP
Padrões de projeto: utilizar ou não?
– Melhoram a estrutura de algo já
implementado, quando o domínio do
problema está bem compreendido
– Aumentam a compreensão do código
melhorando a modularidade,
separação de conceitos e
simplicidade de descrição
• ex.: é mais fácil dizer: “utiliza-se
uma instância do padrão Visitor do
que "este é um código que varre a
estrutura e realiza chamadas a alguns
métodos em uma ordem particular e de
uma determinada forma".
Eliane Martins - Instituto de Computação - UNICAMP
– Utilize padrões somente para
resolver problemas já
identificados no
projeto/código pois ...
– ... podem diminuir a
capacidade de compreensão ao
introduzir acesso indireto e
aumentar a quantidade de
código
Onde obter mais informações
• Catálogo sobre padrões
– http://www.dofactory.com/Patterns/Patterns.aspx#list
• Tutorial sobre padrões:
– www.csc.calpoly.edu/~dbutler/tutorials/winter96/patterns/objectives.
html http://
• Padrões de projeto, Idiomas e Frameworks
– http://www.cs.wustl.edu/~schmidt/patterns.html
• Apresentação geral sobre padrões
– http://www.mindspring.com/~mgrand/pattern_synopses.htm
Eliane Martins - Instituto de Computação - UNICAMP
Outros Padrões
Ver slides: Padroes_manut_Regina_2009.pdf
(64-...)
Eliane Martins - Instituto de Computação - UNICAMP
Reuso - código
Ver meus slides
Eliane Martins - Instituto de Computação - UNICAMP
Sumário dos principais pontos aprendidos
Eliane Martins - Instituto de Computação - UNICAMP
Download

padroes&manut - Instituto de Computação