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