aopdelphi – protótipo de um weaver para programação ... · introdução ao longo dos últimos...

12
AOPDelphi – Protótipo de um weaver para programação orientada a aspectos em Delphi Edmar Soares de Oliveira, Marcel Hugo Departamento de Sistemas e Computação Universidade Regional de Blumenal (FURB) – Blumenau, SC [email protected], [email protected] Resumo. Este trabalho apresenta uma ferramenta de suporte à programação orientada a aspectos na linguagem Delphi. É composto por uma linguagem de programação orientada a aspectos e um weaver. A ferramenta recebe como entrada um projeto Delphi, um ou mais programas de aspectos e gera um projeto Delphi mesclando as funcionalidades dos programas de entrada. 1. Introdução Ao longo dos últimos anos, a Engenharia de Software tem disponibilizado para os desenvolvedores vários métodos, técnicas e ferramentas, para auxiliá-los a produzir com maior qualidade. Entre as características perseguidas, a busca pela reusabilidade e manutenibilidade são as mais importantes para a produtividade (RESENDE; SILVA, 2005). Nessa evolução se destaca o surgimento da orientação a objetos, onde houve uma mudança radical na maneira de se desenvolver software. Porém, com o crescimento dos sistemas e conseqüentemente o aumento de sua complexidade, surgiram problemas, como entrelaçamento e espalhamento de código, que os métodos propostos pela orientação a objetos não são totalmente eficazes para resolver (KICZALES et al., 1997). Assim nasceu a programação orientada a aspectos (POA), com o objetivo de apresentar técnicas capazes de cobrir essas falhas. A POA trabalha com o princípio de separação de interesses (separation of concerns), que prega que as preocupações envolvidas no desenvolvimento de um software devem ser focadas e trabalhadas separadamente, concentrando em uma de cada vez, reduzindo a probabilidade de ocorrência de erros em cada módulo e conseqüentemente no sistema como um todo (KULESZA; SANT’ANNA; LUCENA, 2005). Estes conceitos favorecem a reusabilidade e manutenibilidade do software. É uma tecnologia criada para a implementação de interesses transversais (crosscuting concerns), que são aqueles cuja implementação atravessam os componentes responsáveis pela modularização do sistema (RESENDE; SILVA, 2005). A POA oferece uma estrutura que encapsula implementações de uma responsabilidade que ficariam espalhadas no modelo orientado a objetos. Esta unidade é chamada de aspecto (NELSON, 2005). Para uma implementação básica de POA, é necessário: uma linguagem para programação dos componentes, como por exemplo o Java; uma linguagem para programação dos aspectos, como o AspectJ; um weaver; um programa de componentes e um programa de aspectos (STEINMACHER, 2001). O weaver (ou montador) é o combinador de aspectos. Sua função é combinar os programas escritos em linguagem de componentes, no caso, as regras de negócio implementadas

Upload: ngomien

Post on 10-Nov-2018

214 views

Category:

Documents


0 download

TRANSCRIPT

AOPDelphi – Protótipo de um weaver para programaçãoorientada a aspectos em Delphi

Edmar Soares de Oliveira, Marcel Hugo

Departamento de Sistemas e ComputaçãoUniversidade Regional de Blumenal (FURB) – Blumenau, SC

[email protected], [email protected]

Resumo. Este trabalho apresenta uma ferramenta de suporte à programaçãoorientada a aspectos na linguagem Delphi. É composto por uma linguagem deprogramação orientada a aspectos e um weaver. A ferramenta recebe comoentrada um projeto Delphi, um ou mais programas de aspectos e gera umprojeto Delphi mesclando as funcionalidades dos programas de entrada.

1. Introdução

