egenharia de software orientado a aspectos

58
Engenharia de Software Dyego Ítallo, Marcos José, Weverson França Introdução História POA em outras linguagens Motivação Programação Orientada a Aspectos Gerenciamento de interesses com POA Desenvolvimento com POA Benefícios esperados AspectJ Instalação do AspectJ Joinpoints Pointcuts Adivices Aspectos versus Classes Modelagem de Aspectos em UML Engenharia de Software Orientada a Aspectos Dyego Ítallo Silva Ferreira Marcos José Ferreira Weverson Fraques França 03 de Janeiro de 2013 1/36 Engenharia de Software Avançar

Upload: dyegoitallo

Post on 25-May-2015

1.477 views

Category:

Documents


0 download

DESCRIPTION

Universidade Federal de Alagoas - Campus Arapiraca Curso : Ciência da Computação Período : 5º Disciplina: Engenharia de Software 1 Professor: Patrick Brito Equipe : Dyego Ítallo Silva Ferreira Weverson Fraques França Marcos José Ferreira Neto Descrição: Nesta apresentação, mostramos um pouco sobre Engenharia de Software Orientada a Aspetos e fizemos alguns exemplos práticos utilizando a extensão AspectJ para programar orientado a aspectos com Java.

TRANSCRIPT

Page 1: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Engenharia de SoftwareOrientada a Aspectos

Dyego Ítallo Silva Ferreira Marcos José FerreiraWeverson Fraques França

03 de Janeiro de 2013

1/36

Engenharia de Software Avançar

Page 2: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Roteiro1 Introdução

HistóriaPOA em outras linguagensMotivação

2 Programação Orientada a AspectosGerenciamento de interesses com POADesenvolvimento com POABenefícios esperados

3 AspectJInstalação do AspectJJoinpointsPointcutsAdivicesAspectos versus Classes

4 Modelagem de Aspectos em UML2/362/36

Engenharia de Software AvançarVoltar

Page 3: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

História

A Programação Orientada a Aspectos (POA) foicriada por Gregor Kiczales (1997) quando era ocientista da Xerox PARC (1996 – 2002)Os desenvolvedores da Xerox PARC criaram alinguagem AspectJA linguagem AspectJ é usada até hoje e é a maispopular linguaguem de POAA linguagem AspectJ é usada com Java

3/363/36

Engenharia de Software AvançarVoltar

Page 4: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

POA em outras linguagens

Linguagem AspectoJava AspectJC++ AspectC++C AspectC

Python Aspyct AOPNET AspectNET

JavaScript AjaxpectPHP PHPaspectRuby AspectRLua AspectLuaPerl The Aspect Module

4/364/36

Engenharia de Software AvançarVoltar

Page 5: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Motivação

Sistema de banco: Imagine que um banco, pediu paraque fosse feito software que gerencie todasas transações bancárias.

1 Quais os principais interesses?DepositoTransferênciaSaqueTEDDOC. . .

2 Quais os interesses secundários?Auditoria;Autorização;Persistência;. . .

5/365/36

Engenharia de Software AvançarVoltar

Page 6: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Motivação

Classificamos os interesses do software em:Concerns – Interesses primários (Núcleo do sistema)Crosscutting Concerns – Interesses transversais,que abrangem vários módulos do sistema.

6/366/36

Engenharia de Software AvançarVoltar

Page 7: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Problemas da POO

Implementações OO acoplam Concerns com osCrosscutting ConcernsQuando são adicionadas ou removidasfuncionalidades, na maior parte dos casos, émodificado o núcleo do sistemaMuitas propriedades importantes espalham-se porvários módulos e misturam-se com outraspropriedades de maneira intrusiva

LimitaçãoEsses problemas dificultam a reutilização e a manutençãodos componentes do sistema.

7/367/36

Engenharia de Software AvançarVoltar

Page 8: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Problemas da POO

Implementações OO acoplam Concerns com osCrosscutting ConcernsQuando são adicionadas ou removidasfuncionalidades, na maior parte dos casos, émodificado o núcleo do sistemaMuitas propriedades importantes espalham-se porvários módulos e misturam-se com outraspropriedades de maneira intrusiva

