ELAINE DA SILVA MONTEIRO Um Estudo Sobre Modelagem Orientada a Aspectos Baseada em AspectJ e UML Palmas – TO 2004 ii ELAINE DA SILVA MONTEIRO Um Estudo Sobre Modelagem Orientada a Aspectos Baseada em AspectJ e UML “Monografia apresentada como requisito parcial da disciplina Prática de Sistemas de Informação I (Estágio) do curso de Sistemas de Informação, orientada pela Cristina D’ornellas Filipakis” Palmas – TO 2004 Profª. iii ELAINE DA SILVA MONTEIRO Um Estudo Sobre Modelagem Orientada a Aspectos Baseada em AspectJ e UML “Monografia apresentada como requisito parcial da disciplina Prática de Sistemas de Informação I (Estágio) do curso de Sistemas de Informação, orientada pela Cristina D’ornellas Filipakis” BANCA EXAMINADORA Profª. Cristina D’ornellas Filipakis Centro Universitário Luterano de Palmas Prof. M.Sc. Fabiano Fagundes Centro Universitário Luterano de Palmas Prof. Jackson Gomes de Souza Centro Universitário Luterano de Palmas Palmas – TO 2004 Profª. iv Dedico este trabalho àqueles que sonham e, que com paixão, fazem de suas vidas um empenho para torná-los realidade. v AGRADECIMENTOS Antes de todas as coisas, agradeço a DEUS. Agradeço por colocar em meu coração grandes sonhos e por me capacitar a torná-los reais. Agradeço por sua doce presença em minha vida, que me estimula a prosseguir sempre, mesmo diante das maiores dificuldades. Vencer mais essa etapa não seria possível sem a ajuda das pessoas que para mim são (e serão sempre) muito especiais. Pessoas estas que com um simples gesto, ou olhar me fizeram acreditar e continuar. Não posso esquecer o esforço e empenho dedicados por parte dos meus pais, Nilo Cavalcante Monteiro e Maria de Jesus da Silva Monteiro, sei que sempre torceram por mim e vibram a cada conquista alcançada. Muito obrigada, o meu desejo é ser um motivo de orgulho para vocês. Quero agradecer, também, a minha tia Arcângela por sua preocupação e cuidado constantes. Neste tempo de faculdade encontrei grandes amigos, (alguns mais chegados que irmãos) estes fizeram da minha vida uma diversão à parte. Obrigada pelo companheirismo e espírito de equipe que nos levaram a perder noites e noites para nos dedicarmos ao estudo e algumas noites, também, para “desestressar” a cabeça. Em especial, agradeço ao Alessandro Brandão, Anderson Luiz, Danilo, Nábia, Nalva Neila, Paulo, Pollyane, Renatto e Victor, vocês fazem parte da minha alegria. Agradeço, ainda, aos professores que me fizeram valorizar o saber. Alguns foram mais adiante, foram conselheiros para vida. Este é o caso do Professor Fabiano, que nos meus momentos de insegurança e medo soube me motivar (as apresentações de trabalhos ilustram bem isso!!!). Sou muito grata pela Cristina, minha orientadora, por sua paciência e contribuições para a concretização deste trabalho. Muito Obrigada. i SUMÁRIO 1. INTRODUÇÃO ...................................................................................... 1 1.1 Objetivos do trabalho................................................................................... 3 1.2 Organização do trabalho ............................................................................. 3 2. REVISÃO DE LITERATURA ............................................................... 5 2.1 Abordagens Orientadas a Objetos .............................................................. 5 2.2 Abordagens Orientadas a Aspectos ............................................................ 7 2.2.1 Componentes ............................................. Erro! Indicador não definido. 2.2.2 Aspectos .................................................... Erro! Indicador não definido. 2.2.3 Benefícios da AOP .................................... Erro! Indicador não definido. 2.2.4 AspectJ ....................................................................................................... 9 2.2.4.1 Join points.......................................................................................... 11 2.2.4.2 Pointcuts ............................................................................................ 12 2.2.4.3 Advices .............................................................................................. 13 2.2.4.4 Introductions ...................................................................................... 14 2.2.4.5 Aspects............................................................................................... 14 2.3 A Importância da Modelagem................................................................... 17 2.3.1 UML ......................................................................................................... 18 2.3.1.1 Blocos de construção estrutural ......................................................... 19 2.3.1.1.1 Core............................................................................................. 19 2.3.1.1.2 Data Types .................................................................................. 21 2.3.1.1.3 Extension Mechanisms ............................................................... 22 2.3.1.2 Blocos de construção comportamental .............................................. 23 2.3.1.2.1 Common Behavior...................................................................... 23 2.3.1.2.2 Collaborations............................................................................. 23 ii 2.4 A Modelagem Orientada a Aspectos Baseada em AspectJ e UML........ 26 2.4.1 3. Representando construções do AspectJ em UML .................................... 26 2.4.1.1 Join points.......................................................................................... 27 2.4.1.2 Pointcuts ............................................................................................ 29 2.4.1.3 Advices .............................................................................................. 31 2.4.1.4 Introductions ...................................................................................... 33 2.4.1.5 Aspects............................................................................................... 35 MATERIAIS E MÉTODOS .................................................................. 38 3.1 Local e Período ........................................................................................... 38 3.2 Materiais...................................................................................................... 38 3.2.1 Hardware .................................................................................................. 39 3.2.2 Software.................................................................................................... 39 3.2.3 Fontes Bibliográficas................................................................................ 39 3.3 Metodologia................................................................................................. 39 4. RESULTADOS E DISCUSSÕES ........................................................ 40 5. CONSIDERAÇÕES FINAIS E TRABALHOS FUTUROS ................... 46 6. REFERÊNCIAS BIBLIOGRÁFICAS ................................................... 48 iii Lista de Figuras Figura 1 - Exemplo de herança entre os objetos ................................................................... 6 Figura 2 - Representação de um código entrelaçado (KICZALES, 2001)............................ 7 Figura 3 - Representação de um interesse multidimensional concentrado num aspecto (KICZALES, 2001) ................................................................................................................ 8 Figura 4 - Representação da estrutura do AspectJ............................................................... 10 Figura 5 - Fluxo de controle em AspectJ (KICZALES, 2001)............................................ 12 Figura 6 - Aspecto CPMF que atua sobre as transações de saque e transferência da classe Conta..................................................................................................................................... 15 Figura 7 - Classe Conta ....................................................................................................... 15 Figura 8 - Classe Teste ........................................................................................................ 16 Figura 9 - Resultado da compilação e execução do exemplo Banco .................................. 16 Figura 10 - Representação dos pacotes Behavioral Elements, Model Management e Foundation da especificação UML (OMG, 2000)................................................................ 19 Figura 11- Diagrama de Classes para o domínio Bancário ................................................. 21 Figura 12 - Exemplo de um estereótipo contendo tagged values........................................ 22 Figura 13 - Diagrama de Seqüência para o domínio Bancário............................................ 25 Figura 14 - Estrutura de um pointcut nomeado ................................................................... 29 Figura 15 - Estereótipo <<Pointcut>> para operação (STEIN, 2002)............................. 31 Figura 16 - Estrutura de um advice ..................................................................................... 32 Figura 17 - Estereótipo <<Advice>> para operação (STEIN, 2002).................................. 33 Figura 18 - Estereótipo <<Introduction>> para operação (STEIN, 2002)...................... 35 Figura 19 - Estereótipo <<Aspect>> para classe (STEIN, 2002)....................................... 37 Figura 20 - Modelagem do banco orientada a aspectos ...................................................... 41 Figura 21- Notação para implementação do corpo do advice around ................................. 42 iv Lista de Tabelas Tabela 1: PCDs baseados no tipo do join point (JP) .......................................................... 12 Tabela 2: PCDs baseados na propriedade do join point (JP).............................................. 13 Tabela 3: Valores para instâncias do aspecto ..................................................................... 36 v Lista de Abreviaturas AODM Aspect–Oriented Design Model AOP Aspect–Oriented Programming UML Unified Modeling Language vi RESUMO Este trabalho traz uma discussão sobre programação orientada a aspectos, mais especificamente sobre a linguagem de programação AspectJ e como os benefícios trazidos por esta abordagem podem favorecer não só a fase de implementação, mas também a modelagem de um sistema de software. Então, uma análise sobre a Modelagem Orientada a Aspectos – AODM, baseada em UML e AspectJ, será apresentada. Palavras chave: Modelagem orientada a aspectos, AspectJ, UML vii ABSTRACT This work brings a discussion about aspect oriented programming, more specifically about the AspectJ programming language and how the benefits introduced by this approach may foment not only the implementation phase, but too the modeling phase of software system. As soon, an analysis about Aspect-Oriented Design Model – AODM, based on AspectJ and UML, will be presented. Keywords: Aspect-Oriented Design Model, AspecJ and UML 1 1. INTRODUÇÃO Para que os objetivos traçados para a construção de um sistema de software sejam alcançados com eficácia, alguns critérios em relação à maneira como esse sistema será representado (nas fases de projeto e implementação) devem ser considerados, como a clareza na apresentação dos seus requisitos (tanto funcionais, como não-funcionais) e a separação destes em componentes específicos na modelagem e no código. Quando abordagens orientadas a objetos são utilizadas para o desenvolvimento de sistemas complexos, nota-se que os seus interesses (requisitos funcionais e não-funcionais) não são claramente separados em um nível adequado. Isso acontece porque existem propriedades que não devem ser encapsuladas totalmente numa unidade funcional, como uma classe, pois participam de várias dimensões do sistema (classes, objetos). Em conseqüência dessa característica, essas propriedades são denominadas interesses multidimensionais. De fato, as aplicações atuais superam os limites das técnicas de programação existentes. Por exemplo, há a necessidade crescente de que os softwares sejam construídos de maneira cada vez mais modularizada, pois isso traz melhorias tanto no desenvolvimento, como na manutenção desses softwares, possibilitando seu reuso posteriormente. No entanto, utilizando as técnicas de programação existentes, não há um mecanismo de abstração que suporte o encapsulamento completo de um interesse multidimensional. 2 Se não há uma separação adequada dos interesses comuns, ocorre o entrelaçamento entre interesses distintos no sistema. Este entrelaçamento causa dificuldade no desenvolvimento, na manutenção e no reuso de partes do código-fonte. No decorrer deste trabalho será utilizado um domínio bancário como ilustração, para que assim seja possível uma melhor assimilação dos conceitos nele abordados. Num sistema bancário, cada vez que um cliente invocar o método para sacar um valor em sua conta será necessário realizar algumas verificações quanto a segurança, persistência, integridade ou atomicidade das informações que esse cliente forneceu. Em abordagens orientadas a objetos, o código que implementa essas verificações fica intrínseco ao método, quando poderia estar em modúlos separados para facilitar a coesão interna e diminuir o acoplamento externo. Para resolver isto, foi desenvolvida uma nova técnica de programação - a Programação Orientada a Aspectos (Aspect-Oriented Programming - AOP), apresentando então o conceito de aspectos (KISELEV, 2002). Os aspectos são unidades que concentram os interesses multidimensionais. Várias abordagens vêm sendo propostas para tratar os aspectos, entre elas a mais disseminada é AspectJ, que permite uma maneira de implementar os interesses multidimensionais em separado no sistema de software. AspectJ é uma extensão do Java e provê algumas construções fundamentais que são: join points, pointcuts, advices, introductions e aspects. Aspects, os elementos principais dessa abordagem, podem alterar a estrutura estática ou dinâmica de um programa. A estrutura estática é alterada adicionando, por meio de introductions, membros (atributos, métodos ou construtores) ao código-fonte de uma classe, por exemplo. Já a alteração na estrutura dinâmica de um programa ocorre em tempo de execução por meio dos join points, os quais são selecionados por pointcuts e através da adição de comportamentos (advices) antes ou depois dos join points (KISELEV, 2002). A ferramenta AspectJ é eficaz quando trata da implementação de interesses multidimensionais. Em outras palavras, a fase de implementação é beneficiada pela separação dos interesses que são distintos no sistema. No entanto, é necessário que desde a fase de projeto a separação desses interesses seja clara e bem representada. Uma dificuldade encontrada é que as linguagens de modelagem atuais não provêm recursos para 3 isso. Então, uma nova abordagem foi proposta por STEIN (2002), baseada em AspectJ e UML – a Modelagem Orientada a Aspectos (Aspect-Oriented Design Model – AODM). Ela estende a UML (Unified Modeling Language) com recursos capazes de representar os efeitos causados por interesses multidimensionais. A UML é baseada em conceitos orientados a objetos e amplamente utilizada para o desenvolvimento de sistemas complexos. Um fator importante, que justifica seu uso para esta modelagem orientada a aspectos, é a possibilidade de extensão que a UML oferece através de um sub-pacote chamado “Extension Mechanisms” que traz os elementos: taggeds values, restrições e estereótipos. A proposta de STEIN (2002) utiliza os mecanismos de extensão “de forma a contemplar os conceitos desse paradigma conforme encontrados em AspectJ” (CHAVES, 2002). Cada construção encontrada no AspectJ (join points, pointcuts, advices, introductions e aspects) é, portanto, mapeada para a UML. 1.1 Objetivos do trabalho Este trabalho é apresentado como requisito parcial da disciplina Prática de Sistemas de Informação I (Estágio) do curso de Sistemas de Informação, orientado pela Profª. Cristina D’ornellas Filipakis e objetiva principalmente uma análise crítica da Modelagem Orientada a Aspectos proposta por (STEIN, 2002). Posto que essa abordagem é baseada em AspectJ e UML, são objetivos específicos trazer: • um estudo preliminar das principais construções do AspectJ; e • um estudo dos principais elementos do meta-modelo UML, utilizados na modelagem orientada a aspectos. 1.2 Organização do trabalho Este trabalho é organizado em seis capítulos. O próximo capítulo traz uma revisão de literatura, buscando um embasamento teórico. No capítulo três são descritos os materiais e métodos utilizados para o desenvolvimento deste trabalho. Os resultados e discussões alcançados através do estudo da modelagem orientada a aspectos são descritos no capítulo 4 quatro. O capítulo cinco traz as conclusões e trabalhos futuros e por fim, no capítulo seis, são listadas as referências bibliográficas consultadas. 5 2. REVISÃO DE LITERATURA No decorrer desta seção serão descritos os resultados dos estudos realizados acerca da revisão bibliográfica sobre as abordagens orientadas a objetos, a aspectos e sobre UML e AODM. 2.1 Abordagens Orientadas a Objetos A complexidade da programação está, em sua grande parte, no alto grau de acoplamento e na fraca coesão interna com a qual um software é construído. O acoplamento refere-se à dependência, que decorre da necessidade de uma comunicação de informações, entre os objetos de um sistema. A coesão refere-se ao grau de qualidade com que um conjunto de códigos se encaixam (LEE et. Al, 2001). Um alto acoplamento e fraca coesão resultam um sistema difícil de gerenciar, porque os interesses do sistema não são bem modularizados e isso acarreta um código-fonte confuso. Assim, mecanismos de abstrações são utilizados para tentar diminuir essa complexidade. A programação orientada a objetos traz como principal abstração o objeto. Um objeto é uma representação de uma entidade formada por atributos e métodos. Os métodos expressam ações sobre os atributos, ou seja, irão atuar sobre eles. O acesso aos atributos não é realizado diretamente pelos usuários do objeto. Em vez disso, são os métodos desse objeto que acessam seus atributos. Isso caracteriza um princípio importante da orientação a objetos – o encapsulamento. Outro princípio importante da orientação a objetos é a herança, que permite expressar elementos comuns entre as classes. Assim, uma classe que é similar a outra já antes 6 implementada pode ser facilmente definida através do reuso de partes semelhantes do código. Este mecanismo representa a generalização e especialização. A Figura abaixo demonstra um exemplo prático disso. O domínio apresentado é o de um sistema bancário, onde a classe usuario, uma generalização, possui as especializações funcionario e cliente. Uma especialização pode ter novos atributos e métodos incluídos ou, ainda, estender os métodos herdados. Figura 1 - Exemplo de herança entre os objetos Essas características relacionadas acima trouxeram grande evolução na forma de implementar sistemas e, atualmente, a orientação a objetos é uma técnica bastante aceita e amplamente utilizada por desenvolvedores. Esta evolução se deu porque a implementação ficou mais “limpa”, já que atributos e métodos são encapsulados numa mesma unidade funcional, o objeto, e este é agrupado num domínio comum, a classe. Como conseqüência disso, melhorias foram notadas também quanto à manutenção e reuso de partes do código do sistema implementado. Entretanto, existem propriedades que não se enquadram em componentes da decomposição funcional, tais como: tratamento de exceções, restrições de tempo real, distribuição e controle de concorrência. Elas, normalmente, estão espalhadas em diversos componentes do sistema, afetando a performance ou a semântica da aplicação (PIVETA, 7 2001). Estas propriedades, de forma geral, estão relacionadas a sistemas muito complexos e mesmo com o uso de elementos da engenharia de software ou padrões de projeto, continuam espalhadas pelo sistema, ocasionando um fenômeno chamado código entrelaçado. Assim, quando houver a necessidade de mudança em algumas dessas propriedades, será necessário alterar todas as partes que são atingidas por elas. Isso acarreta: • a repetição desnecessária de código; • a diminuição da legibilidade do código; • a diminuição da capacidade de reuso do código. A Figura 2 representa bem esta característica. Figura 2 - Representação de um código entrelaçado (KICZALES, 2001) As barras representam as classes e as linhas vermelhas os interesses multidimensionais. Para tanto, um novo mecanismo de abstração foi desenvolvido, o aspecto. A abordagem orientada a aspectos é o tema das próximas seções. 2.2 Abordagens Orientadas a Aspectos 8 A orientação a aspectos é uma proposta de solução para os problemas causados pela ineficiência dos atuais paradigmas de programação em prover a modularização adequada dos interesses multidimensionais no desenvolvimento de software. Ela propõe uma separação clara dos interesses multidimensionais num sistema, de forma a evitar o entrelaçamento de interesses distintos. E por meio de um combinador (weaving), possibilita recompor tais interesses, resultando num sistema de software com interesses bem modularizados. A finalidade da AOP não é substituir as técnicas orientadas a objetos, mas complementá-las para possibilitar a separação dos interesses multidimensionais em uma unidade - o aspecto. O aspecto permite que mudanças, quando necessárias, sejam definidas no código-fonte de um sistema de forma menos invasiva (seja em sua estrutura ou em seu comportamento). Assim, é possível alcançar a modularização, beneficiando tanto o desenvolvimento como a manutenção de um sistema. A seguir a Figura 3 traz essa representação. Figura 3 - Representação de um interesse multidimensional concentrado num aspecto (KICZALES, 2001) Uma implementação básica em AOP compreende (PIVETA, 2001): • uma linguagem de componentes para a programação de componentes; • uma ou mais linguagens de aspectos para a programação de aspectos; 9 • um combinador de aspectos (aspect weaver) para a combinação das linguagens; • um programa escrito na linguagem de componentes; e • um ou mais programas escritos na linguagem de aspectos. Os requisitos funcionais, normalmente, são organizados em um conjunto de componentes expresso por uma linguagem de programação orientada a objetos e os requisitos não–funcionais (ou interesses multidimensionais) são organizados em aspectos (KISELEV, 2002). KICZALES (1997) separa os interesses de um sistema em componentes e aspectos: • Componentes são elementos que podem ser encapsulados de forma clara em uma unidade de função. Procedimentos, métodos, objetos, classes ou APIs são exemplos dessas unidades. No contexto do sistema bancário, tem-se: sacar, ver saldo, ver extrato e transferir como ilustração. • Aspectos são propriedades que afetam a performance ou semântica dos componentes. Tratamento de exceções, consistência de dados, segurança são citados como exemplos de aspectos. Por meio da separação dos interesses em componentes e aspectos, a AOP permite uma modularização na construção do sistema de software. Como conseqüência desta modularização torna-se mais fácil escrever, compreender, reutilizar e manter um sistema, porque seu código torna-se mais limpo e simples. 2.2.1 AspectJ Várias abordagens vêm sendo propostas para implementar aspectos, dentre elas pode-se destacar HyperJ, programação orientada a assuntos (SOP), AspectC e AspectJ. Neste trabalho, o enfoque será para AspectJ, já que o objetivo é o estudo da modelagem orientada a aspectos (STEIN, 2002) que é baseada em AspectJ e UML. Esta seção traz os conceitos principais desta abordagem. 10 AspectJ (AspectJ, 2004) é uma ferramenta bem aceita por estender a linguagem de programação Java com construções eficientes para a implementação de interesses multidimensionais em separado num sistema de software e por ser de uso geral, por meio dela, pode-se definir a implementação de aspectos em vários pontos de um programa. Esta é uma proposta do Palo Alto Research Center, tradicional centro de pesquisas da Xerox. Em AspectJ, Java é a linguagem de componentes utilizada, a linguagem de aspectos é genérica, possibilitando ao desenvolvedor especificar instruções nos seguintes pontos de combinação: • execução de métodos; • recebimento de chamadas a construtores; • execução de construtores; • acesso a campos; e • execução de manipuladores de exceção. A Figura 4 apresenta a estrutura do AspectJ, na qual as classes são implementadas na sintaxe da linguagem Java e os aspectos na sintaxe da linguagem AspectJ, ambos são combinados através do weaver e, então, um novo programa é resultado para proceder, em seguida, a sua execução. Programa Componentes Weaver Aspectos Figura 4 - Representação da estrutura do AspectJ A função do weaver (combinador de aspectos) é identificar nos componentes pontos de junção onde os aspectos se aplicam, produzindo o código final da aplicação, que 11 implementa tanto as propriedades definidas pelos componentes como aquelas definidas pelos aspectos. Combinadores podem atuar em tempo de compilação ou de execução. Implementações de combinadores em tempo de execução têm a possibilidade interessante de permitir a adição / exclusão de aspectos com a aplicação em pleno funcionamento (CHAVES, 2002). Os elementos básicos em AspectJ são: join points, pointcuts, advices, introductions e aspects. A seguir, seus conceitos serão estudados e exemplificados por meio da ilustração de um aspecto que, num domínio bancário, calcula a CPMF sempre que os métodos sacar() e transferir() forem executados na classe conta. 2.2.1.1 Join points Os join points são os pontos na execução de um programa de componentes nos quais os aspectos serão aplicados. São conceitos abstratos em AspectJ, pois não possuem nenhuma construção de programa para representá-lo. Conforme mostra a Figura 5, o modelo de join points do AspectJ é baseado em um grafo dirigido de envio de mensagens a objetos. Os nós seriam os pontos onde as classes e objetos recebem uma invocação de método ou têm um atributo acessado. Os vértices representariam as relações de fluxo de controle entre os nós, partindo do que chama para o que é chamado. O fluxo de controle, na realidade, ocorre nos dois sentidos: no sentido do vértice, quando a ação é iniciada, e no sentido contrário, quando a ação realizada pelo subnó estiver concluída (STEIN, 2002). Isto significa que um join point pode estar em uma das direções do fluxo de controle, ou seja, quando uma ação é iniciada e quando uma ação é terminada. 12 O método é chamado e retorna ou traz uma exceção O método é chamado e retorna ou traz uma exceção O método executa e retorna ou traz uma exceção Figura 5 - Fluxo de controle em AspectJ (KICZALES, 2001) 2.2.1.2 Pointcuts Os pointcuts são responsáveis por selecionar join points, ou seja, eles detectam em quais join points o aspecto deve interceptar. Um pointcut é nomeado através de designadores (Pointcut designator - PCD), que podem ser primitivos ou derivados (os programadores podem criar novos tipos a partir dos existentes). Um designador de pointcut primitivo abrange o tipo, a propriedade e a combinação dos join points. As tabelas abaixo mostram os designadores primitivos principais suportados pelo AspectJ (CHAVES, 2002). Tabela 1: PCDs baseados no tipo do join point (JP) PCD Pontos de junção selecionados Call(<ass. De método>) Quando o método é chamado execution(<ass. De método>) Quando o método é executado get(<ass. De atributo>) Quando o atributo é acessado set(<ass. De atributo>) Quando o atributo é alterado Handler(<tipo exceção>) Quando a exceção é tratada Initialization(<ass.construtor>) Quando o construtor é executado StaticInitialization(<tipo>) Quando a inicialização de classe é executada 13 Tabela 2: PCDs baseados na propriedade do join point (JP) PCD Pontos de junção selecionados Within(Tipo) Qualquer JP que ocorra na classe Withincode(Método) Qualquer JP que ocorra no método/construtor Cflow(Pointcut) Qualquer JP que ocorra no contexto de um JP selecionado pelo PCD Idem ao anterior, excluindo os JPs selecionados pelo Cflowbelow(Pointcut) próprio PCD this(Tipo) Qualquer JP que ocorra em um objeto da classe Target(Tipo) Quando o objeto alvo do call/get/set é da classe args(Tipo, ...) Quando os argumentos são do tipo especificado If(ExpressãoLógica) Quando a expressão é verdadeira Os pointcuts suportam os símbolos *,+,.., . para a especificação de um join point. Assim: execution(* sacar(..)) seleciona os join points onde o método sacar, independentemente do tipo, e de zero ou mais argumentos, seja executado. Um pointcut é definido da seguinte forma: Pointcut <Nome> (Argumentos): <corpo>; Um pointcut pode ser aninhado em outro pointcut com os operadores e, ou e não (&&, ||, e !). 2.2.1.3 Advices Os pointcuts apenas selecionam os join points. Para implementar realmente os comportamentos multidimensionais é usado o advice, que é um trecho de código que executa a cada join point descrito no pointcut. Existem três formas de advice, o before, around e after. Como seus nomes sugerem, before executa antes do join point, around executa antes e após e after executa após. Um advice é definido da seguinte forma: 14 TipoAdvice([ListaParâmetros]) : Pointcut {<Corpo>} Os advices around substituem o comportamento original do ponto de junção. Para isso, a linguagem oferece o comando proceed(), o qual permite que o comportamento original seja substituído e, ainda, que comportamentos adicionais sejam realizados antes e após o comportamento original do join point selecionado (CHAVES, 2002). 2.2.1.4 Introductions O AspectJ provê uma maneira de alterar a estrutura estática de uma aplicação, isto ocorre por meio das declarações inter-types que são descritas como interesses estáticos (static crosscutting). Estas declarações provêm uma construção chamada introduction. Os introductions modificam uma classe estruturalmente, acrescentando a ela novos membros, como construtores, métodos e campos por meio da cláusula declare parents. Assim como advices irão atuar em pontos específicos do programa denotados por pointcuts, introductions irão atuar sobre um conjunto de definições de classes (STEIN, 2002). 2.2.1.5 Aspects Aspects encapsulam pointcuts, advices e introductions em uma unidade modular de implementação. São definidos de maneira semelhante às classes, enquanto estas encapsulam o código que encaixa dentro de classes hierárquicas, aspects encapsulam o código que é ortogonal a essas classes hierárquicas. Embora o comportamento especificado pelos advices e introductions declarados modifiquem o sistema ortogonalmente, eles sempre são localizados no código-fonte dos aspectos. Abaixo, na Figura 6, segue como deve ser a estrutura da sintaxe de um aspecto. Os pontos em negrito na classe base ilustrada na Figura 7 representam os join points e o advice designado neste exemplo é o around. Portanto, o código que implementa os comportamentos multidimensionais irá atuar antes e após esses pontos. Para isso, é utilizado o domínio bancário, no qual a cada vez que o método sacar e tranferir for 15 executado deve-se cobrar a CPMF. Esta cobrança é implementada no aspecto. 1 Public aspect CPMF{ 2 pointcut creditos(Conta c,double valor): 3 ( 4 (execution(* sacar(..)) && args(valor)) || 5 (execution(* transferir(*,double)) && args(*,valor)) 6 ) && target(c) 7 ; 8 void around (Conta c, double valor):creditos(c, valor){ 9 System.out.println("Valor retirado: "+valor); 10 double CPMF = valor - valor*(1-0.0037); 11 proceed(c,valor); 12 c.setSaldo(c.getSaldo()-CPMF); 13 System.out.println("Valor retirado: "+valor); 14 System.out.println("CPMF: "+CPMF); 15 16 } } Figura 6 - Aspecto CPMF que atua sobre as transações de saque e transferência da classe Conta 1 Public class Conta{ 2 Double saldo; 3 Public void setSaldo(double aSaldo){ 4 saldo = aSaldo; 5 } 6 Public double getSaldo(){ 7 return saldo; 8 } 9 Public void sacar(double valor){ 10 setSaldo(getSaldo()-valor); 11 } 12 Public void transferir(Conta destino, double valor){ 13 setSaldo(getSaldo()-valor); 14 destino.setSaldo(destino.getSaldo()+valor); 15 16 } } Figura 7 - Classe Conta 16 A classe ilustrada na Figura 8 é utilizada para testar o aspecto CPMF. 1 public class Teste{ 2 public static void main(String args[]){ 3 Conta c = new Conta(); 4 c.setSaldo(500); 5 System.out.println("Saldo Atual:"+c.getSaldo()); 6 c.sacar(200); 7 System.out.println("Saldo Atual:"+c.getSaldo()); 8 c.transferir(new Conta(),200); 9 System.out.println("Saldo Atual:"+c.getSaldo()); 10 11 } } Figura 8 - Classe Teste Abaixo, na Figura 9, é apresentado o resultado da compilação e execução do aspecto CPMF e das classes Conta e Teste. Para compilar este exemplo, foi utilizado o comando ajc, (que se refere ao compilador do AspectJ) e logo após, para executar a classe Teste o comando java foi utilizado. Figura 9 - Resultado da compilação e execução do exemplo Banco 17 2.3 A Importância da Modelagem A modelagem traz consigo uma notável contribuição para tornar viável e fácil o entendimento de eventos do mundo real em todas as suas áreas. Isto acontece porque ela apresenta uma abstração de um problema a ser tratado, ou seja, especifica um foco do problema e deixa de lado aspectos irrelevantes para determinada situação. Desta forma, possibilita que detalhes antes ignorados possam ser vistos e solucionados com mais minuciosidade e cuidado. Em sistemas computacionais, torna-se mais visível a necessidade do uso da modelagem à medida que os sistemas de software se mostram mais complexos. Contudo, nada impede que em sistemas de softwares mais triviais o uso da modelagem seja realizado. Vários recursos são utilizados para o desenvolvimento de um software (pessoas, ferramentas, dinheiro). Sistemas de software complexos apresentam uma maior quantidade de recursos envolvidos e isso traz uma conseqüênte necessidade de prover melhor a comunicação entre as partes que o desenvolvem. O êxito para o desenvolvimento de um sistema de software está, em grande parte, na contribuição que a modelagem traz, pois ela garante uma comunicação unificada entre os desenvolvedores e evita discrepâncias de informações ou ambigüidades. A modelagem é uma técnica da engenharia, mas não está restrita apenas a ela. É possível avaliar sistemas por meio dos resultados estatísticos da simulação de modelos, pois são “a simplificação da realidade” (BOOCH et Al, 2000). Uma modelagem apresentará bons resultados se alguns princípios forem seguidos. Esses princípios são listados abaixo (BOOCH et Al, 2000): • a escolha dos modelos a serem criados influencia sobre a maneira como um determinado problema será atacado e como uma solução é definida; • cada modelo poderá ser expresso em diferentes níveis de precisão; • os melhores modelos estão relacionados à realidade; e • nenhum modelo único é suficiente. Qualquer sistema não-trivial será melhor investigado por meio de um pequeno conjunto de modelos quase independentes. 18 A forma como os modelos são escolhidos, ou seja, qual realidade irão representar e em que nível de abstração irão corresponder a essa realidade, bem como a quantidade de modelos necessária são fatores que devem ser definidos cautelosamente, para que se aproximem ao máximo do mundo real e então se alcancem soluções eficientes e previstas para os problemas do domínio do sistema a ser implementado. A próxima seção traz um estudo sobre a arquitetura UML, abordando seus principais conceitos, vistos em seu meta-modelo, que serão estendidos para a AODM. 2.3.1 UML A linguagem de modelagem UML (Unified Modeling Language) traz em sua especificação recursos capazes de projetar sistemas de software de maneira estruturada e padronizada. Estes recursos são eficientes para modelar cada fase do ciclo de vida do software, que compreende as fases de análise, projeto, implementação e manutenção. A UML é baseada em técnicas orientadas a objetos e destina-se à visualização, especificação, construção e documentação dos artefatos de um sistema de software (BOOCH et Al, 2000). Modelos representados graficamente tornam mais dinâmica a visão e a compreensão sobre um determinado domínio, mesmo por parte de outro desenvolvedor ou ferramenta. Modelos específicos são mais restritos e, por consegüinte, mais precisos. Isso ameniza a probabilidade de ambigüidades num projeto. Os modelos da linguagem UML podem ser ligados a várias linguagens de programação (Java, C++, Smalltalk), logo, a partir de um modelo UML pode-se gerar um código numa linguagem de programação. O processo inverso também acontece, ou seja, é possível reconstruir um modelo a partir de sua implementação. Quanto à documentação, a UML aborda os requisitos, a arquitetura do sistema e as atividades de testes (BOOCH et Al, 2000). A UML, em seu meta-modelo, apresenta os blocos de construção básicos. Estes blocos são abstrações, relacionamentos e diagramas. Abstrações representam aspectos estruturais e comportamentais de um sistema, relacionamentos declaram como essas 19 abstrações se relacionam e diagramas apresentam um resumo do conjunto de abstrações e seus relacionamentos (STEIN, 2002). A Figura 10 representa os pacotes Foundation e Behavioral Elements da arquitetura UML. O primeiro provê os blocos de construção estrutural, já o segundo traz os recursos necessários para modelar comportamentos dinâmicos. Figura 10 - Representação dos pacotes Behavioral Elements, Model Management e Foundation da especificação UML (OMG, 2000) 2.3.1.1 Blocos de construção estrutural Os blocos de construção estrutural são definidos no pacote Foundation da arquitetura UML. Este pacote é dividido em três sub-pacotes que são Core, Data Types, Extension Mechanisms (STEIN, 2002). Os próximos parágrafos trazem um esboço sobre esses sub-pacotes. 2.3.1.1.1 Core 20 O pacote Core abrange os conceitos necessários para descrever a estrutura estática dos modelos. Isto é feito por meio dos classificadores e relacionamentos. Classificadores são os elementos modelos que trazem as características estruturais e/ou comportamentais, tais como atributos e métodos. Classes e interfaces são exemplos de elementos modelos (STEIN, 2002). Os elementos modelos são ligados por relacionamentos, como associações, generalizações e dependências. Abaixo seguem as definições elementares para estes relacionamentos, segundo (BOOCH et Al, 2000), a Figura 11 traz uma exemplificação destes conceitos. Associações definem relacionamentos semânticos entre dois ou mais elementos modelos. Um tipo especial de associação é a agregação, ela define um elemento modelo como sendo parte de outro. Em outras palavras, um relacionamento entre todos e partes (este trabalho é constituído por capítulos e seções, por exemplo). Cada associação pode especificar um conjunto de meta-propriedades como visibilidade e multiplicidade. Graficamente uma associação é representada como uma linha que, normalmente, contém o nome dos papéis e multiplicidades que representa. Generalizações são relacionamentos de herança entre um elemento mais geral e um mais específico. Graficamente a generalização é representada por uma linha com uma seta apontando para o elemento mais geral. Dependências são relacionamentos semânticos entre dois elementos modelos que permitem que uma alteração no elemento modelo independente possa afetar a semântica do elemento modelo dependente. Graficamente, uma dependência é representada por linhas tracejadas, possivelmente com setas. Elementos modelos especificados no pacote Core UML são, de forma geral, visualizados em diagramas de classes, pois eles mostram um conjunto de classes, interfaces, colaborações e seus relacionamentos. 21 Figura 11- Diagrama de Classes para o domínio Bancário O diagrama de classes representado acima modela um domínio bancário e traz as classes Banco, Usuario com as classes especializadas Funcionario e Cliente, Conta com as classes especializadas Poupanca e Corrente, CaixaRapido com a classe especializada ContaUniversitaria. Estas especializações são ligadas às suas classes superiores pelo relacionamento de generalização. Para a classe ContaUniversitaria existe uma restrição (ser universitário), ela é representada por uma nota ligada a esta classe. 2.3.1.1.2 Data Types O pacote Data Types especifica os diferentes tipos de dados que são usados para definir a UML, e são usados para designar os tipos que serão aceitos para os atributos das classes, por exemplo (a nível do meta-modelo UML e não de usuário). 22 2.3.1.1.3 Extension Mechanisms O paco te Extension Mechanisms possibilita estender os blocos de construção existentes em UML, com novas meta-propriedades e novas semânticas. Isto é realizado por meio de taggeds values e restrições. Os taggeds values são usados para atribuir uma informação qualquer a um elemento modelo. Esta informação pode ser quanto à gerência, geração de código ou semântica adicional requerida por um determinado estereótipo. Com restrições, novas semânticas podem ser especificadas para um elemento modelo, ou seja, a criação de uma regra ou alteração de uma existente. A UML pode ser estendida com novos blocos de construção que são derivados de outros existentes, aos novos blocos dá-se o nome de estereótipos (STEIN, 2002). Taggeds values e restrições são representados entre chaves {} (por exemplo: {tag=valor} e {restrição}). Estereótipos são representados entre os símbolos << >> (por exemplo: <<aspect>>). A Figura 12 ilustra um exemplo prático do uso desses mecanismos de extensão. Um novo estereótipo para uma classe, chamado <<aspect>>, é criado. Este estereótipo requer novas propriedades, assim taggeds values são utilizadas para conter essas propriedades (instantiation, base, privileged). Estereótipos para operações também são criados, estes são denominados pointcut e advice. <<aspect>> CPMF {instantiation=perJVM} {base=undefined} {privileged=false} - Attributos - Operações <<pointcut>> pointcut creditos(Conta c, double valor) <<advice>> around (Conta c,double valorlor) Figura 12 - Exemplo de um estereótipo contendo tagged values 23 2.3.1.2 Blocos de construção comportamental Os pacotes Behavioral Elements trazem os recursos necessários para modelar comportamentos dinâmicos em UML. Este pacote é dividido nos sub-pacotes Common Behavior, Collaborations, Use Case, State Machines e Activity Graphs (STEIN, 2002). Somente os dois primeiros serão relatados nesse trabalho, visto que apenas estes serão tratados no estudo da modelagem orientada a aspectos – AODM. 2.3.1.2.1 Common Behavior Este pacote tem por finalidade dar suporte à parte comportamental de um projeto, sendo assim, ele trata basicamente do elemento ação. Em UML, uma ação é “uma especificação abstrata de uma instrução executável” (STEIN, 2002). Criação e destruição de um objeto, chamada de operações, acesso a atributos, são exemplos de ações que a UML suporta. No meta-modelo UML, estas ações são realizadas por um elemento chamado stimuli, que é responsável por concretizar uma comunicação entre duas instâncias. Em UML a comunicação entre duas instâncias só acontece se as instâncias são ligadas por um link. Um link é uma instância de uma associação em tempo de execução. 2.3.1.2.2 Collaborations O pacote Collaborations descreve os conceitos necessários para expressar como diferentes elementos modelos interagem uns com os outros para executar uma tarefa. Então, este pacote define as características e relacionamentos que instâncias de elementos modelos participantes na colaboração devem ter para completar com sucesso uma tarefa (STEIN, 2002). Uma colaboração define uma interação especificando os detalhes de comunicação entre as instâncias participantes para executar uma tarefa. Em interações, comunicações são 24 especificadas por meio de mensagens para definir as instâncias (remetente e destinatário) (STEIN, 2002). Em UML, colaborações são especificadas por diagramas de seqüência e diagramas de colaborações. Abaixo seguem alguns conceitos fundamentais, segundo (BOOCH et Al, 2000). Diagramas de seqüência apresentam uma ordenação clara das comunicações realizadas dentro de uma colaboração. Como pode-se observar na Figura 13, um diagrama de seqüência é representado graficamente colocando-se os objetos que participam da interação no eixo X e as mensagens no eixo Y de uma tabela. Duas características especiais nestes diagramas são o uso da representação de linhas de vida e a existência do fluxo de controle. A linha de vida de um objeto é uma linha tracejada na vertical que define a existência de um objeto num período de tempo. O foco de controle é um retângulo, sobre a linha de vida, que define o período que um objeto desempenha uma ação. Enquanto diagramas de seqüência enfatizam a ordem cronológica de interações de uma colaboração, diagramas de colaboração enfatizam o contexto estrutural dessas interações, o foco principal do diagrama de colaboração é a organização dos objetos que participam de uma interação. Contudo, neste trabalho, os diagramas de colaração não serão tratados detalhadamente, pois na modelagem orientada a aspectos proposta por (STEIN, 2002) eles não foram realmente utilizados para representar as construções de programa do AspectJ. 25 Figura 13 - Diagrama de Seqüência para o domínio Bancário Esse diagrama de seqüência especifica as etapas para o caso de uso sacar. Assim, inicialmente, o controle solicita os dados do cartão à fronteira do sistema, que por sua vez, solicita ao cliente que passe o cartão. O cliente passa o cartão e os dados são enviados ao controle que faz a validação sobre estes dados. Para realizar isso, os dados do cliente são transmitidos para a fronteira do banco, que os envia para o sistema central. O controle 26 solicita à fronteira do sistema a senha do usuário, então a fronteira do sistema solicita que o usuário digite a senha. O cliente digita a senha e envia a fronteira do sistema, esta envia a senha ao controle para que ele faça a verificação. Se a senha for incorreta o usuário deverá redigitar (caso digite a senha errada por três vezes, a conta será cancelada), senão deverá informar a transação, se for um saque deverá informar também o valor a ser retirado à fronteira do sistema. Mais uma vez a fronteira do sistema envia estes dados ao controle, que irá verificar o balanço, ou seja, se realmente o cliente tem saldo positivo para executar esta ação. Se a resposta for falsa o cliente deverá digitar outro valor, se não, se for verdadeira o valor é liberado. Depois que os elementos básicos da arquitetura UML foram tratados, na próxima seção será realizado um estudo sobre como esses elementos foram estendidos para desenvolver a AODM. Os próximos paragráfos trazem conceitos principais e representações de aspectos. 2.4 A Modelagem Orientada a Aspectos Baseada em AspectJ e UML Para desenvolver a modelagem orientada a aspectos, (STEIN, 2002) analisou cada construção de programa do AspectJ e as comparou com os elementos modelos existentes no meta-modelo UML, de forma a verificar quais desses elementos modelos seriam mais adequados para representar as construções do AspectJ. Com a ajuda dos recursos para extensões que a UML provê (já vistos na seção 2.4.1.1.3), estereótipos adicionais e novas semânticas foram trazidos à especificação UML. Desta forma, foi possível representar os efeitos dos interesses multidimensionais sobre as classes que atravessam, por meio de uma notação gráfica, em tempo de projeto. Nesta seção, será mostrado um estudo sobre a representação UML para as construções de AspectJ. 2.4.1 Representando construções do AspectJ em UML 27 2.4.1.1 Join points Ainda que os join points não tenham uma construção de programa específica em AspectJ, é interessante que na modelagem orientada a aspectos eles sejam representados para denotar os pontos de atuação do código multidimensional. (STEIN, 2002) relata que o modelo dos join points baseia-se em quatro principais tipos de ações nos quais os aspectos podem atuar, que são: • criação de objetos; • invocação de métodos; • acesso a campos; e • tratamento de exceções. Desta forma, ele buscou uma semelhança no meta-modelo UML e constatou que UML percebe as ações de criação, invocação, atribuição e envio de um objeto. É necessário lembrar que um join point pode afetar uma ação quando ela é iniciada e quando é terminada, por isso é inviável que os join points sejam representados por estas ações diretamente. Outro motivo que impossibilita isso é que uma ação, em UML, “representa uma especificação estática em vez de uma execução dinâmica” (STEIN, 2002). É necessário que o elemento modelo que represente um join point seja semelhante a um ponto distinto na execução dinâmica de um programa, pois esta é a sua principal característica. Logo, um elemento modelo proposto para essa representação foi um link, que é uma instância de uma associação em tempo de execução (Links são especificados no pacote Common Behavior da especificação UML, conforme descrito na seção anterior 2.3.1.2.1 “Common Behavior”). Ele é adequado para esta representação porque é usado para transmitir uma comunicação entre duas instâncias e pode ser interpretado como vértice de um grafo, no qual o fluxo de controle passa duas vezes: uma quando a comunicação é enviada e outra depois que a comunicação é completada (STEIN, 2002). Porém, nem sempre um link pode ser interpretado como um join point. Somente quando é utilizado para concretizar a comunicação entre duas instâncias que englobam a invocação de um método, a criação de um objeto ou o tratamento de uma exceção (estas 28 são as ações sobre as quais o modelo de join points se baseia). Quando um link é utilizado para destruir uma instância, por exemplo, ele não representa um join point (STEIN, 2002). Para visualizar estas comunicações, o elemento modelo mensagens é utilizado. Mensagens são especificadas no pacote Collaborations do meta-modelo UML (como visto na seção 2.4.1.2.2) e são representadas graficamente como setas no diagrama de interação. Quando join points são modelados, percebe-se que alguns elementos do AspectJ não possuem representação direta no meta-modelo UML. De acordo com STEIN (2002), para algumas das ações UML vários join points são definidos. Por exemplo, para ações de criação de objetos o AspectJ define join points para chamada, execução e inicialização, e para ações de invocação de métodos são definidos join points para chamada e execução. Isto ocorre porque, em AspectJ, essas ações precisam ser distintas para permitir maior exatidão em relação à designação dos interesses multidimensionais. A UML não diferencia a inicialização e a execução atual de uma ação. Na realidade ela trata a execução de construtores/métodos e inicialização de classes/objetos por meio de ações uninterpretadas. Ações uninterpretadas são elementos modelos da especificação UML que servem para “tratar ações que não correspondem a chamadas e envios de mensagem, e nem são facilmente categorizadas em outros tipos de ações” (OMG, 2000). Assim, os estereótipos <<Initialize>> e <<Execute>> foram definidos para possibilitar que a execução de construtores/métodos e inicialização de classes/objetos sejam representados distintamente em UML, ou seja, sem ser de forma uninterpretada; dessa forma podem-se definir os pontos de atuação dos aspectos. Em UML, ações de acesso a campo não utilizam nenhum link para representar um join point, isso porque tais ações não representam uma comunicação entre instâncias. Para representar esses join points os desenvolvedores devem definir operações especiais para cada atributo da classe, estas operações são set e get. Assim, em vez de uma ação de acesso, uma ação de chamada é usada para acessar o campo; para diferenciar essa ação de chamada das demais elas são classificadas nos estereótipos <<set>> e <<get>>. Assim, obtém-se um link utilizado para esta ação que pode ser identificado como um join point (STEIN, 2002). 29 2.4.1.2 Pointcuts Um poincut é responsável por selecionar os join points, ou seja, os pontos de atuação de um código multidimensional, que, como já visto anteriormente, são implementados no corpo do advice. Ao se modelar um pointcut, essas informações não devem ser relevadas. Como STEIN (2002) declara, um pointcut é tanto um membro de um aspecto, como uma instrução para o processo weaving, pois mostra a esse processo em que pontos o advice irá executar seu código multidimensional. Sendo assim, um pointcut deve ser representado preservando essas duas características. A Figura 14 representa a estrutura de um pointcut, que é dividida em duas partes: a primeira é a assinatura do pointcut, que contém o nome e a lista de parâmetros e a segunda é a sua declaração, formada pelos pointcut designators que podem estar concatenados por meio dos operadores booleanos (&&, ||, e !). Pointcut creditos(Conta c,double valor): Assinatura ((execution(*sacar(..))&&target(c); Declaração pointcut Figura 14 - Estrutura de um pointcut nomeado Representar um pointcut no sentido de um membro de um aspecto é relativamente simples. Ele é denotado como uma operação de um aspecto, devido a sua semelhança estrutural com relação às operações padrões da especificação UML. Para isso, um novo estereótipo para operações é apresentado ao meta-modelo UML chamado <<pointcut>>. Para representar um pointcut no sentido de uma instrução para o processo weaving (processo que combina os componentes e aspectos de um sistema), um novo meta-atributo é definido por meio de taggeds values para conter essa instrução. Como visto anteriormente, na seção 2.3.1.1.3, taggeds values podem ser usados para representar uma informação tais como de gerência, geração de código ou semântica adicional que é requerida por um determinado estereótipo. Taggeds values são adequados para representar os pointcuts em sua função de weaving através de duas formas (STEIN, 2002): 30 • Quando taggeds values são utilizados para represesentar informações de geração de código; e • Quando um estereótipo é definido para a meta-classe method da especificação UML, que requer a presença de um particular tagged value. (STEIN, 2002) propõe <<containsWeavingInstructions>>, um estereótipo para métodos chamado para conter os pontos de atuação dos aspectos, ou seja, as instruções para o processo weaving. Para tanto faz-se necessário a definição de uma meta-propriedade, que é chamada “base” que irá conter essas instruções. Para definir esta meta-propriedade “base”, um novo tipo de dado deve ser apresentado ao meta-modelo UML para poder reconhecer esses valores. Este tipo de dado é chamado LinkSetExpression e irá conter uma instrução para avaliar um conjunto de join points quando são atingidos. A representação de pointcuts quanto a instruções weaving não é tão simples. Deve ter o auxílio de uma ferramenta apropriada, que avalia a expressão contida no valor etiquetado “base” e então marca cada join point definido por ela.(STEIN, 2002). A Figura 15 abaixo, traz como esse estereótipo é representado no meta-modelo UML. 31 Figura 15 - Estereótipo <<Pointcut>> para operação (STEIN, 2002) Como mostra a Figura 15, é necessário observar que o estereótipo <<Pointcut>> tem algumas restrições. Ele <<containsWeavingInstructions>>. deve ser implementado pelo estereótipo O meta-atributo “isQuery” deve ser “true”, isso porque pointcuts por si mesmos não alteram o estado de um sistema. Seus parâmetros devem ser do tipo“out”, visto que seus parâmetros não recebem nenhum parâmetro, ou seja, nenhuma solicitação de serviço de um objeto externo. O meta-atributo “body” deve ser vazio, porque não traz nenhuma implementação, apenas especifica um conjunto de join points. Esses meta-atributos fazem parte da especificação de uma operação no metamodelo UML e estão presentes porque o pointcut é representado como um estereótipo de uma operação. 2.4.1.3 Advices Os advices trazem a implementação do código multidimensional e o executam de três maneiras distintas devido ao fato de um join point poder ser atribuído quando uma ação 32 é iniciada e quando uma ação é terminada. Assim, sua execução pode acontecer antes, após ou antes e após a ação (before, after e around, respectivamente). Da mesma forma que os pointcuts, os advices também têm uma estrutura bastante similar às operações padrões da especificação UML. A Figura 16 representa a estrutura de um advice. void around (Conta c, double valor): creditos(c, valor){...} Assinatura Declaração Pointcut Figura 16 - Estrutura de um advice Devido a essa semelhança, na modelagem orientada a aspectos eles são representados como estereótipos de operações, chamados <<advice>>, logo, são representados como membros de um aspecto. Em sua declaração, um advice define os pontos onde atuará, ou seja, traz uma definição dos pointcuts. Portanto, novamente o estereótipo para métodos <<containsWeavingInstructions>> é utilizado. Ele tanto representa a implementação de pointcuts como de advices. A Figura 17 mostra como o estereótipo <<advice>> é representado no meta-modelo UML. 33 Figura 17 - Estereótipo <<Advice>> para operação (STEIN, 2002) Como mostra a Figura 17, é necessário observar que o estereótipo <<Advice>> tem algumas restrições. Ele deve ser <<containsWeavingInstructions>>. implementado pelo método do estereótipo Os meta-atributos “isRoot” e “isLeaf” devem ser “true” e o meta-atributo “isAbstract” deve ser “false”, isso porque um advice não pode ser abstrato e nem ser cancelado. Ele sempre traz um código a ser executado em algum ponto da aplicação demarcado por um conjunto de join points. Esses meta-atributos fazem parte da especificação de uma operação no meta-modelo UML e estão presentes porque o advice é representado como um estereótipo de uma operação. 2.4.1.4 Introductions Como visto na seção anterior 2.2.3.4, os introductions modificam uma classe estruturalmente, acrescentando a ela novos membros, como construtores, métodos e atributos. Eles são atribuídos a um conjunto de definição de classes, ao invés de join points, como ocorre com advices. Para representar introductions na modelagem orientada a aspectos, duas características devem ser observadas (STEIN, 2002): 34 • Introductions são utilizados para representar a inserção de novas características dentro dos elementos modelos; • Introductions podem atribuir novos relacionamentos aos elementos modelos. Na modelagem proposta por (STEIN, 2002) – AODM, um estereótipo para templates collaboration é incluído ao meta-modelo UML para representar introductions chamado <<introduction>>. Esse estereótipo requer a presença de um parâmetro somente, que deve ser o estereótipo <<containsWeavingInstructions>>. Como já visto anteriormente, este estereótipo requer uma meta-propriedade chamada “base”, no entanto, desta vez ela conterá o conjunto de classes que serão atingidas pelo aspectos de forma a alterá-las estruturalmente, ao invés do conjunto de join points. Assim, é necessário que um novo tipo de dado seja acrescido ao meta-modelo UML, que é o ClassDefinitionSetExpression. Este tipo permite definir o meta-atributo dos parâmetros templates do estereótipo <<containsWeavingInstructions>>. modelo UML: A Figura 18 representa este estereótipo no meta- 35 Figura 18 - Estereótipo <<Introduction>> para operação (STEIN, 2002) Uma restrição encontrada para <<Introduction>> é o fato dele suportar apenas um parâmetro do estereótipo <<containsWeavingInstructions>>. 2.4.1.5 Aspects Aspectos encapsulam os interesses multidimensionais que afetam estrutural ou comportamentalmente uma classe, por meio dos pointcuts, advices e introductions. Aspectos, em AspectJ, servem como containers para várias características, tais como atributos, operações, pointcuts, advice e introductions, de forma semelhante às classes especificadas em UML. Para possibilitar a representação de aspectos o estereótipo para classes <<aspect>> é utilizado (STEIN, 2002). Classes do estereótipo <<aspect>> são suplementadas com meta-atributos adicionais para conter as meta-propriedades dos aspectos. Exemplos disso são a cláusula de instanciação, a declaração pointcut contida nesta cláusula e ainda meta-atributos que especificam o acesso a membros de classes bases. Para conter a cláusula de instanciação, o valor etiquetado “instantiation” é definido e serve para armazenar a forma como os aspectos serão instanciados. Para reconhecer esses valores um novo tipo de dado é criado, 36 chamado: InstantiationKind. Um valor etiquetado “instatiation” pode ter somente os valores para instâncias apresentados na Tabela 3 (STEIN, 2002). Tabela 3: Valores para instâncias do aspecto PerJVM A classe do estereótipo <<aspect>> é instanciada uma vez para o ambiente global. PerThis A classe do estereótipo <<aspect>> é instanciada uma vez para cada objeto que é executado nos join points selecionado. PerTarget A classe do estereótipo <<aspect>> é instanciada uma vez para cada objeto que é marcado nos join points selecionados. PerCFlow A classe do estereótipo <<aspect>> é instanciada uma vez para cada fluxo de controle que inicia os join points selecionados. PerCFlowBelow A classe do estereótipo <<aspect>> é instanciada uma vez para cada fluxo de controle que inicia abaixo dos join points selecionados. Para especificar o privilégio de acesso aos membros das classes bases (qualquer classe, mesmo privadas), o tagged value “privileged” é apresentado. Ele comporta os valores booleanos true e false. Abaixo, na Figura 19, segue-se a representação para o estereótipo aspect, no metamodelo UML. 37 Figura 19 - Estereótipo <<Aspect>> para classe (STEIN, 2002) Como observado na Figura 19 cada valor etiquetado requerido pelo aspecto deve conter o tipo específico. Para “instantiation” o tipo deve ser InstantiationKind, para o valor “Base” o tipo deve ser LinkSetExpression, e para a tag “privileged” o tipo deve ser booleano. Este capítulo buscou tratar as técnicas para modelagem de sistemas de softwares, partindo da orientação a objetos para a orientação a aspectos. Assim, as vantagens e devantagens de cada uma dessas abordagens foram apresentadas. A próxima seção traz a metodologia utilizada para o desenvolvimento deste trabalho. 38 3. MATERIAIS E MÉTODOS Para este trabalho foram utilizados diversos recursos bibliográficos, de hardware e software, que em conjunto às orientações permitiram o seu desenvolvimento. 3.1 Local e Período Este trabalho foi desenvolvido durante o primeiro semestre de 2004, como parte da disciplina “Prática em Sistemas de Informação I”. Os locais utilizados para sua elaboração foram os laboratórios de informática do curso de Sistemas de Informação e o Núcleo de Desenvolvimento de Software (NDS) do Centro Universitário Luterano de Palmas. 3.2 Materiais Os recursos utilizados para o desenvolvimento do trabalho foram disponibilizados pelo próprio curso Sistemas de Informação do CEULP/ULBRA em seus laboratórios, tais como hardware e software licenciados. As demais ferramentas free foram adquiridas via Internet. 39 3.2.1 Hardware • Pentium III, 750 Mhz e 128 Mb de RAM (Disponível no laboratório); • Pentium IV, 2.4 Ghz e 256 Mb de RAM (Disponível no laboratório); 3.2.2 Software • Microsoft Windows 2000 Professional; • Microsoft Office 2000 Professional; • Internet Explorer 6.0; • Acrobat Reader 6.0; • AspecJ; • Rational Rose; 3.2.3 Fontes Bibliográficas 3.3 • Teses de Mestrados; • Publicações Científicas; • Artigos; • Site do AspectJ (AspecJ, 2004); • Sites diversos. Metodologia A metodologia utilizada foi baseada principalmente em pesquisas. Estas pesquisas foram realizadas no sentido de juntar as informações referentes ao domínio do trabalho desenvolvido, de maneira que permitisse oferecer uma sustentação teórica necessária para a sua conclusão. Com base nestas informações colhidas, foi possível analisar, criticamente, a abordagem proposta por (STEIN, 2002) e assim realizar um levantamento dos seus pontos fortes e fracos. 40 4. RESULTADOS E DISCUSSÕES Esta parte do trabalho apresenta um exemplo da utilização da Modelagem Orientada a Aspectos (STEIN, 2002). O exemplo aborda um domínio bancário que já foi utilizado em ilustrações anteriores. Na Figura 20 é representado o diagrama de classes que mostra este domínio. 41 Figura 20 - Modelagem do banco orientada a aspectos Na Figura 20 é representada uma notação para o aspecto CPMF, um estereótipo de uma classe chamado <<aspect>> que contém os mecanismos para afetar a classe caixaRapido. Esse aspecto especifica que, sempre que o método sacar() for executado, ele deverá ser interceptado, ou seja, o código do aspecto irá atuar sobre essa classe. Neste aspecto, estereótipos especiais para operações são apresentados que são <<pointcut>> e <<advice>>. O <<pointcut>> estabelece o conjunto dos pontos aonde o aspecto deverá atuar. Neste caso, ele declara que será sempre na execução do método sacar(). O <<advice>> apresenta em sua declaração o seu tipo (before, after ou around) e a declaração pointcut. A implementação deste advice around, que no diagrama de classe é representado por uma interface ligada ao aspecto por um relacionamento realize, é representado em detalhes através do diagrama de seqüência na Figura 21. 42 Figura 21- Notação para implementação do corpo do advice around Neste diagrama de seqüência pode-se observar que a seqüência das ações é normal até que o controle solicita à fronteira do sistema que informe qual transação o usuário deseja realizar. Assim, essa informação é passada para o usuário. Caso sua resposta seja efetuar um saque (sacar(double valor)), essa seqüência normal é interrompida por um momento, até que o aspecto termine sua execução. 43 Visto que o advice utilizado neste domínio é um around, ele executa antes e após a execução do método sacar(). Desta forma, quando o método sacar inicia sua execução ele é interrompido e o around começa a executar, como descrito na seqüência deste diagrama, atualizando o valor da CPMF. Por meio do comando proceed, o controle de execução retorna ao método sacar() inicial da classe caixaRapido e assim a seqüência continua seu fluxo normal. Então, é verificado o balanço; se o cliente possui saldo suficiente o dinheiro é liberado, senão é informado a ele que solicite outro valor para o saque. Assim, quando essa transação termina, o controle de execução retorna a execução para o advice, por meio do comando proceed, que irá realizar a cobrança da CPMF na conta do cliente. Para representar o relacionamento entre o aspecto e a classe que é afetada por ele, um novo relacionamento é apresentado ao meta-modelo UML, chamado crosscut. A seção seguinte traz algumas considerações sobre a Modelagem orientada a aspectos. 44 4.1 Considerações sobre a abordagem de STEIN A modelagem orientada a aspectos - AODM descreve uma notação para representar os aspectos implementados em AspectJ por meio da UML. No entanto, nem todos os elementos do AspectJ têm uma representação direta com os elementos modelos da linguagem de modelagem UML. Com base nessa verificação, STEIN (2002) adotou os mecanismos de extensão especificados no meta-modelo UML para estender os elementos modelos existentes com novas semânticas, de forma que pudessem representar graficamente os aspectos. STEIN (2002) fez uma comparação minunciosa entre AspectJ e UML. Nesta comparação constatou que links, na especificação UML, são adequados para representar os pontos aonde os aspectos atuarão (join points do AspectJ). Tanto pointcuts e advices podem ser representados como operações estereotipadas, devido à grande semelhança estrutural destas construções em relação às operações padrões da UML. Por sua vez, introductions são representadas como estereótipos de templates para colaborações. Aspectos são semelhantes a classes, dessa forma são representados como classes estereotipadas. O relacionamento entre classes e aspectos é representado por um novo estereótipo para relacionamento chamado crosscut. Esta abordagem é baseada em duas ferramentas bem aceitas pelos desenvolvedores (AspectJ e UML), mas uma desvantagem notada nisso, apesar de serem ferramentas bem disseminadas e muito utilizadas, é o fato da AODM estar restrita a elas. A UML não é um padrão único para realizar a modelagem de sistemas e o AspectJ também não é um padrão único para implementar aspectos. Essas características tornam a AODM muito restrita. Outra dificuldade encontrada é o fato de que nem todos os links podem ser representados como join point, visto que para links serem pontos de atuação de aspectos, devem especificar apenas as comunicações que expressam as ações descrita no modelo dos join points que são: criação de objetos, invocação de métodos, acesso a campos, e tratamento de exceções. Isto causa uma certa inconsistência, pois num momento um link é visto como join point e em outro não, (quando são utilizados para comunicar a destruição de uma instância, por exemplo, não são vistos como join points). 45 Existem ainda algumas ações que não possuem um link pelo fato de não estabelecerem uma comunicação entre duas instâncias. Um exemplo disso são ações de leitura e escrita de atributos. Assim, não podem ser representados graficamente. Uma maneira para resolver este problema, como proposto por (STEIN, 2002), seria a criação de operações auxiliares de leitura e escrita (set e get) para cada atributo da classe. Para diferenciar essas operações das demais é feito o uso de estereótipos especiais (<<set>> e <<get>>). Na verdade, as ferramentas atuais para modelar sistemas (tais como o Rational Rose e Visio) ainda são muito restritas quando se referem ao campo dos aspectos. Elas não apresentam todos elementos modelos propostos para representar os interesses multidimensionais de um sistema e isto inviabiliza, de certa forma, a avaliação quanto à verdadeira potencialidade das propostas de modelagens orientadas a aspectos. Entretanto, apesar dessas dificuldades, a AODM se mostra ainda uma abordagem de grande importância e bem estabelecida para o começo da padronização de sistemas de software baseados em aspectos. Ela possibilita que as vantagens da modularização de sistemas sejam trazidas para a fase de projeto, tais como maior compreensão do sistema a ser desenvolvido e maior facilidade quanto à manutenção, adaptabilidade e reusabilidade do sistema, visto que desde o inicío seus interesses serão tratados de forma separada, conforme o domínio de cada um. 46 5. CONSIDERAÇÕES FINAIS E TRABALHOS FUTUROS Várias linguagens de programação têm sido propostas para a implementação de aspectos, pois, de fato, o desenvolvimento de sistemas de software aponta para esta área, devido aos beneficios proporcionados pela conseqüente modularização. Com isso, começou a surgir a necessidade de trazer estes benefícios para as fases anteriores ao processo de implementação, propriamente. Assim, muitas são as abordagens que trazem propostas para a modelagem de aspectos. Neste trabalho, a abordagem estudada foi a de (STEIN, 2002) que buscou utilizar a mesma semântica da UML, salvo algumas alterações semânticas para representar aspectos implementados em AspectJ. Essas alterações tornaram-se possíveis devido aos mecanismos de extensões suportados pelo meta-modelo UML. No entanto, tais mecanismos devem ser utilizados cautelosamente para evitar que o príncipio de padronização na comunicação entre desenvolvedores e ferramentas seja quebrado. Sabendo que se tratam de paradigmas relativamente novos (sua criação remonta ao ano de 1997), há ainda muito por fazer para que o uso da orientação a aspectos realmente seja implementado potencialmente. No caso da modelagem, por exemplo, as ferramentas para tal fim necessitam ser estendidas para suportar as novas abstrações da orientação a aspectos. Este trabalho descreveu uma validação para AODM. Representando, por meio de um domínio bancário, como os interesses multidimensionais desse sistema podem ser tratados separadamente, tendo apenas um relacionamento para definir a ligação que ilustra como esses interesses interceptam a classe base. 47 Como trabalhos futuros, é proposto que seja realizada uma comparação entre as principais abordagens existentes, de forma a verificar o que cada uma oferece ou mesmo restringe, levantando assim as vantagens e desvantagens obtidas com uso de cada uma. E, por fim, realizar uma padronização dessas abordagens, reunindo os elementos mais vantajosos de cada uma. 48 6. REFERÊNCIAS BIBLIOGRÁFICAS (AMBLER, 1997) AMBLER, Scott W. Análise e projeto orientados a objetos. Rio de Janeiro. Editora Infobook, 1997 (ASPECTJ, 2004) AspectJ Home Page. Disponível em www.aspectj.org. Acessado em 15/06/2004. (BOOCH et Al, 2000) BOOCH, Grady. RUMBAUGH, James. JACOBSON, Ivat. UML – Guia do usuário. Rio de Janeiro. Editora Campus, 2000. (CARDOSO, 2003) CARDOSO, Caíque. UML na prática - Do problema ao sistema. Rio de Janeiro: Ciência Moderna, 2003. (CHAVES, 2004) CHAVES, Rafael. Alves. Aspectos e MDA Criando modelos executáveis baseados em aspectos.. Dissertação de Mestrado (Mestrado em Ciência da Computação) Universidade Federal de Santa Catarina, Florianópolis, 2004 – 49 (COAD et. Al, 1993) COAD, Peter. YOURDON, Edward. Projetos baseados em objetos. Rio de Janeiro. Editora Campus, 1993. (COAD et. Al, 1993) COAD, Peter. YOURDON, Edward. Análise baseada em objetos. Rio de Janeiro. Editora Campus, 1992. (KICZALES et. Al, 1997) KICZALES, Gregor et al. Aspect-oriented programming. In Proc. of ECOOP, Springer-Verlag, 1997. (KICZALES et.Al, 2001) KICZALES, Gregor et al. Aspect–oriented programming with AspectJ. In OOPSLA’01, Tutorial, Tampa FL. (KISELEV, 2002) KISELEV, Ivan. Aspect – Oriented Programming with AspectJ, Ed. Sams Publishing, 2002. (LEE et. Al, 2001 ) LEE, Richard C. TEPFENHART, William M. UML e C++ Guia prático de desenvolvimento orientado a objeto. São Paulo. Editora Makron Books, 2001 (OMG, 2000) Object Management Group (OMG). Unified Modeling Language Specification, Versão 1.3. 2000 (PIVETA, 2001) PIVETA, Eduardo Kessler. Um modelo de suporte a programação orientada a aspectos. Florianópolis, 2001. Dissertação de Mestrado (Mestrado em Ciência da Computação) – Universidade Federal de Santa Catarina, Florianópolis, 2001. (SOARES, 2002) Soares, Sérgio. Borba, Paulo “AspectJ – Programação Orientada a Aspectos em Java”. Tutorial no SBLP 2002, 6º 50 Simpósio Brasileiro de Linguagens de Programação. PUCRio: Rio de Janeiro, 2002. (STEIN, 2002) STEIN, Dominik. An Aspect-Oriented Design Model Based on AspectJ and UML. Dissertação de Mestrado (Mestrado em Gerenciamento de Sistemas Universidade de Essen, Germany, 2002. de Informação) –