Ao longo dos últimos anos, a Engenharia de Software tem disponibilizado para osdesenvolvedores vários métodos, técnicas e ferramentas, para auxiliá-los a produzir commaior qualidade. Entre as características perseguidas, a busca pela reusabilidade emanutenibilidade são as mais importantes para a produtividade (RESENDE; SILVA,2005). Nessa evolução se destaca o surgimento da orientação a objetos, onde houve umamudança radical na maneira de se desenvolver software. Porém, com o crescimento dossistemas e conseqüentemente o aumento de sua complexidade, surgiram problemas,como entrelaçamento e espalhamento de código, que os métodos propostos pelaorientação a objetos não são totalmente eficazes para resolver (KICZALES et al., 1997).Assim nasceu a programação orientada a aspectos (POA), com o objetivo de apresentartécnicas capazes de cobrir essas falhas.

A POA trabalha com o princípio de separação de interesses (separation ofconcerns), que prega que as preocupações envolvidas no desenvolvimento de umsoftware devem ser focadas e trabalhadas separadamente, concentrando em uma de cadavez, reduzindo a probabilidade de ocorrência de erros em cada módulo econseqüentemente no sistema como um todo (KULESZA; SANT’ANNA; LUCENA,2005). Estes conceitos favorecem a reusabilidade e manutenibilidade do software. Éuma tecnologia criada para a implementação de interesses transversais (crosscutingconcerns), que são aqueles cuja implementação atravessam os componentesresponsáveis pela modularização do sistema (RESENDE; SILVA, 2005).

A POA oferece uma estrutura que encapsula implementações de umaresponsabilidade que ficariam espalhadas no modelo orientado a objetos. Esta unidade échamada de aspecto (NELSON, 2005). Para uma implementação básica de POA, énecessário: uma linguagem para programação dos componentes, como por exemplo oJava; uma linguagem para programação dos aspectos, como o AspectJ; um weaver; umprograma de componentes e um programa de aspectos (STEINMACHER, 2001). Oweaver (ou montador) é o combinador de aspectos. Sua função é combinar os programasescritos em linguagem de componentes, no caso, as regras de negócio implementadas

com orientação a objeto, com os escritos em linguagem de aspecto. O resultado será umprograma mesclando as funcionalidades implementadas nos programas de componentese aspecto (GROTT, 2005).

Na POA não há chamada explícita de métodos entre as partes. Ao invés disso, éespecificada em uma unidade separada, como uma parte deve reagir a eventos queocorrem em outra parte (NELSON, 2005).

Este artigo apresenta o desenvolvimento de um protótipo de um weaver parageração de código na linguagem Delphi com suporte a programação orientada aaspectos. Por se tratar de uma ferramenta de engenharia de software, ela é voltada para odesenvolvedor. A ferramenta recebe como entrada um arquivo de projeto do Delphi(arquivo .dpr), e um ou mais programas na linguagem de aspecto AOPDelphi, que foicriada neste trabalho. A ferramenta realiza análises léxica e sintática dos programas deaspectos fornecidos como entrada. Como saída, gera programas fontes na linguagemDelphi, mesclando as funcionalidades dos programas fornecidos como entrada. Esteweaver foi desenvolvido baseado no AspectJ1.

2. Linguagem AOPDelphi

A linguagem AOPDelphi é uma linguagem não case sensitive. Apesar de ter sidoinspirada na linguagem de aspectos do AspectJ, sua sintaxe e seus comandos sãosemelhantes aos da linguagem Delphi, pois ela é uma extensão dessa última linguagem.

2.1 Especificação

Para especificação da linguagem foi utilizada a ferramenta GALS (GESSER, 2003). Asdefinições regulares de auxílio para definição de tokens, os tokens e a gramática dalinguagem foram definidas nesta ferramenta. Baseado nessas especificações o GALSgera os fontes dos analisadores léxico e sintático da linguagem.

Na definição da gramática foi utilizada a notação Backus-Naur Form (BNF). Oquadro 1 apresenta a gramática da linguagem AOPDelphi e algumas definiçõesregulares por ela utilizada.

1 AspectJ é uma ferramenta de apoio a programação orientada a aspectos na linguagem Java que possui o seu � � � � � e sua linguagemde aspectos.

Quadro 1: BNF da linguagem AOPDelphi