LimitaçãoEsses problemas dificultam a reutilização e a manutençãodos componentes do sistema.

7/367/36

Engenharia de Software AvançarVoltar

Page 9: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Problemas da POOExemplo prático

Sistema bancário: Implementar o métodoTranferenciaContas usando POO.

Implementação do método Trasferência de Contas

public void transferir(Conta origem, Conta destino, int valor) {origem.debitar(valor);destino.creditar(valor);}

8/368/36

Engenharia de Software AvançarVoltar

Page 10: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Problemas da POOExemplo prático

Sistema bancário: Implementar o métodoTranferenciaContas usando POO.

Implementação do método Trasferência de Contas

public void transferir(Conta origem, Conta destino, int valor) {origem.debitar(valor);destino.creditar(valor);}

8/368/36

Engenharia de Software AvançarVoltar

Page 11: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Problemas da POOExemplo prático

Verificar se o usuário possui saldo suficiente.

Implementação do método Trasferência de Contas

public void transferir(Conta origem, Conta destino, int valor) {if (origem.getSaldo() < valor) {

throw new SaldoInsuficienteException();}origem.debitar(valor);destino.creditar(valor);}

9/369/36

Engenharia de Software AvançarVoltar

Page 12: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Problemas da POOExemplo prático

Verificar se o usuário possui saldo suficiente.

Implementação do método Trasferência de Contas

public void transferir(Conta origem, Conta destino, int valor) {if (origem.getSaldo() < valor) {

throw new SaldoInsuficienteException();}origem.debitar(valor);destino.creditar(valor);}

9/369/36

Engenharia de Software AvançarVoltar

Page 13: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Problemas da POOExemplo prático

Verificar se o usuário possui permissão para realizara transação

Implementação do método Trasferência de Contas

public void transferir(Conta origem, Conta destino, int valor){if (!getUsuario().hasPermissao(OP_TRANSF)){

throw new PermissaoException();}if (origem.getSaldo() < valor) {

throw new SaldoInsuficienteException();}origem.debitar(valor);destino.creditar(valor);}

10/3610/36

Engenharia de Software AvançarVoltar

Page 14: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Problemas da POOExemplo prático

Verificar se o usuário possui permissão para realizara transação

Implementação do método Trasferência de Contas

public void transferir(Conta origem, Conta destino, int valor){if (!getUsuario().hasPermissao(OP_TRANSF)){

throw new PermissaoException();}if (origem.getSaldo() < valor) {

throw new SaldoInsuficienteException();}origem.debitar(valor);destino.creditar(valor);}

10/3610/36

Engenharia de Software AvançarVoltar

Page 15: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Problemas da POOExemplo prático

Verificar se o valor do dinheiro é negativo

Implementação do método Trasferência de Contas

public void transferir(Conta origem, Conta destino, int valor){if (valor < 0) {

throw new TransferenciaNegativaException();}if (!getUsuario().hasPermissao(OP_TRANSF)){

throw new PermissaoException();}if (origem.getSaldo() < valor) {

throw new SaldoInsuficienteException();}origem.debitar(valor);destino.creditar(valor);}

11/3611/36

Engenharia de Software AvançarVoltar

Page 16: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Problemas da POOExemplo prático

Verificar se o valor do dinheiro é negativo

Implementação do método Trasferência de Contas

public void transferir(Conta origem, Conta destino, int valor){if (valor < 0) {

throw new TransferenciaNegativaException();}if (!getUsuario().hasPermissao(OP_TRANSF)){

throw new PermissaoException();}if (origem.getSaldo() < valor) {

throw new SaldoInsuficienteException();}origem.debitar(valor);destino.creditar(valor);}

11/3611/36

Engenharia de Software AvançarVoltar

Page 17: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Problemas da POOExemplo prático

Previnir perda de dados

Implementação do método Trasferência de Contas

public void transferir(Conta origem, Conta destino, int valor){if (valor < 0) {

throw new TransferenciaNegativaException();}if (!getUsuario().hasPermissao(OP_TRANSF)){

throw new PermissaoException();}if (origem.getSaldo() < valor) {

throw new SaldoInsuficienteException();}

DatabaseTransacao dt = new DatabaseTransacao();

try {origem.debitar(valor);destino.creditar(valor);dt.enviar(origem, destino);

}catch(Exception e) {dt.reverter();

}}

