Академический Документы
Профессиональный Документы
Культура Документы
A.1 Introdução
À medida que aumenta a complexidade dos sistemas de software surge a necessidade de
melhores técnicas de programação, objetivando organizar e apoiar o processo de
desenvolvimento de software. Com isso, no âmbito da Ciência da Computação, essas
técnicas de programação têm evoluindo desde construções de baixo nível – como
linguagens de máquina – até abordagens de alto nível – como Programação Orientada a
Objetos (POO) [Elrad et al., 2001].
Segundo [Gradeck and Lesiecki, 2003], a engenharia de software e as linguagens de
programação possuem um relacionamento mútuo. Os sistemas são considerados pela
maioria dos processos de desenvolvimento de software como unidades (módulos) cada
vez menores. Enquanto, as linguagens de programação fornecem meios para definir e
compor abstrações das unidades do sistema de diversas maneiras para produção do
sistema como um todo.
Em meados da década de 70, com o advento de um novo paradigma de programação,
a Programação Orientada a Objetos (POO), teve grandes avanços no desenvolvimento
de software até os dias atuais, sendo atualmente, o paradigma de programação
dominante no desenvolvimento de sistemas de software [Laddad, 2003]. Este paradigma
possibilitou a construção de sistemas particionados em módulos (classes) que trabalham
em conjunto para fornecer funcionalidades específicas de um conjunto de requisitos do
sistema com responsabilidades bem definidas, permitindo maiores níveis de reuso e
manutenibilidade [Gradeck and Lesiecki, 2003].
O princípio da separação de interesses (concerns) foi introduzido em [Dijkstra,
1976], tendo como objetivo dividir o domínio do sistema em partes menores com o
intuito de entender melhor cada parte isoladamente. Um interesse (concern) é alguma
parte do domínio do sistema que se deseja tratar com uma unidade conceitual única. No
desenvolvimento de software, um interesse pode ser visto como um requisito funcional
ou não funcional de um sistema. De forma geral, os vários interesses do sistema devem
ser separados em módulos – modularizados – de acordo com as abstrações do
desenvolvimento de software providas por linguagens, métodos e ferramentas. Pode-se
classificar os interesses de um sistema de software como [Laddad, 2003]:
• Interesses do negócio - capturam a funcionalidade central de um módulo, por
exemplo, procedimento de quitação de uma compra;
• Interesses em nível de sistema - capturam requisitos periféricos, no nível do
sistema e que atravessam múltiplos módulos, por exemplo, segurança, logging,
persistência.
A POO permitiu uma melhor separação dos diversos interesses do sistema, com a
estruturação de projetos e códigos mais próximos do que é idealizado naturalmente
pelos desenvolvedores [Elrad et al., 2001]. No caso da POO, as abstrações básicas para
os interesses são classes, objetos, métodos e atributos. Entretanto, essas abstrações
podem não ser suficientes para separar em um único módulo, alguns dos interesses
contidos em muitos sistemas de software complexos, tendo assim os comportamentos
distribuídos ao longo de vários e, às vezes não relacionados, módulos. Esses interesses
são chamados de interesses transversais (crosscutting concerns), já que, inerentemente,
a sua implementação se dá através da adição de código em diversos objetos ao longo do
software não estando diretamente relacionado com a funcionalidade definida pra estes
objetos. Desta forma, a implementação mapeia os requisitos em uma única dimensão
como pode ser visualizado na Figura 1. Podemos citar como exemplos de interesses
transversais logging, integridade de transações, autenticação, segurança, desempenho,
distribuição, persistência e profiling [Elrad et al., 2001].
2
figura forem movimentados, é necessário que a tela seja atualizada. Desta maneira,
observa-se através do diagrama de classes apresentado na Figura 2, que o interesse de
atualização da tela não pertence a nenhuma das duas classes (Ponto e Linha), mas
entrecorta ambas e, por isso, pode ser entendido como transversal a essas classes [Elrad
et al., 2001].
Figura 3 – Código entrelaçado causado pela execução simultânea de múltiplos interesses [Laddad, 2003].
3
definição, são espalhados por vários módulos, logo sua implementação
também se espalha por esses módulos. Por exemplo, considere o mecanismo
de logging, fazendo uso das classes do Apache TomCat, um servidor web
baseado em Java. Na Figura 4 as colunas representam cada uma das classes
do sistema e, a linhas grifadas são referentes à funcionalidade de logging.
4
modularidade de software, tais como Aspect-Oriented Programming (Programação
Orientada a Aspectos) [Kiczales et al., 1997], Subject-Oriented Programming
(Programação Orientada a Sujeito) [Osser and Tarr, 1999] e Adaptive Programming
(Programação Adaptativa) [Lieberherr et al., 1994]. Dentre essas extensões a que tem se
mostrado mais promissora é a Programação Orientada a Aspectos (POA) [Elrad et al.,
2001].
A POA foi proposta em [Kiczales et al., 1997] como uma técnica objetivando
melhorar o suporte à modularização dos interesses transversais por meio de abstrações
que possibiltem a separação e composição destes interesses na construção dos sistemas
de software.
5
• Implementar os interesses (concern implementation) – implementar cada
um dos interesses identificados separadamente;
• Recompor o aspectual (aspectual recomposition) – nesta etapa, tem-se
integrador de aspectos que especifica regras de recomposição para criação de
unidades de modularização – aspectos. A esse processo de junção da
codificação dos componentes e dos aspectos é denominada combinação
(weaving).
Na Figura 5, é ilustrado as etapas de desenvolvimento da POA.
6
mais familiar e de fácil adoção pelos desenvolvedores, uma vez que geralmente a
linguagem de aspecto compartilha o mesmo ambiente de desenvolvimento utilizado
pela linguagem de componente [Kiczales et al., 2001].
No contexto deste trabalho será abordada como linguagem de componentes a
linguagem Java e no contexto da linguagem de aspecto a linguagem AspectJ.
A.3 AspectJ
A linguagem AspectJ [Kiczales et al., 2001] é uma extensão orientada a aspectos de
propósito geral da linguagem Java. Foi criada pela Xerox Palo Alto Research Center em
1997 e posteriormente agregada ao projeto Eclipse da IBM EM 2002. Além dos
elementos oferecidos pela POO como classes, métodos, atributos e etc, são
acrescentados novos conceitos e construções ao AspectJ, tais como: aspectos (aspects),
conjuntos de junção (point cuts), pontos de junção (join points), adendos (advices) e
declarações inter-tipos (inter-type declarations)1.
Aspects são os elementos básicos dessa abordagem, pois podem alterar a estrutura
estática ou dinâmica de um programa. A estrutura estática é alterada adicionando, por
meio das declarações inter-tipos, membros (atributos, métodos ou construtores) a uma
classe, modificando assim a hierarquia do sistema. Já a alteração numa estrutura
dinâmica de um programa ocorre em tempo de execução por meio dos conjuntos de
junção, os quais são selecionados por pointcuts, e através da adição de comportamentos
(adendos) antes ou depois dos pontos de junção [Kiselev, 2002].
A seguir, são apresentados cada um dos conceitos e construções que compõem o
AspectJ.
1
As traduções utilizadas neste trabalho seguem as recomendações definidas no WASP 2004 – 1º
Workshop Brasileiro de Desenvolvimento de Software Orientado a Aspectos, disponíveis em
http://twiki.im.ufba.br/bin/view/AOSDbr/TermosEmPortugues
7
• execução de inicialização;
• execução de contrutores;
• execução de inicialização estática;
• pré-inicialização de objetos;
• inicialização de objetos;
• referência a campos;
• execução de tratamento de exceções.
Na Figura 6, é demonstrado um exemplo apresentado em [Soares and Borba, 2002],
de um fluxo de execução entre dois objetos, identificando alguns pontos de junção.
8
Podemos declarar um conjunto de junção semelhante a uma classe em Java, podendo
da mesma maneira que atributos e métodos dessas classes, especificar um quantificador
de acesso aos conjuntos de junção, podendo ser públicos, privados ou final, mas não
podem ser sobrecarregados. Também podem ser declarados abstratos, mas somente
dentro de aspectos abstratos, e ainda podem ser nomeados ou anônimos [Kiselev, 2002].
A declaração de um pointcut nomeado deve seguir a seguinte sintaxe:
pointcut <Nome> (Argumentos): <corpo>;
Para definir um conjunto de junção utiliza-se construtores de AspectJ nomeados de
designadores, os principais estão listados na Tabela 1:
Tabela 1 – Listagem dos designadores em AspectJ.
Designador Características
Call(Signature) Invocação do método / construtor identificado
por assinatura
Execution(Signature) Execução do método / construtor identificado
por assinatura
Get(Signature) Acesso a atributo identificado por assinatura
Set(Signature) Atribuição do atributo identificado por
assinatura
This(Type pattern) Objeto em execução é instância do padrão
tipo
Target(Type pattern) Objeto de destino é instância do padrão tipo
Args(Type pattern) Os argumentos são instância do padrão tipo
Within(Type pattern) O código em execução está definido em
padrão tipo
9
A.3.3 Adendos (Advices)
Adendos é o código para ser executado em um ponto de junção que está sendo
referenciado pelo conjunto de junção. Existem três maneiras de adendos: antes, durante
e depois (before, around e after). Portanto, de acordo com seus nomes, before executa
antes do ponto de junção, around executa antes e depois e after executa depois.
O adendo pode modificar a execução do código no ponto de junção, pode substituir
ou passar por ele. Usando o adendo pode-se “logar” as mensagens antes de executar o
código de determinados pontos de junção que estão espalhados em diferentes módulos.
O corpo de um adendo é muito semelhante ao de qualquer método, encapsulando a
lógica a ser executada quando um ponto de junção é alcançado [Gradecki and Lesiecki,
2003].
10
junção, e da adição de comportamento antes ou depois dos mesmos, ou ainda através da
obtenção de total controle sobre o ponto de execução [Soares and Borba, 2002].
A.3.6 Exemplo
Para exemplificação do uso de aspectos utilizaremos um exemplo didático
apresentado em [Elrad et al., 2001]. Este exemplo é um sistema simples de elementos
gráficos. Como pode ser observado na Figura 7 é formado pelas classes Ponto, Linha e
Tela, além de ElementoDeFigura e Figura.
11
classe Ponto e dos métodos setP1 e setP2 da classe Linha se faz necessário a
invocação do método atualiza da classe Tela.
Desta forma, a invocação do método atualiza fica espalhada pelos quatro métodos.
Portanto, visando a moduralização desse interesse deve-se fazer uso de AspectJ, ficando
este interesse localizado no aspecto AtualizaTela. Para isso, deve-se seguir os
seguintes passos:
1. Identificar os pontos de junção. Um ponto de junção é um ponto bem
definido no fluxo de execução de um programa. No caso do AspectJ, este tem
suporte a um modelo de pontos de junção dinâmico, ou seja, que ocorrem
durante a execução de programa Java. Considerando o editor de figuras
apresentado na Figura 9 a identificação dos pontos de junção no caso de
mover uma linha.
12
2. Especificar os pontos de junção, através de conjuntos de junção. Por
exemplo, o conjunto de junção especificado na Figura 10 identifica chamadas
de métodos que movem figuras.
Figura 10 – Conjunto de junção que identifica chamadas de métodos que movem figuras.
13
Figura 12 – Implementação do editor de figuras com AspectJ.
A.4 Conclusão
A Programação Orientada a Aspectos trás vários benefícios na resolução de muitos
problemas encontrados atualmente. Possibilita a construção de programas mais
modulares, com a separação dos interesses transversais, evitando assim o
entrelaçamento e espalhamento do comportamento no código. Além disso, permite a
14
possibilidade de reutilização de grande parte dos módulos desenvolvidos. Desta forma,
obtêm-se ganhos com a manutenção e evolução do software.
A linguagem AspectJ é uma extensão orientada a aspectos da linguagem Java, sendo
uma abordagem clara e composta por construções simples e eficazes, capazes de
modularizar interesses que anteriormente ficavam espalhados pelo código dificultando o
entendimento do sistema.
15
Referências
16
[Kiselev, 2002] Kiselev, I. Aspect-Oriented Programming with AspectJ, Ed. Sams
Publishing, 2002.
[Laddad, 2003] Laddad, R. AspectJ in Action: Practical Aspect-Oriented Programming,
Manning, Greenwich, 2003.
[Lehman, 1998] Lehman, M. m. Software's Future: Managing Evolution, IEEE
Software, v.15, n. 1, 40-44, Jan. 1998.
[Lieberherr et al., 1994] Lieberherr, K. J.; Silva-Lepe, I.; Xiao, C. Adaptive Object-
Oriented Programming Using Graph-Based Customization, Communications of the
ACM, 37(5): 94-101, 1994.
[McGregor and Sykes, 2001] McGregor, J. D.; Sykes, D. A. A practical guide to testing
object-oriented software, Addison-Wesley, 2001.
[Monteiro and Piveta, 2003] Monteiro, Elaine S.; Piveta, Eduardo K. Programação
Orientada a Aspectos em AspectJ, Anais do V Encontro dos Estudantes de Informática
do Tocantins, Palmas, TO, pp. 313-322, October, 2003.
[Ossher and Tarr, 1999] Ossher, H. and Tarr, P. Using subject-oriented programming to
overcome common problems in object-oriented software development/evolution, In
International Conference on Software Engineering, ICSE’99, p. 688 - 698, ACM, 1999.
[Royce, 1970] Royce, W.W. Managing the development of large software systems, In:
Proceedings of IEEE WESCON, p. 1-9, 1970.
[Schwaber et al., 2002] Schwaber, K. and Beedle, M., Agile Software Development with
Scrum, NJ, Prentice-Hall, 2002.
[Soares and Borba, 2002] Soares, S.; Borba, P. AspectJ - Programação orientada a
aspectos em Java, In: VI Simpósio Brasileiro de Linguagens de Programação, Rio de
Janeiro, 2002.
[Tretmans, 1999] Tretmans, J. Testing concurrent systems: A formal approach, In
CONCUR’99 – 10th International Conference on Concurrency Theory, volume 1664 of
Lecture Notes in Computer Science, pages 46-65, 1999.
17