2.2 Estrutura da linguagem AOPDelphi

A seguir são apresentadas as construções que formam a linguagem de aspectoAOPDelphi. Um programa AOPDelphi é composto por seu identificador, declarações devariáveis, declarações de pointcuts e declarações de advices, formando um aspecto,como mostra o quadro 2.

������������� ������ �����������IDENTIFICADOR : (<letra> | "_") (<letra> | <digito> | "_")*CURINGA_IDENTIFICADOR: ("*" (<letra> | <digito> | "_")+)

| ((<letra> |"_") (<letra> | <digito> | "_")* "*"(<letra> | <digito> | "_")* (<letra> |"_" |

<digito>))| ((<letra> |"_") (<letra> | <digito> | "_")* "*")

CODIGO : .

���<AOPDelphi> ::= <define_aspecto> <declara_variaveis>

<implementation>End.

<define_aspecto> ::= IDENTIFICADOR = Aspect<letra> ::= [a-zA-Z]<digito> ::= [0-9]<declara_variaveis> ::= Var <lista_variaveis>

�<lista_variaveis> ::= <lista_identificador> : <tipos_primitivos>;

<lista_variaveis_linha><tipos_primitivos>::= string | integer | real

| double | extended | currency| boolean | variant | word| byte | char

<lista_identificador> ::= IDENTIFICADOR <lista_identificador_linha><lista_identificador_linha> ::= , IDENTIFICADOR <lista_identificador_linha>

�<lista_variav � � � � � � � � � � � � � � � � � � � � � � � � � � � � �<implementation> ::= Implementation <declara_pointcuts> <declara_advices>

|<declara_pointcuts>::= IDENTIFICADOR : Pointcut = ( <joinpoint> ) ;

<lista_pointcut><joinpoint>::= <excecao> | <metodo><excecao>::= Exception <indentificador_excecao><metodo>::= <tipo_metodo> <id_classe_metodo> . <id_classe_metodo>

( <parametros> )<tipo_metodo>::= Procedure | Function | Constructor

| Destructor | <curinga><id_classe_metodo>::= IDENTIFICADOR

| <curinga>| CURINGA_IDENTIFICADOR

<parametros>::= <tipos_primitivos> <parametros_linha>| <curinga>

<parametros_linha>::= , <tipos_primitivos> <parametros_linha>�

<lista_pointcut>::= <declara_pointcuts>�

<declara_advices>::= Advice IDENTIFICADOR : <tipo_advice> ;<codigo_advice> ;<lista_advice>

<tipo_advice>::= Before| After

<lista_advice>::= <declara_advices>�

<indentificador_excecao>::= IDENTIFICADOR | <curinga><curinga> ::= *<codigo_advice> ::= Begin (<codigo>)* EndAdvice<codigo> ::= CODIGO

Quadro 2: Exemplo de programa AOPDelphi

ALog = Aspect

Var

FId : Integer;

Str1, Str2 : String;

Implementation

logInsert : Pointcut = (procedure Arquivo.Insert(*));

Advice logInsert: Before;

begin

ShowMessage(‘Olá Mundo!’);

EndAdvice;

End.

No programa exemplificado no quadro 2 foi criado um aspecto de nome ALog,que possui três variáveis (FId, Str1, Str2), um pointcut e um advice, ambosidentificados por logInsert.

A declaração de variáveis na implementação de um aspecto é opcional e asregras sintáticas são as mesmas de um programa Delphi. A restrição é que são aceitasapenas declarações de variáveis de tipos primitivos do Delphi. Para cada variáveldeclarada no programa de aspecto é criado um atributo privado na classe interceptadapelo aspecto.

2.2.1 Pointcut