12/3612/36

Engenharia de Software AvançarVoltar

Page 18: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Problemas da POOExemplo prático

Previnir perda de dadosImplementação do método Trasferência de Contas

public void transferir(Conta origem, Conta destino, int valor){if (valor < 0) {

throw new TransferenciaNegativaException();}if (!getUsuario().hasPermissao(OP_TRANSF)){

throw new PermissaoException();}if (origem.getSaldo() < valor) {

throw new SaldoInsuficienteException();}

DatabaseTransacao dt = new DatabaseTransacao();

try {origem.debitar(valor);destino.creditar(valor);dt.enviar(origem, destino);

}catch(Exception e) {dt.reverter();

}}

12/3612/36

Engenharia de Software AvançarVoltar

Page 19: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Problemas da POOExemplo prático

Adicionando ao log de dados da aplicação

Implementação do método Trasferência de Contas

public void transferir(Conta origem, Conta destino, int valor){if (valor < 0) {

throw new TransferenciaNegativaException();}if (!getUsuario().hasPermissao(OP_TRANSF)){

throw new PermissaoException();}if (origem.getSaldo() < valor) {

throw new SaldoInsuficienteException();}

DatabaseTransacao dt = new DatabaseTransacao();

try {origem.debitar(valor);destino.creditar(valor);dt.enviar(origem, destino);logger.logOperacao(OP_TRANSF, origem, destino, valor);

}catch(Exception e) {dt.reverter();logger.logErro(OP_TRANSF, e.getMenssage);

}}

13/3613/36

Engenharia de Software AvançarVoltar

Page 20: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Problemas da POOExemplo prático

Adicionando ao log de dados da aplicaçãoImplementação do método Trasferência de Contas

public void transferir(Conta origem, Conta destino, int valor){if (valor < 0) {

throw new TransferenciaNegativaException();}if (!getUsuario().hasPermissao(OP_TRANSF)){

throw new PermissaoException();}if (origem.getSaldo() < valor) {

throw new SaldoInsuficienteException();}

DatabaseTransacao dt = new DatabaseTransacao();

try {origem.debitar(valor);destino.creditar(valor);dt.enviar(origem, destino);logger.logOperacao(OP_TRANSF, origem, destino, valor);

}catch(Exception e) {dt.reverter();logger.logErro(OP_TRANSF, e.getMenssage);

}} 13/3613/36

Engenharia de Software AvançarVoltar

Page 21: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Problemas da POOO que podemos extrair desse exemplo?

O código perdeu elegânciaO código perdeu simplicidadeO código da regra do negócio foi voltado paraoutros objetivos (misturado)

VerificaçõesSegurançaLog de dadosPersistência de dados

Código redundanteCódigo de difícil manutençãoCódigo de difícil compreensãoCódigo de difícil reutilização

14/3614/36

Engenharia de Software AvançarVoltar

Page 22: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Problemas da POOO que podemos extrair desse exemplo?

O código perdeu elegância

O código perdeu simplicidadeO código da regra do negócio foi voltado paraoutros objetivos (misturado)

VerificaçõesSegurançaLog de dadosPersistência de dados

Código redundanteCódigo de difícil manutençãoCódigo de difícil compreensãoCódigo de difícil reutilização

14/3614/36

Engenharia de Software AvançarVoltar

Page 23: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Problemas da POOO que podemos extrair desse exemplo?

O código perdeu elegânciaO código perdeu simplicidade

O código da regra do negócio foi voltado paraoutros objetivos (misturado)

VerificaçõesSegurançaLog de dadosPersistência de dados

Código redundanteCódigo de difícil manutençãoCódigo de difícil compreensãoCódigo de difícil reutilização

14/3614/36

Engenharia de Software AvançarVoltar

Page 24: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Problemas da POOO que podemos extrair desse exemplo?

O código perdeu elegânciaO código perdeu simplicidadeO código da regra do negócio foi voltado paraoutros objetivos (misturado)

VerificaçõesSegurançaLog de dadosPersistência de dados

Código redundanteCódigo de difícil manutençãoCódigo de difícil compreensãoCódigo de difícil reutilização

