Programação Orientada a
Objetos
Desenvolvimento de Software
Orientado a Aspectos:
Será que vai pegar?
„
„
• Reuso
• Manutenção
• Adaptação
Sérgio Soares
[email protected]
http://sergio.dsc.upe.br
„
Sérgio Castelo Branco Soares
„
Ainda não!
Complexidade aumenta sem parar
Limitações com objetos
„
„
• fatores de qualidade ainda são
prejudicados
Sérgio Castelo Branco Soares
3
Sérgio Castelo Branco Soares
Funcionais (negócio)
„
Não-funcionais (sistêmicos)
•
•
•
•
•
•
logging
„
tratamento de exceções
autenticação
desempenho
concorrência e sincronização
persistência...
Sérgio Castelo Branco Soares
4
Problema (mesmo com OO)
• creditar, debitar, transferir
„
Requisitos que devem ser
implementados em um sistema
Em qualquer sistema, vários interesses
precisam ser implementados
• sem eles implementados, seu sistema não
atende aos requisitos
Tipos de interesses
„
2
Conceito novo – CONCERN
(interesse)
OO resolve nosso problema?
„
Padrões de projetos
• Auxiliam a POO
ESCOLA POLITÉCNICA
DE PERNAMBUCO
„
Lida com conceitos mais intuitivos
Permite ganhos
Código relacionado a
certos interesses são
transversais
Espalhados por vários
módulos de
implementação
(classes)
Cada cor um interesse diferente
5
Sérgio Castelo Branco Soares
6
1
Exemplo:
Sistema Disque Saúde
„
Exemplo:
Sistema Disque Saúde
Um sistema de informação
„
Implementado em Java
„
• Registra e encaminha queixas para o sistema de
saúde
• Exibe informações sobre unidades de saúde e
suas especialidades
• Servlets implementam a GUI
• Utiliza vários padrões de projetos para
contemplar requisitos não-funcionais
Requisitos não-funcionais
• Distribuído
• Acesso concorrente
• Extensível
Como implementar a distribuição no
sistema?
„
—Armazenamento de dados
—Tecnologia de distribuição
7
Sérgio Castelo Branco Soares
8
Sérgio Castelo Branco Soares
Disque Saúde distribuído com
RMI
Disque Saúde local
public class Complaint implements java.io.Serializable {
public class HealthWatcherFacade implements IFacade {
private String description;
public class ServletUpdateComplaintData extends HttpServlet {
public void update(Complaint complaint)
private Person complainer; ...
private IFacade facade;
throws TransactionException, RepositoryException,
public Complaint(String description, Person complainer,
...) {
public void init(ServletConfig config) throws ServletException {
ObjectNotFoundException, ObjectNotValidException {
try {
...
...
facade = (IFacade) java.rmi.Naming.lookup("//HealthWatcher");
}
}
}
public static void main(String[] args) {
public String getDescription() {
catch (java.rmi.RemoteException rmiEx) {...}
try {
return this.description;
catch (java.rmi.NotBoundException rmiEx) {...}
HealthWatcherFacade facade = HealthWatcherFacade.getInstance();
}
catch (java.net.MalformedURLException rmiEx) {...}
}
System.out.println("Creating RMI server...");
public Person getComplainer() {
UnicastRemoteObject.exportObject(facade);
return this.complainer;
java.rmi.Naming.rebind("/HealthWatcher");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
System.out.println("Server created and ready.");
public void setDescription(String desc) {
throws ServletException, IOException {
}
this.description = desc;
...
catch (RemoteException rmiEx) {... }
}
facade.update(complaint);
catch (MalformedURLException rmiEx) { ...}
public void setComplainer(Person complainer) {
} ...
...
catch(Exception ex) {... }
this.complainer = complainer;
} ...
}
}
}
}
public class Person implements java.io.Serializable {
public interface IFacade extends java.rmi.Remote {
private String nome; ...
public Person(String nome, …) {
public void updateComplaint complaint)
this.nome = nome; …
throws TransactionException, RepositoryException,
}
ObjectNotFoundException, ObjectNotValidException,
public String getNome() {
RemoteException;
return nome;
}…
...
}
}
Código RMI é vermelho…
9
Sérgio Castelo Branco Soares
Implementação OO: problemas!
„
Tangled code (código entrelaçado)
10
Sérgio Castelo Branco Soares
Causa do problema
„
Implementação mapeia os requisitos em uma
única dimensão
• código de distribuição misturado com
código de negócio e de GUI
„
Spread code (código espalhado)
© Copyright 2002, Silvio do
Lago Pereira.
• código de distribuição em várias classes
„
„
Distribuição é um crosscutting
concern (interesse transversal)
Logging
Difícil de manter e reusar
• mudanças no protocolo de distribuirão
(RMI, CORBA, EJB ) são invasivas
Sérgio Castelo Branco Soares
„
11
Interesse é transversal à dimensão de
implementação
Sérgio Castelo Branco Soares
12
2
Disque Saúde distribuído com
AOP (usando Java RMI)
AOP — Aspect-oriented
programming
public class Complaint {
„
Melhora a modularidade de interesses
transversais
private String description;
aspect DistributionAspect {
private HealthWatcherFacade facade;
declare parents: HealthWatcherFacade implements IFacade;
public void init(ServletConfig config) throws ServletException {
declare parents: Complaint || Person implements java.io.Serializable;
...
try {
}
public static void HealthWatcherFacade.main(String[] args) {
facade = HealthWatcherFacade.getInstance();
public String getDescription() {
try {
}
return this.description;
HealthWatcherFacade facade = HealthWatcherFacade.getInstance();
catch (Exception ex) {...}
}
System.out.println("Creating RMI server...");
}
public Person getComplainer() {
• distribuição, gerenciamento de dados,
controle de concorrência, tratamento de
exceções, logging, debugging, …
„
public class ServletUpdateComplaintData extends HttpServlet {
private Person complainer; ...
public Complaint(String description, Person complainer,
...) {
UnicastRemoteObject.exportObject(facade);
java.rmi.Naming.rebind("/HealthWatcher");
public void doPost(HttpServletRequest request, HttpServletResponse
response)
return this.complainer;
}
System.out.println("Server created and ready.");
throws ServletException, IOException {
} catch (RemoteException rmiEx) {...}
...
public void setDescription(String desc) {
catch (MalformedURLException rmiEx) {...}
} ...
this.description = desc;
catch(Exception ex) {...}
}
}
}
public void setComplainer(Person complainer) {
private IFacade remoteFacade;
this.complainer = complainer;
Sistema local
}
}
public class Person {
private String nome; ...
Auxilia separação de interesses
(separation of concerns)
public Person(String nome, ...) {
this.matricula = matricula; ...
}
public String getNome() {
return nome;
pointcut facadeMethodsExecution():
within(HttpServlet+) && execution(* HealthWatcherFacade.*(..)) &&
this(HealthWatcherFacade);
before(): facadeMethodsExecution() { prepareFacade();}
Aspectos de
distribuição com RMI
private synchronized void prepareFacade() {
if (healthWatcher == null) {
try { remoteFacade = (IFacade) java.rmi.Naming.lookup("//HealthWatcher");
} catch (java.rmi.RemoteException rmiEx) {...}
catch (java.rmi.NotBoundException rmiEx) {...}
catch (java.net.MalformedURLException rmiEx) {...}
}
} ...
void around(Complaint complaint) throws TransactionException, RepositoryException
}
ObjectNotFoundException,ObjectNotValidException:
public interface IFacade extends java.rmi.Remote {
facadeRemoteExecutions() && args(complaint) &&
public class HealthWatcherFacade {
• aumenta extensibilidade e reuso
call(void update(Complaint)) {
public void updateComplaint complaint)
public void update(Complaint complaint)
try { remoteFacade.update(complaint);
throws TransactionException, RepositoryException,
throws TransactionException, RepositoryException,
} catch (RemoteException rmiEx) {...}
ObjectNotFoundException, ObjectNotValidException,
ObjectNotFoundException,
ObjectNotValidException {
}
RemoteException;
...
...
}
}
}
}
13
Sérgio Castelo Branco Soares
Disque Saúde distribuído com
AOP
14
Sérgio Castelo Branco Soares
Implementação com AOP
„
Aumento em modularidade, reuso e
extensibidade
• Mais unidades de código
• Mudanças no sistema local podem causar
impacto nos aspectos de distribuição
„
Separation of concerns (separação de
interesses)
• Relação entre os aspectos e o resto do
sistema nem sempre é clara
„
15
Sérgio Castelo Branco Soares
Normalmente menos linhas de código
16
Sérgio Castelo Branco Soares
Passo 1: Identificando
interesses (decomposição)
Em direção ao
Identificador
de interesses
Desenvolvimento de
Software
Interesses
Requisitos
Orientado a Aspectos (DSOA)
Engenharia de requisitos
Sérgio Castelo Branco Soares
17
Sérgio Castelo Branco Soares
18
3
Passo 2: Implementar os
interesses
Interesses do Disque Saúde
„
Interface com o usuário
• interface com o usuário
• regras de negócio
Gerenciamento de dados
Distribuição
„
Regras de negócio
Controle de concorrência
19
20
Sérgio Castelo Branco Soares
Desenvolvimento de Software
Orientado a Aspectos
Passo 3: Recompor o sistema
aspectos e
tipos auxiliares
Outros (crosscutting concerns) como
aspectos
• distribuição, controle de concorrência,
armazenamento de dados
Sérgio Castelo Branco Soares
classes e
interfaces
Alguns concerns são bem modelados
como objetos (núcleo do sistema)
Programa
Identificador
de concerns Interesses
W
E
A
V
E
R
OOP
Requisitos
Sistema
executável
AOP
Requisitos funcionais
Gerenciamento de dados
Distribuição
21
Sérgio Castelo Branco Soares
Classes
Aspectos
Controle de concorrência
Interface com o usuário
22
Sérgio Castelo Branco Soares
Combinação (weaving) é
OOP vs AOP
usada para …
„
Compor o “núcleo” do sistema com os
aspectos
Sistema original
chamadas locais entre A e B
A
Requisitos funcionais
Controle de concorrência
Gerenciamento de dados
Distribuição
Interface com o usuário
Sistema distribuído
chamadas remotas entre A e B
23
Sérgio Castelo Branco Soares
Aspectos de
distribuição
B
Processo de
combinação
Sérgio Castelo Branco Soares
W
e
a
v
e
r
Weaver
A
B
Protocolo de distribução
24
4
Composição nos pontos
junção (join points)
Conjunto de pontos de
junção (pointcut)
Um método é
chamado
e
retorna ou lança
uma exceção
object A
um método é
chamado
e
retorna ou lança
uma exceção
de
„
object B
dispatch
um método executa
e
retorna ou lança
uma exceção
Comportamento pode
ser alterado nos pontos
de junção…
Expõe o contexto nos join points
„
Composição de pontos de junção
Fonte: AspectJ Tutorial
aspectj.org
25
Sérgio Castelo Branco Soares
• &&, || e !
Comportamento
transversal (advice)
nome do conjunto
de pontos de junção
„
Define código adicional que deve ser
executado…
• before
• after
pointcut facadeMethodsCall():
within(HttpServlet+) &&
—after returning
—after throwing
call(* IFacade+.*(..));
qualquer
método
26
Sérgio Castelo Branco Soares
AspectJ: identificando
chamadas de métodos da
fachada (servidor)
identifica
chamadas de …
„
—argumentos de métodos, objetos alvo, atributos
um método executa
e
retorna ou lança
uma exceção
identifica código
dentro da classe ...
Identifica pontos de junção de um sistema
• chamadas e execuções de métodos (e
construtores)
• acessos a atributos
• tratamento de exceções
• inicialização estática e dinâmica
dispatch
• ou around
com quaisquer
argumentos
Sérgio Castelo Branco Soares
27
pontos de junção
28
Sérgio Castelo Branco Soares
AspectJ: antes (before) de
chamar métodos da fachada
AspectJ: transformando
chamadas locais em remotas
private IFacade remoteFacade;
void around(Complaint c) throws Ex1,…:
before(): facadeMethodsCall() {
facadeMethodsCall() && args(c) &&
getRemoteInstance();
call(void update(Complaint))
}
{
synchronized void getRemoteInstance() {...
try { remoteFacade.update(c);
remoteFacade =
obtendo e utilizando
argumento de método
em um ponto de junção
} catch (RemoteException rmiEx) {...}
(IFacade) java.rmi.Naming.lookup(...);
}
...}
Sérgio Castelo Branco Soares
29
Sérgio Castelo Branco Soares
30
5
Além de mudanças (dinâmicas)
com comportamento
transversal…
„
AspectJ: mudanças estáticas
declare parents:
HealthWatcherFacade implements IFacade;
declare parents: Complaint || Person
implements java.io.Serializable;
AspectJ suporta mudanças estáticas
public static void
HealthWatcherFacade.main(String[] args){
• alterar relação de subtipo
• adicionar membros a classes
try {...
java.rmi.Naming.rebind("/HW");
Declarações
intertipos
Sérgio Castelo Branco Soares
} catch
...
Alterando a hierarquia de tipos
}
31
Aspecto de distribuição em
AspectJ
Adicionando o
método main
na classe
fachada
Sérgio Castelo Branco Soares
32
Aspectos de desenvolvimento:
debugging simples com AspectJ
public aspect DatabaseDebugging {
public aspect DistributionAspect {
declare parents: ...
pointcut queryExecution(String sql):
private IFacade remoteFacade;
public static void
HealthWatcherFacade.main(String[] as)...
pointcut facadeMethodsCall(): ...
before(): facadeMethodsCall() ...
private synchronized void
getRemoteInstance() ...
void around(Complaint complaint) ...
call(* Statement.*(String)) &&
args(sql);
before(String sql): queryExecution(sql) {
System.out.println(sql);
}
}
}
Sérgio Castelo Branco Soares
33
AspectJ: pontos positivos
„
„
„
„
Modularidade, reuso, e
extensibilidade de software
Inconsciência (obliviousness)
Suporte a desenvolvimento com IDEs
„
Novo paradigma
• relação entre classes e aspectos deve
ser minimizada
• inconsciência (obliviousness)
„
Projeto da linguagem
• tratamento de exceções
• conflitos entre aspectos
Produtividade
Permite implementação e testes
progressivos
Sérgio Castelo Branco Soares
34
AspectJ: pontos negativos
• debugging
„
Sérgio Castelo Branco Soares
„
„
35
Requer suporte de ferramentas
Combinação (apenas) estática
Sérgio Castelo Branco Soares
36
6
Pesquisas em DSOA
„
AOSD na indústria
Em todas as atividades ligadas ao
desenvolvimento de software
„
•
•
•
•
•
•
•
• requisitos, analise, projeto,
implementação e testes
„
Falta integrar as diversas pesquisas
na área
• teremos um “Processo de DSOA”?
Sérgio Castelo Branco Soares
Sérgio Castelo Branco Soares
Instituição financeira
„
• projeto médio (8 desenvolvedores)
• logging, transaction, violação de código
fonte
—logging de desempenho, framework para GUI
assíncrona e vários outros cc a implementar
• Projeto com mais de 15 pessoas
—uso de Spring para implementar cc
• projeto grande (12 desenvolvedores,
+1000 classes Java)
• violação de código fonte
• Projeto com 20 pessoas
—usa C# e pretende introduzir AOP
39
AOSD na indústria
„
Sérgio Castelo Branco Soares
Sérgio Castelo Branco Soares
40
AOSD na indústria
3 projetos no leste asiático
• mais de 40 pessoas em cada por mais de 2 anos
• redes domésticas, telecomunicações e
desenvolvimento de produtos eletrônicos para o
consumidor
• não apenas gerenciou crosscutting concerns,
mas separou código dependente de plataforma
do código independente de plataforma
• em dois deles, limitações de compilação
obrigaram o uso de adaptações OO para simular
AOP
Uma grande empresa (Dinamarca)
• Projeto com mais de 80 pessoas
CarnegieLearning.com
Sérgio Castelo Branco Soares
38
AOSD na indústria
Rápida consulta a listas de discussão
„
Spring AOP
JBoss AOP
AspectWerkz
PostSharp (.NET)
Compose*
EOS
Glassbox
vide referências no final
37
AOSD na indústria
„
Uso de ferramentas
„
Empresas conhecidas que usam AOP
• IBM
—mantém AspectJ
• Motorola
—WEAVR
• Microsoft
—Policy Injection Application Block
• CESAR
—Flip (Meantime) - SPL
41
Sérgio Castelo Branco Soares
42
7
Conclusão
„
Será que AOP vai pegar?
„
OO surgiu com Simula 67
Parece que vai...
• começou a ser disseminado na indústria
depois de ... 20 anos?
cada empresa deve avaliar seus riscos
adotar AOP em projetos menores
situações menos críticas
—padrões de projetos
„
AOP tem 10 anos
• algum uso em grandes empresas
Sérgio Castelo Branco Soares
43
Referências
Referências
„
„
„
„
„
„
„
Spring AOP (www.springframework.org)
JBoss AOP (labs.jboss.com/jbossaop)
AspectWerkz (aspectwerkz.codehaus.org)
PostSharp (www.postsharp.org)
EOS (www.cs.iastate.edu/~eos)
WEAVR (www.iit.edu/~concur/weavr)
• www.jot.fm/issues/issue_2007_08/article3.pdf
Policy Injection Application Block
(msdn2.microsoft.com/en-us/library/ Bb410104.aspx)
Sérgio Castelo Branco Soares
„
„
„
„
45
Gregor Kiczales et. al. Aspect-Oriented
Programming. European Conference on
Object-Oriented Programming,
ECOOP'97
http://groups.yahoo.com/group/asoc-br/
http://www.aosd.net/
http://www.eclipse.org/aspectj
46
Sérgio Castelo Branco Soares
Desenvolvimento de Software
Orientado a Aspectos:
Será que vai pegar?
Software Productivity Group
http://spg.dsc.upe.br/
Sérgio Soares
[email protected]
http://sergio.dsc.upe.br
DSC/UPE e CIn/UFPE
Sérgio Castelo Branco Soares
44
Sérgio Castelo Branco Soares
47
ESCOLA POLITÉCNICA
DE PERNAMBUCO
8
Download

Desenvolvimento de Software Orientado a Aspectos