Os pointcuts, também conhecidos como conjuntos de junção, são utilizados paraespecificar os pontos no programa de componentes que serão interceptados e inseridosum comportamento diferente (RESENDE; SILVA, 2005). Ou seja, eles selecionam umconjunto de pontos de junção, também conhecidos por joinpoints. Os pointcuts podemser comparados com uma variável que armazena uma lista de assinaturas de métodosque serão interceptados e terão o fluxo normal do programa alterado. Na execução doprograma, ao ser invocado um desses métodos, o aspecto entra em ação executando asinstruções definidas para o respectivo pointcut. Há regras que permitem flexibilidade nadeclaração de pointcuts, não sendo necessário especificar um pointcut para cada pontode junção, o que tornaria a POA praticamente sem sentido (NELSON, 2005).

Na declaração de um pointcut em AOPDelphi, especifica-se o tipo de métodoque será interceptado. Um construtor, destrutor, procedimento, função ou exceção. Épossível generalizar, através do caracter *, fazendo com que o pointcut estejaassociando qualquer método, exceto uma exceção.

Especifica-se também a classe e método que serão interceptados. Utilizando ocaracter * é possível fazer uma combinação que se refira a várias classes e métodos. Omesmo acontece ao especificar os parâmetros do método. O pointcut declarado no

exemplo do quadro 2, identificado por logInsert, está se referindo ao métodoInsert da classe Arquivo, não importando quais sejam os parâmetros.

2.2.2 Advice

Os advices são construções semelhantes aos métodos na orientação a objetos e sãoassociados aos pointcuts. Eles contêm o código que será inserido no ponto de junçãoquando o pointcut correspondente for atingido. Podem ser executados antes ou depoisdo método interceptado (KULESZA; SANT’ANNA; LUCENA, 2005). Todo pointcutdeve possuir um ou dois advices.

Na linguagem AOPDelphi, o código Delphi contido no advice não é analisadopelo compilador. A linguagem permite que seja capturado o objeto que invocou ométodo interceptado, podendo utilizá-lo no escopo do advice, através da palavra self,como se tivesse sido criado localmente, porém é uma referência do objeto que chamou ométodo. No aspecto exemplificado no quadro 2, tem-se a implementação de um advicedo tipo before associado ao pointcut logInsert. Conforme o exemplo, o códigoShowMessage(‘Olá Mundo!’) será executado antes da execução do métodoInsert da classe Arquivo.

3. AOPDelphi

O AOPDelphi é uma ferramenta que provê suporte à programação orientada a aspectospara a linguagem Delphi e é composta por uma linguagem de aspecto e um weaver. Oweaver é o combinador de aspectos. Sua função é combinar os programas escritos emlinguagem de componentes, no caso, as regras de negócio implementadas comorientação a objeto, com os escritos em linguagem de aspectos, gerando um programaque mescle as funcionalidades definidas nesses programas de entrada. Este processo échamado de weaving (GROTT, 2005).

A ferramenta foi implementada utilizando a linguagem de programação Delphino ambiente Borland Delphi 7. Na implementação do compilador dos programas deaspectos foi utilizada também a ferramenta GALS (GESSER, 2003). Através dele foramgeradas as classes para a implementação dos analisadores léxico e sintático, e a interfaceda classe do analisador semântico. Isso é feito com base nas definições regulares,palavras reservadas, símbolos especiais, gramática e outras informações que sãofornecidas como entrada na ferramenta.

Na figura 1 é apresentado o diagrama de atividades do AOPDelphi onde estãoespecificadas suas funcionalidades de forma geral. Ele está dividido em duas raias,representadas pelo desenvolvedor e a ferramenta, com suas respectivas atividades.

Figura 1: Diagrama de atividades da ferramenta AOPDelphi

Conforme o diagrama da figura 1, após implementar e informar à ferramenta osprogramas de entrada, o programa de componentes (arquivo .dpr) é compilado paracertificar de que não contenha erros de compilação. Em seguida são compilados osprogramas de aspectos e organizados em objetos as informações necessárias pararealizar o processo de weaving. Não encontrando erros no processo de compilação, aferramenta faz uma cópia dos fontes do programa de componente fornecido na entrada.As alterações realizadas pelo weaver são feitas no programa cópia.