14/3614/36

Engenharia de Software AvançarVoltar

Page 25: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Problemas da POOO que podemos extrair desse exemplo?

O código perdeu elegânciaO código perdeu simplicidadeO código da regra do negócio foi voltado paraoutros objetivos (misturado)

VerificaçõesSegurançaLog de dadosPersistência de dados

Código redundante

Código de difícil manutençãoCódigo de difícil compreensãoCódigo de difícil reutilização

14/3614/36

Engenharia de Software AvançarVoltar

Page 26: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Problemas da POOO que podemos extrair desse exemplo?

O código perdeu elegânciaO código perdeu simplicidadeO código da regra do negócio foi voltado paraoutros objetivos (misturado)

VerificaçõesSegurançaLog de dadosPersistência de dados

Código redundanteCódigo de difícil manutenção

Código de difícil compreensãoCódigo de difícil reutilização

14/3614/36

Engenharia de Software AvançarVoltar

Page 27: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Problemas da POOO que podemos extrair desse exemplo?

O código perdeu elegânciaO código perdeu simplicidadeO código da regra do negócio foi voltado paraoutros objetivos (misturado)

VerificaçõesSegurançaLog de dadosPersistência de dados

Código redundanteCódigo de difícil manutençãoCódigo de difícil compreensão

Código de difícil reutilização

14/3614/36

Engenharia de Software AvançarVoltar

Page 28: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Problemas da POOO que podemos extrair desse exemplo?

O código perdeu elegânciaO código perdeu simplicidadeO código da regra do negócio foi voltado paraoutros objetivos (misturado)

VerificaçõesSegurançaLog de dadosPersistência de dados

Código redundanteCódigo de difícil manutençãoCódigo de difícil compreensãoCódigo de difícil reutilização

14/3614/36

Engenharia de Software AvançarVoltar

Page 29: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Causa dos problemas da POO

Figura: [Lincoln, 2009] Projeto antes dos requisitostransversais

15/3615/36

Engenharia de Software AvançarVoltar

Page 30: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Causa dos problemas da POO

Figura: [Lincoln, 2009] Projeto depois dos requisitostransversais

16/3616/36

Engenharia de Software AvançarVoltar

Page 31: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Causa dos problemas da POO

Figura: [Lincoln, 2009] Problema multidimensinal

17/3617/36

Engenharia de Software AvançarVoltar

Page 32: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Programação Orientada a Aspectos

A programação Orientada a Aspectos (POA) é umanova metodologia que:

Separa os interesses, responsábilidades e requisistos(Concerns) de um sistemaA modularização dos Aspectos produz umaarquitetura fácil de projetar, implementar e manter

POO X POAA POA não veio para substituir a POO, e sim paracomplementá-la, pois a POA usada sozinha não trazbenefícios para o projeto de software.

18/3618/36

Engenharia de Software AvançarVoltar

Page 33: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Programação Orientada a Aspectos

A programação Orientada a Aspectos (POA) é umanova metodologia que:

Separa os interesses, responsábilidades e requisistos(Concerns) de um sistemaA modularização dos Aspectos produz umaarquitetura fácil de projetar, implementar e manter

POO X POAA POA não veio para substituir a POO, e sim paracomplementá-la, pois a POA usada sozinha não trazbenefícios para o projeto de software.

18/3618/36

Engenharia de Software AvançarVoltar

Page 34: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Gerenciamento de interesses (Concerns)

Um Concern é um requisito específico de um sistema.Existem dois tipos de Concern, são eles:

1 Core Concerns – são os requisitos dasfuncionalidades centrais de um módulo (núcleo)

2 Crosscutting Concerns – são os requistos dasfuncionalidades periférias do sistemas, onde, sãousados em diversos módulos do sistema

Em um projeto desenvolvido com POA, o engenheirodeve se preocupar durante todo o projeto com aseparação de interesses (separation of concerns).Os interesses transversais são encapsulados pelosaspectos.

19/3619/36

Engenharia de Software AvançarVoltar

Page 35: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Programação Orientada a AspectosDesenvolvimento com POA

Identificar concernsImplementar

