2. TÉCNICAS E PARADIGMAS DA PROGRAMAÇÃO
3.11 DEVENVOLVIMENTO UTILIZANDO ASPECTJ
3.11.1 Análise
A análise à linguagem AspectJ, que descreve os vários tipos de PointCut, tipos de Advices, inter-type-Declarations e exemplos de utilização, pode verificar-se no anexo 1.
3.11.2 @AspectJ
Na versão 1.5 da linguagem de programação AspectJ foi introduzido um novo estilo de declarar aspectos, advices e pointcuts, mas mantendo contudo a mesma semântica (anexo 1). A este estilo de desenvolvimento foi chamado @aspectJ28, sendo semelhante às anotações do Java 5 e idêntico à aplicação de atributos da Framework .NET.
Este estilo permite desenvolver aspectos como se de classes normais de Java se tratassem, posteriormente anotadas, utilizando a semântica do AspectJ. Os métodos dessas classes quando anotados tornam-se Advices. Assim, torna-se possível desenvolver programas de POA sem alterar as ferramentas de desenvolvimento, contudo é necessário incorporar manualmente o método de Weaving no processo de compilação do projecto, através por exemplo, de tarefas ANT29. Se não existir integração do processo de compilação o projecto/programa compilado tem o comportamento normal POO.
28
http://www.eclipse.org/aspectj/doc/released/adk15notebook/ataspectj.html (Acedido em Junho de 2008) 29
Neste âmbito, antes de se poder desenvolver programas POA utilizando este estilo, é necessário instalar primeiro a linguagem AspectJ30 e importar as bibliotecas, ficheiros jar, ao projecto Java.
A análise a este estilo de programação POA encontra-se no anexo 2.
3.11.3 Ferramentas de Desenvolvimento
Para facilitar e complementar a utilização das tecnologias POA surgiram e/ou foram adaptadas ferramentas que auxiliam os programadores. Estas encontram-se enumeradas no anexo 3.
3.12 POSTSHARP
PostSharp é uma tecnologia POA para a Framework .NET da Microsoft. AspectJ é só utilizável em projectos Java, não existindo soluções para outras populares linguagens e tecnologias. É ao encontro desta necessidade para a Framework .NET que o PostSharp foi criado.
Postsharp31 é uma plataforma de código aberto, que permite transformar e analisar assemblies da tecnologia .NET da Microsoft. Uma assembly é um conjunto de módulos,
30
http://www.eclipse.org/aspectj/downloads.php (Acedido em Junho 2008) 31
unidades unitárias, e com um cabeçalho que indica os módulos que compõem a assembly. Cada módulo é armazenado no formato portable executable (PE), código intermédio, MSIL.
Postsharp Laos (Lightweight Aspect-Oriented System), é por sua vez, um weaver que permite criar atributos para a framework .Net como se de aspectos se tratassem, sendo aplicados a classes, métodos ou variáveis. Os atributos são metadados que descrevem, ou anotam, elementos específicos tais como classes, métodos ou propriedades. Os metadados são adicionados à assembly e podem ser acedidos através da API Reflection da framework .NET
A tecnologia consiste, deste modo, num conjunto de assemblies que se registam na Framework .NET e um post-compiler para compor o sistema, o qual se integra no processo de compilação do Visual Studio, MSBuild.
Postsharp Laos é um plug-in (figura 19) de uma plataforma maior: o Postsharp Core. Esta plataforma é uma infra-estrutura genérica, para a análise e transformação de programas, como AOP weavers, análise estática e optimizadores, podendo ser utilizada por investigadores e/ou programadores para se abstraírem dos problemas da infra-estrutura e se focarem na sua área de investigação.
Figura 19 – Processo de integração do Postsharp. (Adaptada do ficheiro de ajuda do Postsharp)
3.12.1 PostSharp LAOS
O plug-in Postharp LAOS [Fraiteur 2008] permite de forma simples implementar funcionalidades práticas do Paradigma Orientado a Aspectos num projecto. NET Framework.
A nomenclatura utilizada no Postsharp Laos foi adaptada para ser facilmente interpretada pela comunidade da Framework. NET, facilitando a sua utilização aos programadores menos familiarizados com os conceitos da POA. Na tabela 4 apresenta-se uma comparação entre os termos técnicos utilizados na linguagem de programação AspectJ e os utilizados no PostSharp Laos.
AspectJ PostSharp Laos
Join Point Meta-evento
Pointcut Atribuição de um atributo a um tipo (classe, método ou propriedade).
Advice Meta-Handler
Aspecto Conjunto coerente de advices aplicados a um evento de um elemento alvo predefinido, geralmente encapsulados num atributo. Tabela 2 - comparação da nomenclatura do AspectJ e Postsharp Laos.
Neste contexto, o PostSharp Laos disponibiliza classes que são consideradas aspectos e os métodos destas podem ser vistos como advices. O programador estende as classes e redefine os métodos de acordo com o comportamento pretendido. Como estas classes derivam da classe System.Atribute todas as classes que derivem destas são atributos, e ao serem aplicadas a um tipo, classe, método ou propriedade, definem um Pointcut. Do ponto de vista do programador do módulo base um aspecto não é mais que um atributo .NET.
É disponibilizado pela Plug-in um Namespace32, Postsharp.Laos, que contem um conjunto de classes que permitem implementar os atributos de acordo com o tipo de comportamento pretendido. Sendo assim, é possível capturar chamadas a métodos, declarar excepções, capturar acesso a variáveis e implementar métodos.
Os atributos são aplicados a tipos. Um tipo pode ser um método, uma classe ou uma estrutura. Se um atributo for aplicado a uma classe e se este é do tipo advice para capturar chamadas a métodos, então fica aplicado a todos os métodos da classe caso não seja definido outro tipo de comportamento nas definições de atribuição do atributo.
3.12.1.1 Características do PostSharp Laos
• Aspectos reutilizáveis: os atributos são classes e como tal são reutilizáveis entre projectos;
• Aspectos não invasivos: não se quebra o encapsulamento, os aspectos são aplicados sem alterar o bloco de código a que estão aplicados. O PostSharp Laos envolve o bloco de código como uma caixa dentro de outra caixa;
• Aspectos parametrizáveis: podem ser adicionados parâmetros que são correctamente instanciados na fase de inicialização e posteriormente serializados para a assembly.
32
3.12.1.2 Limitações do PostSharp Laos
• Performance: o PostSharp Laos sofre das mesmas limitações dos weavers com base em proxys dinâmicos (capitulo 3.8.2.1), influenciando negativamente na performance dos programas;
• Portabilidade: correntemente o PostSharp só é suportado para a plataforma. Net não o sendo nas plataformas. NET Compact Framework e Mono;
• Expressividade limitada: embora existam várias maneiras de expressar pointcuts, estas comparadas com outras ferramentas POA, mostram que PostSharp Laos é bastante limitado;
• Conjunto de advices limitados: PostSharp Laos embora possibilite um conjunto prático de advices, não oferece alguns tipos úteis, como por exemplo a introdução de variáveis.
3.12.2 Análise da Tecnologia
No anexo 4 é descrita a forma de utilização das classes que o PostSharp Laos disponibiliza e um pequeno exemplo de utilização.
3.12.2.1 Ciclo de vida de um Aspecto Postsharp LAOS
Desde a compilação até à execução, os aspectos desenvolvidos em PostSharp LAOS passam por várias fases:
1. Instanciação: nesta fase o weaver do PostSharp Laos instancia cada aspecto que está aplicado a um tipo;
2. Validação: verifica que a atribuição dos aspectos é feita correctamente, por exemplo, não permitir aplicar aspectos de chamada de métodos a variáveis. Esta validação é feita, em primeira instância, pelo weaver e numa segunda fase através da invocação de um método, que pode ser implementado em cada classe disponibilizada pelos PostSharp Laos, denominado de CompileTimeValidate, permitindo ao programador estabelecer regras (exemplo 12);
publicoverridebool CompileTimeValidate(object element) {
//implementação das validações
}
Exemplo 12 - Método CompileTimeValidate.
3. Inicialização: consiste na invocação do método CompileTimeInitialize presente em cada classe disponibilizada pelo PostSharp Laos (exemplo 13) e que permite efectuar alguns tipos de cálculos com os dados compilados até esta fase, para assim não os efectuar em tempo de execução;
publicoverridevoid CompileTimeInitialize(object element) {
//implementação
//atribuir variaveis com resultados pre calculados em compile time
}
Exemplo 13 – Método CompileTimeInitialize.
4. Serialização: todas as instâncias dos aspectos são serializadas como metadados na assembly;
5. Uso em tempo de execução: os atributos são lidos, serializados e utilizados no programa;
3.12.3 PostSharp Core
PostSharp Core é a base em que os plugins como PostSharp Laos são desenvolvidos, trabalhando ao mais baixo nível. O PostSharp Core compõe-se por:
• Um modelo de objectos em bytecode, que permite ao PostSharp ler e escrever assemblies .NET framework;
• Infra-estrutura da plataforma, onde todas as tarefas a desempenhar pelos plugins ficam definidas em ficheiros XML;
• Weaver de baixo nível, que consiste num weaver que injecta instruções em assemblies e é a base para outros weavers de alto nível, como o do PostSharp Laos.