Em seguida é realizado o processo de weaving. Baseado nos pointcuts extraídosem cada aspecto, a ferramenta gera expressões regulares para varrer os fontes do projetoDelphi, localizar os joinpoints que devem ser interceptados e implementar a alteraçãoescrita no respectivo advice. Para trabalhar com expressões regulares, foi utilizada abiblioteca RegExp Studio (SOROKIN), que é uma biblioteca freeware para uso deexpressões regulares no Delphi. Finalizado o processo de weaving, o projeto alterado écompilado e se não houver erros de compilação o programa é executado. Havendo erros,é informado pela ferramenta o nome do fonte, classe e método com problema, além doaspecto e advice que originaram o erro.

Dentre as atividades apresentadas no diagrama ilustrado na figura 1, se destaca aatividade Weaving, principal atividade da ferramenta. Nela é representado o processodesde a seleção das units que serão analisadas pelo weaver até a junção do códigocontido no advice, quando este é inserido no método interceptado por um pointcut. Odiagrama de atividades do processo weaving é representado na figura 2.

Figura 2: Diagrama de atividades do processo de weaving

Neste processo, inicialmente a ferramenta extrai do arquivo de projeto Delphi,que será afetado pelos aspectos, as units que estão diretamente associadas ao projeto eadiciona-as a uma fila. Essas units também são lidas, e delas são extraídas as units asquais elas se referem, e as mesmas são adicionadas à fila. Este processo se repete paratodas as units referenciadas no projeto. Em seguida, o weaver varre a lista de aspectosdo projeto e para cada aspecto, varre a lista de pointcuts, gerando expressões regularesbaseadas em suas informações. Essas expressões regulares são parâmetros de busca nas

units adicionadas à fila para serem analisadas pelo weaver. Ao detectar nos fontesanalisados algum método que contemple a expressão regular em questão, o códigocontido nos advices associados ao pointcut é inserido neste método, antes ou depois docódigo já implementado, conforme definição do advice.

A ferramenta foi desenvolvida baseada no diagrama de classes da figura 3 e maisdetalhes de sua implementação estão disponíveis em Oliveira (2006).

Figura 3: Diagrama de classes da ferramenta AOPDelphi

3.1 Operacionalidade

Ao ser executado o aplicativo AOPDelphi, é exibida uma tela como mostra a figura 4.

Figura 4: Apresentação da ferramenta AOPDelphi

A tela é dividida em duas guias: Projeto AOP e Editor de Aspectos.A guia Editor de Aspectos é o ambiente para programação dos aspectos. Há comandosgerais para manipulação de arquivos, como solicitar um arquivo novo ou abrir, salvarum existente, além da função para compilar. Na guia Projeto AOP são definidos osparâmetros para compilação de um projeto orientado a aspectos.

No campo Projeto Delphi é informado o arquivo de projeto Delphi(arquivo .dpr) que será envolvido no projeto orientado a aspectos. Todas as units quefazem parte desse projeto serão aspectadas2, com exceção daquelas que estiveremincluídas nas listas de units que não devem ser afetadas por aspectos. O AOPDelphioferece mecanismos para criar tais listas.

Após informar o projeto Delphi, o desenvolvedor deve indicar à ferramentaquais são os programas de aspectos que irão interagir com o projeto Delphi informado.A ferramenta dispõe de funcionalidades para adicionar e remover programas de aspectos(arquivo .dao) na lista de aspectos do projeto. O quadro 3 apresenta uma implementaçãode um aspecto de autenticação, onde o objetivo é permitir que somente usuáriosautorizados possam efetuar determinadas operações (inserção, alteração e exclusão) nastabelas da base de dados de um sistema.

2 Trata-se de um neologismo. É o mesmo que ser afetado pelo aspecto.

Quadro 3: Aspecto de autenticação

AAutenticacao = AspectImplementationAutenticaInsert : Pointcut = (* *.SQLInsert(*));AutenticaUpdate : Pointcut = (* *.SQLUpdate(*));AutenticaDelete : Pointcut = (* *.SQLDelete(*));