Classes para o negócioAspectos para crosscutting concernsClasses de negócio não ficam cientes da existênciados Aspectos

Combinar concerns (weaver)Identificar crosscutting e core concerns

20/3620/36

Engenharia de Software AvançarVoltar

Page 36: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Desenvolvimento com POA

Classes – encapsulam os requisitos do sistemaAspectos – encapsulam os requisitos transversaisWeaver – acoplam os apectos e classes em umprograma

Figura: [Lincoln, 2009] Funcionamento da POA

21/3621/36

Engenharia de Software AvançarVoltar

Page 37: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Benefícios esperados

Boa modularidadeFácil desenvolvimentoFácil manutençãoFácil reutilização

Software “plug and play”;

22/3622/36

Engenharia de Software AvançarVoltar

Page 38: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

AspectJ

É uma extensão java para programar orientado aaspectosÉ um weaver para java

Pré-processadorFácil de aprender e implementar

23/3623/36

Engenharia de Software AvançarVoltar

Page 39: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Instalação do AspectJ

Para instalar o AspectJ é necessário ter a máquinavirtual Java (JDK), o ambiente de desenvolvimento(Eclipse) e o plugin para o Eclipse (AJDT);

JDK – http://www.oracle.com/technetwork/java/javase/downloads/index.html

AJDT – http://download.eclipse.org/technology/ajdt/30/update

Eclipse – http://download.eclipse.org/downloald/index.html

24/3624/36

Engenharia de Software AvançarVoltar

Page 40: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

AspectJ

1 Crosscutting estático – Modifica classes, interfacee aspectos sem modificar o comportamento doprograma.

2 Crosscutting dinâmico – Adiciona comportamentodinamicamente ao programa através de uma regraque determina a execução de uma ação.

25/3625/36

Engenharia de Software AvançarVoltar

Page 41: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

AspectJWildcards

* – sequência de caracteres sem pontos.. – sequência de caracteres+ – subclasse da classe em questão

26/3626/36

Engenharia de Software AvançarVoltar

Page 42: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

AspectJExemplo de Wildcards

pointcut finds(): call (* find*(..))findCliente();findClienteByName();findClienteByCpf();findClienteByTelefone().

27/3627/36

Engenharia de Software AvançarVoltar

Page 43: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

AspectJJoinpoints

São pontos em que os apectos interceptam as classescallexecutioninitializationpreinitializationstaticinitializationhandlergetsetargsadviceexecutionthistarget

28/3628/36

Engenharia de Software AvançarVoltar

Page 44: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

AspectjPointcuts

São um conjunto de joinpointsDetectam quais joinpoints devem ser interceptadosPodem ter ações booleanas (!, e ||) e argumentos

Estruturapointcut nomePointcut(ListaParametros):«expressao»;

Exemplo de pointcut

pointcut traced(Person p) : target(p) &&call(public * set*(..)) ||call(public * get*(..));

29/3629/36

Engenharia de Software AvançarVoltar

Page 45: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

AspectjPointcuts

São um conjunto de joinpointsDetectam quais joinpoints devem ser interceptadosPodem ter ações booleanas (!, e ||) e argumentosEstrutura

pointcut nomePointcut(ListaParametros):«expressao»;

Exemplo de pointcut

pointcut traced(Person p) : target(p) &&call(public * set*(..)) ||call(public * get*(..));

29/3629/36

Engenharia de Software AvançarVoltar

Page 46: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

AspectjPointcuts

São um conjunto de joinpointsDetectam quais joinpoints devem ser interceptadosPodem ter ações booleanas (!, e ||) e argumentosEstrutura

pointcut nomePointcut(ListaParametros):«expressao»;

Exemplo de pointcut

pointcut traced(Person p) : target(p) &&call(public * set*(..)) ||call(public * get*(..));

29/3629/36

Engenharia de Software AvançarVoltar

Page 47: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

AspectJAdivices

São partes de códigos associados a pointcutsTipos

beforeafteraround

FormatipoAdvice(ListaParametros) :ListaPointCut()corpoExemplos

before(param) : pointcut(param) ...after(param) : pointcut(param) ...

30/3630/36

Engenharia de Software AvançarVoltar

Page 48: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

AspectJAdivices