Advice AutenticaInsert: Before;beginWith DMTaskMan.qryAutentica dobeginClose;Sql.Clear;Sql.Add(’Select count(*) from DIREITO_USUARIO’);Sql.Add(’Where IDUSUARIO = :IDUSUARIO and OPERACAO = :OPERACAO’);Sql.Add(’ and TABELA = :TABELA’);ParamByName(’IDUSUARIO’).AsInteger := giCodUsuario;ParamByName(’OPERACAO’).AsInteger := 1; //1=Insert, 2=Update, 3=DeleteParamByName(’TABELA’).AsInteger := Self.NomeTabela;ExecSQL;if Fields[0].AsInteger = 0 then

Raise Exception.Create('Você não tem permissão para essa atividade. '+ Chr(13) + 'Entre em contato com o seu superior.');

end;EndAdvice;

Advice AutenticaUpdate: Before;beginWith DMTaskMan.qryAutentica dobegin...ParamByName('OPERACAO').AsInteger := 2; //1=Insert, 2=Update, 3=Delete...

end;EndAdvice;

Advice AutenticaDelete: Before;beginWith DMTaskMan.qryAutentica dobegin...ParamByName('OPERACAO').AsInteger := 3; //1=Insert, 2=Update, 3=Delete...

end;EndAdvice;

End.

Em seguida o desenvolvedor pode indicar à ferramenta as listas de units que nãoserão afetadas pelos aspectos do projeto. A cada lista adicionada, suas units sãoinseridas no campo Units não afetadas por aspectos. Durante o processode weaving, cada unit referenciada em algum fonte lido será analisada, a menos de queseu nome conste nesta lista de restrição.

Tendo informado esses parâmetros, o projeto AOPDelphi está pronto para sercompilado. Ao executar o comando Weaving, é feita a consistência no projeto Delphi eem seguida são compilados os programas de aspectos. É feita a cópia do projeto Delphioriginal e inicia-se a junção dos programas de aspectos e do programa de componentes.Os fontes gerados são compilados e ocorrendo sucesso a aplicação será executada.Havendo erros de compilação no projeto Delphi após o weaving, a ferramenta apresentaos tais erros e sua origem.

Os quadros 4 e 5 mostram um método SQLDelete de uma classe afetada peloaspecto, antes e depois do processo de weaving, respectivamente.

Quadro 4: Método SQLDelete antes do processo de weaving� � � � � � � TClientes.SQLDelete(vId: Integer); � � � �

� � � � DMTaskMan.SqlQuery � � � � �

Close;Sql.Clear;Sql.Add(’Delete from CLIENTE Where CL_CODIGO = :CL_CODIGO’);ParamByName(’CL_CODIGO’).AsInteger := vID;ExecSql;� � �

� � �

Quadro 5: Método SQLDelete após o processo de weaving� � � � � � � TClientes.SQLDelete(vId: Integer); � � � �

� � � � � � ! � # $ % & � � ! ( ! & + - . / % 0 ( 3 � 4 6 # 8 9 � !� � � � DMTaskMan.qryAutentica � � � � �

Close;Sql.Clear;Sql.Add(’Select count(*) from DIREITO_USUARIO’);Sql.Add(’Where IDUSUARIO = :IDUSUARIO and OPERACAO = :OPERACAO’);Sql.Add(’ and TABELA = :TABELA’);ParamByName(’IDUSUARIO’).AsInteger := giCodUsuario;ParamByName(’OPERACAO’).AsInteger := 3; //1=Insert, 2=Update,

3=DeleteParamByName(’TABELA’).AsInteger := Self.NomeTabela;ExecSQL;

� : Fields[0].AsInteger = 0 � � � �Raise Exception.Create('Você não tem permissão para essa

atividade. ' + Chr(13) +'Entre em contato com o seu superior.');� � �

� � � � � � ! � # $ % & � � ! ( ! & + - . / % 0 ( 3 � 4 < � >

� � � � DMTaskMan.SqlQuery � � � � �

Close;Sql.Clear;Sql.Add('Delete from CLIENTE Where CL_CODIGO = :CL_CODIGO');ParamByName('CL_CODIGO').AsInteger := vID;ExecSql;

� � �� � �

Conforme definido no advice AutenticaDelete do tipo before, o códigonele contido foi inserido no método interceptado, antes das instruções que já estavam aliimplementadas.

4. Conclusões

Considerando a proposta e as vantagens da programação orientada a aspectos, ossoftwares desenvolvidos com essas técnicas tendem a serem mais flexíveis, melhorandoa manutenibilidade e reusabilidade, pois a implementação dos interesses transversaisfica encapsulada em módulos fisicamente separados do restante do código. Dessa forma,cada componente terá apenas código específico da implementação de seu negócio,permitindo uma melhor evolução do software.

Sendo uma tecnologia relativamente nova, e pelo fato das linguagens deprogramação existentes não proverem suporte nativo a POA, é importante o surgimentode novas ferramentas de apoio nessa área.

Na implementação do aspecto de autenticação na seção anterior, observa-se afacilidade e a confiabilidade que a ferramenta pode proporcionar no desenvolvimento.Nessa implementação através do AOPDelphi, foi necessário a implementação de umaspecto com três pointcuts e três advices. Além de manter íntegros os programas quetêm seu interesse específico, não gerando entrelaçamento de código, a implementaçãodo controle de autenticação está pronta até mesmo para as novas classes que vierem aserem adicionadas no sistema.

Uma limitação da linguagem de aspecto é a não possibilidade de criar variáveis,procedimentos e funções locais dentro dos advices, o que poderia facilitar bastantealgumas implementações.

5. Referências

GESSER, Carlos E. “GALS: gerador de analisadores léxicos e sintáticos”. 2003. 150 f.Trabalho de Conclusão de Curso (Bacharelado em Ciências da Computação) –Centro Tecnológico, Universidade Federal de Santa Catarina, Florianópolis.

GROTT, Márcio C. “Estudo de caso aplicando programação orientada a aspectos”.2005. 65 f. Monografia (Especialização em Tecnologia da Informação na GestãoIntegrada de Negócios) – Universidade Regional de Blumenau, Blumenau.

KICZALES, Gregor et al. “Aspect-oriented programming”, in Proceeding ofECOOP’97, Finland: Springer - Verlag, 1997.

KULESZA, Uirá; SANT’ANNA, Cláudio; LUCENA, Carlos J. P. “Técnicas de projetoorientado a aspectos”. Uberlândia, 2005. Disponível em: <http://www.sbbd-sbes2005.ufu.br/mini_cursos.aspx>. Acesso em: 01 maio 2006.

NELSON, Torsten. Apostila do curso de programação orientada a aspectos comAspectJ. Belo Horizonte, 2005. Disponível em:<http://www.aspectos.org/courses/aulasaop/curso_poa.pdf>. Acesso em: 26 abr.2006.

OLIVEIRA, Edmar Soares. “protótipo de um weaver para programação orientada aaspectos em delphi”. 2006. 72 f. Trabalho de Conclusão de Curso (Bacharelado emCiências da Computação) – Centro de Ciências Exatas e Naturais, UniversidadeRegional de Blumenau, Blumenau.

RESENDE, Antônio M. P.; SILVA, Claudiney C. “Programação orientada a aspectosem Java”. Rio de Janeiro: Brasoft, 2005.

SOROKIN, Andrey V. “RegExp studio”. Saint Petersburg, Rússia, 2004. Disponívelem: <http://regexpstudio.com/TRegExpr/TRegExpr.html>. Acesso em: 01 mar.2006.

STEINMACHER, Igor F. “Estudo de caso aplicando programação orientada aaspectos”. 2002. 72 f. Trabalho de Conclusão de Curso (Bacharelado em Ciências daComputação) – Universidade Estadual de Maringá, Maringá.