São partes de códigos associados a pointcutsTipos

beforeafteraround

FormatipoAdvice(ListaParametros) :ListaPointCut()corpoExemplos

before(param) : pointcut(param) ...after(param) : pointcut(param) ...

30/3630/36

Engenharia de Software AvançarVoltar

Page 49: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

AspectJthisJoinPoint

É similar ao this do Java.Disponibiliza informações do joinpoint que estásendo usado.

Exemplo:thisJoinPoint.toString()thisJoinPoint.getArgs()

31/3631/36

Engenharia de Software AvançarVoltar

Page 50: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

AspectJthisJoinPoint

É similar ao this do Java.Disponibiliza informações do joinpoint que estásendo usado.Exemplo:

thisJoinPoint.toString()thisJoinPoint.getArgs()

31/3631/36

Engenharia de Software AvançarVoltar

Page 51: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

AspectJReuso

Da mesma forma como nas classes

Reúso

public abstract aspect AspectoMae {protected abstract pointcut PointCut_um();

// advice}

public aspect AspectoFilho extends AspectoMae{protected pointcut PointCut_um(): call(* set*(..));

}

32/3632/36

Engenharia de Software AvançarVoltar

Page 52: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

AspectJReuso

Da mesma forma como nas classesReúso

public abstract aspect AspectoMae {protected abstract pointcut PointCut_um();

// advice}

public aspect AspectoFilho extends AspectoMae{protected pointcut PointCut_um(): call(* set*(..));

}

32/3632/36

Engenharia de Software AvançarVoltar

Page 53: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

AspectJAspectos versus Classes

1 Apectos e classes são similares:Tem um tipoTrabalha com herançaSão abstrados ou concretosPodem conter atributos e métodos

2 Aspectos são diferentes das classes:Não tem construtor nem destrutorNão são criados com newPodem conter pointcuts e advices

33/3633/36

Engenharia de Software AvançarVoltar

Page 54: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

AspectJAspectos versus Classes

1 Apectos e classes são similares:Tem um tipoTrabalha com herançaSão abstrados ou concretosPodem conter atributos e métodos

2 Aspectos são diferentes das classes:Não tem construtor nem destrutorNão são criados com newPodem conter pointcuts e advices

33/3633/36

Engenharia de Software AvançarVoltar

Page 55: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Modelagem de Aspectos em UMLDiagrama de classes

pointcutadviceintroduction

Figura: Representação de um Aspecto em UML

34/3634/36

Engenharia de Software AvançarVoltar

Page 56: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Modelagem de Aspectos em UMLDiagrama de classes

pointcutadviceintroduction

Figura: Representação de um Aspecto em UML

34/3634/36

Engenharia de Software AvançarVoltar

Page 57: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Modelagem de Aspectos em UMLDiagrama de sequência

pointcuts – devem ser representados como atoresdo sistema. No caso de um pointcut se chamarteste. O ator é determinado como pointcut(teste)advices – de acordo com sua forma de execuçãoantes (before) ou depois (after) de um pointcut,devem estabelecer uma ligação com o mesmo, edeste ponto a diante definir a sequências dasoperações a serem executadasintroductions – podem ser executados normalmentea partir da inclusão de uma classe estática.

35/3635/36

Engenharia de Software AvançarVoltar

Page 58: Egenharia de Software Orientado a Aspectos

Engenharia de Software

Dyego Ítallo, MarcosJosé, Weverson França

IntroduçãoHistória

POA em outras linguagens

Motivação

Programação Orientadaa AspectosGerenciamento de interesses comPOA

Desenvolvimento com POA

Benefícios esperados

AspectJInstalação do AspectJ

Joinpoints

Pointcuts

Adivices

Aspectos versus Classes

Modelagem deAspectos em UML

Referências

S.ROCHA, Lincloln. Introdução a poa e aspectj.Fortaleza: Ufc, 2009.GOMES, Edeyson Andrade. Programação orientadaa aspectos. Campinas: Edeyson, 2007.RESENDE, Antônio Maria Pereira de; SILVA,Claudiney Calixto da. Programação orientada aaspectos em java. Rio de Janeiro: Brasport, 2005.

36/3636/36

Engenharia de Software Voltar