SlideShare uma empresa Scribd logo
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013
Programação Orientada a
Aspectos
Ricardo Terra
rterrabh [at] gmail.com
Programação Orientada a Aspectos 1
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013
CV
Nome: Ricardo Terra
Email: rterrabh [at] gmail.com
www: ricardoterra.com.br
Twitter: rterrabh
Lattes: lattes.cnpq.br/ 0162081093970868
Ph.D. (UFMG/UWaterloo),
Post-Ph.D. (INRIA/Université Lille 1)
Background
Acadêmico: UFLA (desde 2014), UFSJ (1 ano), FUMEC (3 anos), UNIPAC (1 ano), FAMINAS (3 anos)
Profissional: DBA Eng. (1 ano), Synos (2 anos), Stefanini (1 ano)
Programação Orientada a Aspectos 2
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
Nomenclaturas
§  Quaisquer das nomenclaturas abaixo é valida:
§  AOP à Aspect-Oriented Programming
§  POA à Programação Orientada a Aspectos (tradução)
§  AOSD à Aspect-Oriented Software Development
§  Já familiarizados com a variedade de termos para AOP, vamos
simplesmente falar AOP
3
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
Introdução
§  Paradigmas de Programação:
§  Programação Estruturada
§  Programação Orientada a Objetos (OOP)
§  Programação Orientada a Aspectos (AOP)
§  Boas perguntas a serem realizadas:
§  A OOP substitui a programação estruturada?
§  Então a AOP veio para substituir a OOP?
4
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
OOP vs AOP?
§  OOP
§  Paradigma dominante de programação
§  Unidade básica de modularização: classes
§  Desenvolvimento orientado a objetos:
§  Decomposição dos sistemas em classes
§  Classes implementam interesses (concerns) do sistema
5
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
OOP vs AOP?
ECOOP - European Conference on Object-Oriented Programming
§  Na ECOOP 1997, Gregor Kiczaler, propôs a AOP no artigo
Aspect-Oriented Programming
§  "We have found many programming problems for which
neither procedural nor object-oriented programming
techniques are sufficient to clearly capture some of the
important design decisions the program must implement. This
forces the implementation of those design decisions to be
scattered throughout the code, resulting in tangled code that
is excessively difficult to develop and maintain."
§  Principal objetivo da AOP:
§  Separation of Concerns
(separação de interesses, requisitos, funcionalidades…)
6
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
OOP vs AOP?
§  “O paradigma de orientação a objetos tem se consolidado como o
principal paradigma para o desenvolvimento de sistemas de
software. Entretanto, as abstrações e os mecanismos de
composição desse paradigma possuem limitações para separar e
compor alguns interesses relevantes em um sistema de software.”
§  “Assim, muitas propriedades importantes espalham-se por vários
módulos e misturam-se com outras propriedades de um sistema de
maneira intrusiva, dificultando a reutilização e manutenção de seus
componentes.”
§  “A POA propõe um novo tipo de abstração – denominado aspecto
– e novos mecanismos de composição que permitem a descrição
modular e a composição de interesses que geralmente se
encontram espalhados e misturados (crosscutting concerns) em
vários pontos de um sistema de software tradicional.”
7
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
OOP e AOP!
§  Respondendo a pergunta:
§  AOP não veio para substituir OOP
§  AOP trabalha em conjunto com a OOP
§  Uma linguagem orientada por aspectos permite confinar
interesses transversais (crosscutting concerns) em módulos
§  Em AOP, tais módulos são chamados de aspectos
§  Boa pergunta a ser realizada:
§  O que são interesses transversais (crosscutting concerns)?
8
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
Interesses transversais
§  São requisitos que não são facilmente implementados em uma
ou em poucas classes do sistema
§  Pode-se dizer que estes requisitos "pertencem" a todo o sistema
§  Exemplos:
§  Logging
§  Autenticação
§  Controle de acesso
§  Controle de transações
§  Persistência
§  Não é comum, mas requisitos funcionais também podem
apresentar um comportamento transversal
9
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
Interesses transversais
§  Principais problemas com requisitos transversais:
§  Código espalhado (code spreading/scattered)
§  Interesse transversal espalhado em diversas classes
§  Código entrelaçado (code tangling)
§  Interesse transversal entrelaçado com código de negócio
10
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
Código do Apache Tomcat
§  Para explicar na prática o que vem a ser um requisito transversal
ou não-transversal, vamos fazer análise sobre o código fonte do
Apache Tomcat
11
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
Código do Apache Tomcat
§  Requisito não-transversal
§  Parsing de documento HTML
12
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
§  Requisito transversal (exemplo tradicional)
§  Logging
Código do Apache Tomcat
Código espalhado (scattered) e entrelaçado (tangled)
13
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
OOP vs AOP?
⇒
Implementação OOP de
logging
Implementação AOP de
logging
§  Boa pergunta a ser realizada:
§  Qual das implementações acima está mais fácil de ser
desenvolvida e de ser mantida?
14
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
§  Identificar e caracterizar os requisitos
§  Implementar requisitos não-transversais utilizando CLASSES
§  Implementar requisitos transversais utilizando ASPECTOS
§  Aspecto é uma unidade de modularização
§  Aspectos são desenvolvidos de forma isolada
§  Os módulos influenciados não necessitam de modificações
§  São combinados com os outros módulos usando
mecanismos declarativos ou programáticos
§  Boa pergunta a ser realizada:
§  Vamos supor que eu implemente alguns aspectos. Como é
feita a sua combinação com os outros módulos de minha
aplicação?
Utilizando AOP
15
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
Interseção
§  Processo de interseção, conhecido como WEAVING
§  Ele é o responsável por “injetar” os aspectos, ou melhor, é a
ferramenta que combina código OO e código OA para a
geração do sistema final
§  É um processo relativamente lento
16
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
Conceitos básicos
§  Joinpoints (pontos de junção)
§  São pontos da execução do programa:
§  chamadas e execuções de métodos ou construtores
§  retorno de métodos ou construtores
§  lançamento ou tratamento de exceções
§  alteração de campos de classe
§  Pointcuts (coleção de pontos de junção)
§  Exemplos:
§  Todas as execuções de métodos públicos
§  Toda criação de objetos da classe Point
§  Toda chamada do método Point.setX ou Point.setY
§  Toda alteração do campo x da classe Point
17
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
Conceitos básicos
§  Advices
§  Código que deve executar no momento de qualquer joinpoint
de um pointcut
§  Exemplos:
§  chamar um método de log antes de toda chamada a
método público do programa
§  abrir conexão antes de executar métodos de persistência
§  fechar conexão depois de executar métodos de
persistência
§  chamar um método de atualização depois que qualquer
atributo de uma figura geométrica for alterado
§  executar um outro método ao invés de executar o método
§  Aspectos
§  Coleção de pointcuts e advices
18
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
Prática
§  Linguagens que permitem implementação AOP:
§  Java
§  AspectJ (a que será abordada)
§  HyperJ
§  Spring AOP
§  C e C++
§  AspectC e AspectC++, respectivamente
§  Aplicações de destaque que utiliza AOP:
§  FreeBSD (reestruturação do kernel)
§  JBoss AOP
§  Implementação de sistemas distribuídos
19
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
Prática
§  AspectJ
§  Extensão orientada a aspectos para Java
§  Declarações de aspectos são similares a declarações de
classes (como veremos nos exemplos a frente)
§  Em um aspecto podem ser declarados:
§  Pointcuts (conjuntos de junção)
§  Advices
20
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
Prática
§  Com a teoria já absorvida podemos ir um pouco além e mostrar
alguns exemplos
§  Os exemplos a seguir foram feitos utilizando:
§  Eclipse (Kepler)
§  http://www.eclipse.org
§  AJDT: AspectJ Development Tools 2.2.3
§  http://www.eclipse.org/ajdt
21
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
§  Observe as classes abaixo:
§  Boa pergunta a ser realizada:
§  O que há de errado com o código acima?
public class Point {
private int x, y;
public int getX() {..}
public void setX(int x) {..}
public int getY() {..}
public void setY(int y) {..}
public void draw(Graphics g){..}
public void refresh(){
this.draw(Canvas.getGraphics(this));
}
}
public class Line {
private Point p1, p2;
public Point getP1() {..}
public void setP1(Point p1) {..}
public Point getP2() {..}
public void setP2(Point p2) {..}
public void draw(Graphics g){..}
public void refresh(){
this.draw(Canvas.getGraphics(this));
}
}
Prática 01
22
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
§  Métodos comuns
public class Point {
private int x, y;
public int getX() {..}
public void setX(int x) {..}
public int getY() {..}
public void setY(int y) {..}
public void draw(Graphics g){..}
public void refresh(){
this.draw(Canvas.getGraphics(this));
}
}
public class Line {
private Point p1, p2;
public Point getP1() {..}
public void setP1(Point p1) {..}
public Point getP2() {..}
public void setP2(Point p2) {..}
public void draw(Graphics g){..}
public void refresh(){
this.draw(Canvas.getGraphics(this));
}
}
Prática 01
23
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
public class Point extends Figure {
private int x,y;
public int getX() {..}
public void setX(int x) {..}
public int getY() {..}
public void setY(int y) {..}
public void draw(Graphics g){..}
}
public class Line extends Figure {
private Point p1,p2;
public Point getP1() {..}
public void setP1(Point p1) {..}
public Point getP2() {..}
public void setP2(Point p2) {..}
public void draw(Graphics g){..}
}
public abstract class Figure {
public abstract void draw(Graphics g);
public void refresh(){
this.draw(Canvas.getGraphics(this));
}
}
Prática 01
§  Solução: uso de herança como mecanismo de reuso
24
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
§  Observe as classes abaixo:
§  Boa pergunta a ser realizada:
§  O que há de errado com o código acima?
public class Point extends Figure {
...
public void setX(int x) {
this.x = x;
this.refresh();
}
public void setY(int y) {
this.y = y;
this.refresh();
}
...
}
public class Line extends Figure {
...
public void setP1(Point p1) {
this.p1=p1;
this.refresh();
}
public void setP2(Point p2) {
this.p2=p2;
this.refresh();
}
...
}
Prática 01
25
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
§  Chamada a um mesmo método no final de todos setters
public class Point extends Figure {
...
public void setX(int x) {
this.x = x;
this.refresh();
}
public void setY(int y) {
this.y = y;
this.refresh();
}
...
}
public class Line extends Figure {
...
public void setP1(Point p1) {
this.p1=p1;
this.refresh();
}
public void setP2(Point p2) {
this.p2=p2;
this.refresh();
}
...
}
Prática 01
26
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
public aspect RefreshingAspect {
pointcut setterMethods():
execution(public void Figure+.set*(..));
after(Figure f): setterMethods() && this(f) {
f.refresh();
}
}
public class Point extends Figure {
...
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
...
}
public class Line extends Figure {
...
public void setP1(Point p1) {
this.p1=p1;
}
public void setP2(Point p2) {
this.p2=p2;
}
...
}
Prática 01
§  Solução: uso de aspecto
27
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
§  Observe a classe abaixo:
§  Boa pergunta a ser realizada:
§  O que há de errado com o código acima?
public class Concerns {
public void doSomething(int value){
Logger.logEntry("doSomething(" + value + ")");
...
Logger.logExit("doSomething");
}
public void doAnotherThing(char a, double b){
Logger.logEntry("doAnotherThing(" + a + "," + b + ")");
...
Logger.logExit("doAnotherThing");
}
}
Prática 02
28
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
§  Implementação OOP de um requisito transversal
public class Concerns {
public void doSomething(int value){
Logger.logEntry("doSomething(" + value + ")");
...
Logger.logExit("doSomething");
}
public void doAnotherThing(char a, double b){
Logger.logEntry("doAnotherThing(" + a + "," + b + ")");
...
Logger.logExit("doAnotherThing");
}
}
Prática 02
29
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
public aspect LoggingAspect {
pointcut publicMethods() : execution(public * *(..));
pointcut logObjectMethods() : execution(* Logger.*(..));
pointcut loggableCalls(): publicMethods() && !logObjectMethods();
before() : loggableCalls() {
Logger.logEntry(thisJoinPoint.getSignature().toString());
}
after() : loggableCalls() {
Logger.logExit(thisJoinPoint.getSignature().toString());
}
}
Prática 02
§  Solução: uso de aspecto
30
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
public class Concerns {
public void doSomething(int value){
...
}
public void doAnotherThing(char a, double b){
...
}
}
Prática 02
§  Assim, o desenvolvedor não precisa dar atenção a requisito de
logging
31
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
Prática 02
§  Demostração da criação de todo um projeto orientado a
aspectos
32
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
§  Observe uma das classes de persistência do sistema:
§  Boa pergunta a ser realizada:
§  O que há de errado com o código acima?
public class UsuarioDAO implements IDataAccessObject{
...
public void add(Usuario usuario) throws SQLException{
Connection conn = null;
try {
conn = ConnectionLocator.getConnection(); //Abre a conexão
PreparedStatement st =
conn.prepareStatement("insert into USUARIO values (?,?,?)");
st.setString(1, usuario.getLogin());
st.setString(2, usuario.getSenha());
st.setString(3, usuario.getNome());
st.execute();
st.close();
conn.commit(); //Realiza commit
} catch (SQLException e) {
if (conn!=null){
conn.rollback(); //Realiza rollback
}
throw e;
}finally{
if (conn!=null){
conn.close(); //Fecha a conexão
}
}
}
...
}//Fim da Classe
Prática 03
33
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
§  Observe uma das classes de persistência do sistema:
§  Boa pergunta a ser realizada:
§  O que há de errado com o código acima?
public class UsuarioDAO implements IDataAccessObject{
...
public void add(Usuario usuario) throws SQLException{
Connection conn = null;
try {
conn = ConnectionLocator.getConnection(); //Abre a conexão
PreparedStatement st =
conn.prepareStatement("insert into USUARIO values (?,?,?)");
st.setString(1, usuario.getLogin());
st.setString(2, usuario.getSenha());
st.setString(3, usuario.getNome());
st.execute();
st.close();
conn.commit(); //Realiza commit
} catch (SQLException e) {
if (conn!=null){
conn.rollback(); //Realiza rollback
}
throw e;
}finally{
if (conn!=null){
conn.close(); //Fecha a conexão
}
}
}
...
}//Fim da Classe
Prática 03
public class UsuarioDAO implements IDataAccessObject{
...
public void add(Usuario usuario) throws SQLException{
Connection conn = null;
try {
conn = ConnectionLocator.getConnection(); //Abre a conexão
PreparedStatement st =
conn.prepareStatement("insert into USUARIO values (?,?,?)");
st.setString(1, usuario.getLogin());
st.setString(2, usuario.getSenha());
st.setString(3, usuario.getNome());
st.execute();
st.close();
conn.commit(); //Realiza commit
} catch (SQLException e) {
if (conn!=null){
conn.rollback(); //Realiza rollback
}
throw e;
}finally{
if (conn!=null){
conn.close(); //Fecha a conexão
}
}
}
...
}//Fim da Classe
34
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
§  Observe uma das classes de persistência do sistema:
§  Boa pergunta a ser realizada:
§  O que há de errado com o código acima?
public class UsuarioDAO implements IDataAccessObject{
...
public void add(Usuario usuario) throws SQLException{
Connection conn = null;
try {
conn = ConnectionLocator.getConnection(); //Abre a conexão
PreparedStatement st =
conn.prepareStatement("insert into USUARIO values (?,?,?)");
st.setString(1, usuario.getLogin());
st.setString(2, usuario.getSenha());
st.setString(3, usuario.getNome());
st.execute();
st.close();
conn.commit(); //Realiza commit
} catch (SQLException e) {
if (conn!=null){
conn.rollback(); //Realiza rollback
}
throw e;
}finally{
if (conn!=null){
conn.close(); //Fecha a conexão
}
}
}
...
}//Fim da Classe
Prática 03
public class UsuarioDAO implements IDataAccessObject{
...
public void add(Usuario usuario) throws SQLException{
Connection conn = null;
try {
conn = ConnectionLocator.getConnection(); //Abre a conexão
PreparedStatement st =
conn.prepareStatement("insert into USUARIO values (?,?,?)");
st.setString(1, usuario.getLogin());
st.setString(2, usuario.getSenha());
st.setString(3, usuario.getNome());
st.execute();
st.close();
conn.commit(); //Realiza commit
} catch (SQLException e) {
if (conn!=null){
conn.rollback(); //Realiza rollback
}
throw e;
}finally{
if (conn!=null){
conn.close(); //Fecha a conexão
}
}
}
...
}//Fim da Classe
35
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
§  Implementação OOP de controle transacional
public class UsuarioDAO implements IDataAccessObject{
...
public void add(Usuario usuario) throws SQLException{
Connection conn = null;
try {
conn = ConnectionLocator.getConnection(); //Abre a conexão
PreparedStatement st =
conn.prepareStatement("insert into USUARIO values (?,?,?)");
st.setString(1, usuario.getLogin());
st.setString(2, usuario.getSenha());
st.setString(3, usuario.getNome());
st.execute();
st.close();
conn.commit(); //Realiza commit
} catch (SQLException e) {
if (conn!=null){
conn.rollback(); //Realiza rollback
}
throw e;
}finally{
if (conn!=null){
conn.close(); //Fecha a conexão
}
}
}
...
}//Fim da Classe
Prática 03
36
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
Prática 03
§  Esta implementação faz com o código do controle transacional
esteja espalhado e entrelaçado em todos os métodos dos
DAOs
§  O ideal seria que, na chamada de qualquer método transacional,
fosse automaticamente feito:
§  Abertura de conexão
§  Realização do commit da transação
§  Encerramento da conexão
§  Tratamento de eventuais exceções que possam vir a ocorrer
37
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
public aspect PersistenceAspect percflow(topLevelTransactedMethods()) {
public Connection com.terra.dao.IDataAccessObject._connection;
pointcut transactedMethods() : execution(* com.terra.dao.IDataAccessObject+.*(..));
pointcut topLevelTransactedMethods(): transactedMethods() &&
!cflowbelow(transactedMethods());
Object around(IDataAccessObject dao) throws SQLException :
topLevelTransactedMethods() && target(dao){
Object operationResult = null;
try{
dao._connection = ConnectionLocator.getConnection();
operationResult = proceed(dao);
if (dao._connection!=null){
dao._connection.commit();
}
}catch(SQLException e){
if (dao._connection!=null){
dao._connection.rollback();
}
throw e;
}finally{
if (dao._connection!=null){
dao._connection.close();
}
}
return operationResult;
}
} // Fim do Aspecto
Prática 03
§  Solução: uso de aspecto
38
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
Prática 03
public aspect PersistenceAspect percflow(topLevelTransactedMethods()) {
public Connection com.terra.dao.IDataAccessObject._connection;
pointcut transactedMethods() : execution(* com.terra.dao.IDataAccessObject+.*(..));
pointcut topLevelTransactedMethods(): transactedMethods() &&
!cflowbelow(transactedMethods());
Object around(IDataAccessObject dao) throws SQLException :
topLevelTransactedMethods() && target(dao){
Object operationResult = null;
try{
dao._connection = ConnectionLocator.getConnection();
operationResult = proceed(dao);
if (dao._connection!=null){
dao._connection.commit();
}
}catch(SQLException e){
if (dao._connection!=null){
dao._connection.rollback();
}
throw e;
}finally{
if (dao._connection!=null){
dao._connection.close();
}
}
return operationResult;
}
} // Fim do Aspecto
39
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
public class UsuarioDAO implements IDataAccessObject{
public void add(Usuario usuario) throws SQLException{
PreparedStatement st =
_connection.prepareStatement("insert into USUARIO values (?,?,?)");
st.setString(1, usuario.getLogin());
st.setString(2, usuario.getSenha());
st.setString(3, usuario.getNome());
st.execute();
st.close();
}
}//Fim da Classe
Prática 03
§  Assim, o desenvolvedor não precisa dar atenção ao controle
transacional nos métodos de persistência
40
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
Considerações finais
§  Desenvolver uma solução utilizando aspecto é um pouco
trabalhoso, mas é realizada apenas uma única vez
§  AOP é poderoso, entretanto pode ser perigoso
§  AOP quebra o raciocínio modular
§  Nada impede, mas o AOP não deve ser usado para qualquer
interesse, mas apenas, para os interesses transversais
§  Melhora o nível de modularização do sistema, com baixo
acoplamento e alta coesão
§  O processo de weaver demora
§  A sintaxe do AspectJ não é trivial
§  Desenvolver utilizando AOP é “massa”!
41
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
Dúvidas?
???
42
Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos
Ricardo Terra
rterrabh [at] gmail.com
Apresentação e vídeo disponíveis em:
www.ricardoterra.com.br/palestras
Principais referências bibliográficas:
KICZALES, Gregor et al. Aspect-Oriented Programming. ECOOP, 1997.
TIRELO, Fábio et al. Desenvolvimento de Software Orientado por
Aspectos. XXIII JAI, 2004.
VALENTE, M. T. Programação Orientada por Aspectos. Programa de
Pós-graduação em Informática PUC Minas, 2006.
Obrigado!
43

Mais conteúdo relacionado

Mais procurados

Sistemas Distribuidos Java
Sistemas Distribuidos JavaSistemas Distribuidos Java
Sistemas Distribuidos Java
limadavi
 
A aplicação de boas práticas de governança de ti no gerenciamento de ativos d...
A aplicação de boas práticas de governança de ti no gerenciamento de ativos d...A aplicação de boas práticas de governança de ti no gerenciamento de ativos d...
A aplicação de boas práticas de governança de ti no gerenciamento de ativos d...
Marcelo Ariatti
 
Nodejs - A performance que eu sempre quis ter
Nodejs - A performance que eu sempre quis terNodejs - A performance que eu sempre quis ter
Nodejs - A performance que eu sempre quis ter
Emerson Macedo
 
Sistemas Distribuídos - Computação Distribuída e Paralela
Sistemas Distribuídos - Computação Distribuída e ParalelaSistemas Distribuídos - Computação Distribuída e Paralela
Sistemas Distribuídos - Computação Distribuída e ParalelaAdriano Teixeira de Souza
 
Topologia modelo arvore
Topologia modelo arvoreTopologia modelo arvore
Topologia modelo arvore
Felipe Weizenmann
 
Protocolos de Rede para Internet das Coisas
Protocolos de Rede para Internet das CoisasProtocolos de Rede para Internet das Coisas
Protocolos de Rede para Internet das Coisas
Nathalia Sautchuk Patricio
 
Aula UML - Unified Modeling Language
Aula UML - Unified Modeling LanguageAula UML - Unified Modeling Language
Aula UML - Unified Modeling Language
Cloves da Rocha
 
Sistemas Distribuídos - Comunicação Distribuída - Socket
Sistemas Distribuídos - Comunicação Distribuída - SocketSistemas Distribuídos - Comunicação Distribuída - Socket
Sistemas Distribuídos - Comunicação Distribuída - SocketAdriano Teixeira de Souza
 
Linux Servidor Proxy(squid)
Linux Servidor Proxy(squid)Linux Servidor Proxy(squid)
Linux Servidor Proxy(squid)elliando dias
 
Redes de computadores
Redes de computadoresRedes de computadores
Redes de computadores
Jakson Silva
 
TDD - Test Driven Development
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven Development
Engenharia de Software Ágil
 
Aula Xml Schema - XSD
Aula Xml Schema - XSDAula Xml Schema - XSD
Aula Xml Schema - XSD
Rudson Kiyoshi Souza Carvalho
 
Integração Contínua
Integração ContínuaIntegração Contínua
Integração Contínua
Jackson Veroneze
 
Aula05 padrões sem fio
Aula05   padrões sem fioAula05   padrões sem fio
Aula05 padrões sem fio
Carlos Veiga
 
Exemplo de Plano de testes
Exemplo de Plano de testes Exemplo de Plano de testes
Exemplo de Plano de testes
Leandro Rodrigues
 
Aula 06 - Diagrama de classes
Aula 06 - Diagrama de classesAula 06 - Diagrama de classes
Aula 06 - Diagrama de classes
Leinylson Fontinele
 
Modelo de Referência OSI
Modelo de Referência OSIModelo de Referência OSI
Modelo de Referência OSI
Alberto Felipe Friderichs Barros
 
Modelo TCP/IP
Modelo TCP/IPModelo TCP/IP

Mais procurados (20)

Sistemas Distribuidos Java
Sistemas Distribuidos JavaSistemas Distribuidos Java
Sistemas Distribuidos Java
 
A aplicação de boas práticas de governança de ti no gerenciamento de ativos d...
A aplicação de boas práticas de governança de ti no gerenciamento de ativos d...A aplicação de boas práticas de governança de ti no gerenciamento de ativos d...
A aplicação de boas práticas de governança de ti no gerenciamento de ativos d...
 
Nodejs - A performance que eu sempre quis ter
Nodejs - A performance que eu sempre quis terNodejs - A performance que eu sempre quis ter
Nodejs - A performance que eu sempre quis ter
 
Sistemas Distribuídos - Computação Distribuída e Paralela
Sistemas Distribuídos - Computação Distribuída e ParalelaSistemas Distribuídos - Computação Distribuída e Paralela
Sistemas Distribuídos - Computação Distribuída e Paralela
 
Topologia modelo arvore
Topologia modelo arvoreTopologia modelo arvore
Topologia modelo arvore
 
Protocolos de Rede para Internet das Coisas
Protocolos de Rede para Internet das CoisasProtocolos de Rede para Internet das Coisas
Protocolos de Rede para Internet das Coisas
 
Aula UML - Unified Modeling Language
Aula UML - Unified Modeling LanguageAula UML - Unified Modeling Language
Aula UML - Unified Modeling Language
 
Javascript aula 01 - visão geral
Javascript   aula 01 - visão geralJavascript   aula 01 - visão geral
Javascript aula 01 - visão geral
 
Sistemas Distribuídos - Comunicação Distribuída - Socket
Sistemas Distribuídos - Comunicação Distribuída - SocketSistemas Distribuídos - Comunicação Distribuída - Socket
Sistemas Distribuídos - Comunicação Distribuída - Socket
 
Linux Servidor Proxy(squid)
Linux Servidor Proxy(squid)Linux Servidor Proxy(squid)
Linux Servidor Proxy(squid)
 
Redes de computadores
Redes de computadoresRedes de computadores
Redes de computadores
 
TDD - Test Driven Development
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven Development
 
Aula Xml Schema - XSD
Aula Xml Schema - XSDAula Xml Schema - XSD
Aula Xml Schema - XSD
 
Integração Contínua
Integração ContínuaIntegração Contínua
Integração Contínua
 
Aula05 padrões sem fio
Aula05   padrões sem fioAula05   padrões sem fio
Aula05 padrões sem fio
 
RangosIP
RangosIPRangosIP
RangosIP
 
Exemplo de Plano de testes
Exemplo de Plano de testes Exemplo de Plano de testes
Exemplo de Plano de testes
 
Aula 06 - Diagrama de classes
Aula 06 - Diagrama de classesAula 06 - Diagrama de classes
Aula 06 - Diagrama de classes
 
Modelo de Referência OSI
Modelo de Referência OSIModelo de Referência OSI
Modelo de Referência OSI
 
Modelo TCP/IP
Modelo TCP/IPModelo TCP/IP
Modelo TCP/IP
 

Destaque

Gerência de Projetos de Software - Aula 2
Gerência de Projetos de Software - Aula 2Gerência de Projetos de Software - Aula 2
Gerência de Projetos de Software - Aula 2
Adson Cunha, MSc, PMP®
 
Programação orientada a aspectos
Programação orientada a aspectosProgramação orientada a aspectos
Programação orientada a aspectos
Ruben Blenicio Tavares Silva
 
Gerência de Projetos de Software - Aula 3
Gerência de Projetos de Software - Aula 3Gerência de Projetos de Software - Aula 3
Gerência de Projetos de Software - Aula 3
Adson Cunha, MSc, PMP®
 
Apostila de poo em c++
Apostila de poo em c++Apostila de poo em c++
Apostila de poo em c++Lindomar ...
 
Apresentação da UML
Apresentação da UMLApresentação da UML
Apresentação da UML
Eliseu Castelo
 
Gerência de Projetos de Software - Aula 3 [SCRUM]
Gerência de Projetos de Software - Aula 3 [SCRUM]Gerência de Projetos de Software - Aula 3 [SCRUM]
Gerência de Projetos de Software - Aula 3 [SCRUM]
Adson Cunha, MSc, PMP®
 
Analise e Desenho Orientado a Objetos com UML
Analise e Desenho Orientado a Objetos com UMLAnalise e Desenho Orientado a Objetos com UML
Analise e Desenho Orientado a Objetos com UML
Rildo (@rildosan) Santos
 
Análise e Modelagem com UML
Análise e Modelagem com UMLAnálise e Modelagem com UML
Análise e Modelagem com UML
Álvaro Farias Pinheiro
 
Apostila UML
Apostila UMLApostila UML
Apostila UML
Ricardo Terra
 
Gerência de Projetos de Software - Aula1
Gerência de Projetos de Software - Aula1Gerência de Projetos de Software - Aula1
Gerência de Projetos de Software - Aula1
Adson Cunha, MSc, PMP®
 
UML
UMLUML
Exercicio de UML - Documentacao Restaurante
Exercicio de UML  - Documentacao RestauranteExercicio de UML  - Documentacao Restaurante
Exercicio de UML - Documentacao Restaurante
Juliana Cindra
 
Principais diagramas da UML
Principais diagramas da UMLPrincipais diagramas da UML
Principais diagramas da UML
Jéssica Nathany Carvalho Freitas
 
UML
UMLUML
Exercitando modelagem em UML
Exercitando modelagem em UMLExercitando modelagem em UML
Exercitando modelagem em UML
info_cimol
 
UML - Criando Diagramas Eficientes
UML - Criando Diagramas EficientesUML - Criando Diagramas Eficientes
UML - Criando Diagramas Eficientes
Rodrigo Cascarrolho
 
Apostila UML
Apostila UML Apostila UML
Apostila UML
Fernando Palma
 
Programação orientada a objetos
Programação orientada a objetosProgramação orientada a objetos
Programação orientada a objetos
Cleyton Ferrari
 
Uml - Exemplos de Modelagem em UML
Uml - Exemplos de Modelagem em UMLUml - Exemplos de Modelagem em UML
Uml - Exemplos de Modelagem em UML
André Constantino da Silva
 

Destaque (20)

Gerência de Projetos de Software - Aula 2
Gerência de Projetos de Software - Aula 2Gerência de Projetos de Software - Aula 2
Gerência de Projetos de Software - Aula 2
 
Programação orientada a aspectos
Programação orientada a aspectosProgramação orientada a aspectos
Programação orientada a aspectos
 
Gerência de Projetos de Software - Aula 3
Gerência de Projetos de Software - Aula 3Gerência de Projetos de Software - Aula 3
Gerência de Projetos de Software - Aula 3
 
Apostila de poo em c++
Apostila de poo em c++Apostila de poo em c++
Apostila de poo em c++
 
Apresentação da UML
Apresentação da UMLApresentação da UML
Apresentação da UML
 
Gerência de Projetos de Software - Aula 3 [SCRUM]
Gerência de Projetos de Software - Aula 3 [SCRUM]Gerência de Projetos de Software - Aula 3 [SCRUM]
Gerência de Projetos de Software - Aula 3 [SCRUM]
 
Analise e Desenho Orientado a Objetos com UML
Analise e Desenho Orientado a Objetos com UMLAnalise e Desenho Orientado a Objetos com UML
Analise e Desenho Orientado a Objetos com UML
 
Análise e Modelagem com UML
Análise e Modelagem com UMLAnálise e Modelagem com UML
Análise e Modelagem com UML
 
Apostila UML
Apostila UMLApostila UML
Apostila UML
 
Gerência de Projetos de Software - Aula1
Gerência de Projetos de Software - Aula1Gerência de Projetos de Software - Aula1
Gerência de Projetos de Software - Aula1
 
UML
UMLUML
UML
 
Exercicio de UML - Documentacao Restaurante
Exercicio de UML  - Documentacao RestauranteExercicio de UML  - Documentacao Restaurante
Exercicio de UML - Documentacao Restaurante
 
Principais diagramas da UML
Principais diagramas da UMLPrincipais diagramas da UML
Principais diagramas da UML
 
UML
UMLUML
UML
 
Paradigmas de programação
Paradigmas de programaçãoParadigmas de programação
Paradigmas de programação
 
Exercitando modelagem em UML
Exercitando modelagem em UMLExercitando modelagem em UML
Exercitando modelagem em UML
 
UML - Criando Diagramas Eficientes
UML - Criando Diagramas EficientesUML - Criando Diagramas Eficientes
UML - Criando Diagramas Eficientes
 
Apostila UML
Apostila UML Apostila UML
Apostila UML
 
Programação orientada a objetos
Programação orientada a objetosProgramação orientada a objetos
Programação orientada a objetos
 
Uml - Exemplos de Modelagem em UML
Uml - Exemplos de Modelagem em UMLUml - Exemplos de Modelagem em UML
Uml - Exemplos de Modelagem em UML
 

Semelhante a Programação Orientada a Aspectos

Escalando apps com React e Type Script e SOLID
Escalando apps com React e Type Script e SOLIDEscalando apps com React e Type Script e SOLID
Escalando apps com React e Type Script e SOLID
Ruben Marcus Luz Paschoarelli
 
TDC SP 2016 - Construindo um microserviço Java 100% funcional em 30 minutos
TDC SP 2016 - Construindo um microserviço Java 100% funcional em 30 minutosTDC SP 2016 - Construindo um microserviço Java 100% funcional em 30 minutos
TDC SP 2016 - Construindo um microserviço Java 100% funcional em 30 minutos
Rafael Chaves
 
Drupal e a Qualidade de Software
Drupal e a Qualidade de SoftwareDrupal e a Qualidade de Software
Drupal e a Qualidade de Software
Daniel Carvalhinho
 
Treinamento ASP.NET 2014
Treinamento ASP.NET 2014Treinamento ASP.NET 2014
Treinamento ASP.NET 2014
Eric Gallardo
 
Arquitetura web para sistemas de negócio
Arquitetura web para sistemas de negócioArquitetura web para sistemas de negócio
Arquitetura web para sistemas de negócio
Ralph Rassweiler
 
COMPARANDO FRAMEWORKS DE ARQUITETURA CORPORATIVA PARA APLICAÇÃO EM E-COMMERCE
COMPARANDO FRAMEWORKS DE ARQUITETURA CORPORATIVA PARA APLICAÇÃO EM E-COMMERCECOMPARANDO FRAMEWORKS DE ARQUITETURA CORPORATIVA PARA APLICAÇÃO EM E-COMMERCE
COMPARANDO FRAMEWORKS DE ARQUITETURA CORPORATIVA PARA APLICAÇÃO EM E-COMMERCE
Fernando S. de Paulo
 
ODI SERIES - Melhores Práticas
ODI SERIES - Melhores PráticasODI SERIES - Melhores Práticas
ODI SERIES - Melhores Práticas
Caio Lima
 
SQLAlchemy - Desenvolvendo uma aplicação com Python
SQLAlchemy - Desenvolvendo uma aplicação com Python SQLAlchemy - Desenvolvendo uma aplicação com Python
SQLAlchemy - Desenvolvendo uma aplicação com Python
Filipe Fernandes dos Santos Brasil de Matos
 
Programação Oritentada a Aspecto
Programação Oritentada a AspectoProgramação Oritentada a Aspecto
Programação Oritentada a Aspecto
Benicio Ávila
 
Pipeconf no CoffeOps Campinas
Pipeconf no CoffeOps CampinasPipeconf no CoffeOps Campinas
Pipeconf no CoffeOps Campinas
Aécio Pires
 
RubyConf 17 - Colocando sua aplicação vue nos trilhos
RubyConf 17 - Colocando sua aplicação vue nos trilhosRubyConf 17 - Colocando sua aplicação vue nos trilhos
RubyConf 17 - Colocando sua aplicação vue nos trilhos
Felipe Gadelha Ruoso
 
Vraptor 3
Vraptor 3Vraptor 3
Vraptor 3
Cristiano Agosti
 
Tendências e Dicas para o Desenvolvimento de Software
Tendências e Dicas para o Desenvolvimento de SoftwareTendências e Dicas para o Desenvolvimento de Software
Tendências e Dicas para o Desenvolvimento de Software
Norberto Santos
 
Criando Framework - Conceitos, Estratégias e Dicas
Criando Framework - Conceitos, Estratégias e DicasCriando Framework - Conceitos, Estratégias e Dicas
Criando Framework - Conceitos, Estratégias e Dicas
Norton Guimarães
 
TDC Floripa 2015 Desenvolvendo Sistemas de Gestão a partir de Modelos Execut...
TDC Floripa 2015  Desenvolvendo Sistemas de Gestão a partir de Modelos Execut...TDC Floripa 2015  Desenvolvendo Sistemas de Gestão a partir de Modelos Execut...
TDC Floripa 2015 Desenvolvendo Sistemas de Gestão a partir de Modelos Execut...
Rafael Chaves
 
TDC2018SP | Trilha PHP Essencial - O que nao fazer ao atualizar para o PHP 7
TDC2018SP | Trilha PHP Essencial - O que nao fazer ao atualizar para o PHP 7TDC2018SP | Trilha PHP Essencial - O que nao fazer ao atualizar para o PHP 7
TDC2018SP | Trilha PHP Essencial - O que nao fazer ao atualizar para o PHP 7
tdc-globalcode
 

Semelhante a Programação Orientada a Aspectos (20)

Escalando apps com React e Type Script e SOLID
Escalando apps com React e Type Script e SOLIDEscalando apps com React e Type Script e SOLID
Escalando apps com React e Type Script e SOLID
 
RAD
RADRAD
RAD
 
Django
DjangoDjango
Django
 
TDC SP 2016 - Construindo um microserviço Java 100% funcional em 30 minutos
TDC SP 2016 - Construindo um microserviço Java 100% funcional em 30 minutosTDC SP 2016 - Construindo um microserviço Java 100% funcional em 30 minutos
TDC SP 2016 - Construindo um microserviço Java 100% funcional em 30 minutos
 
Drupal e a Qualidade de Software
Drupal e a Qualidade de SoftwareDrupal e a Qualidade de Software
Drupal e a Qualidade de Software
 
Treinamento ASP.NET 2014
Treinamento ASP.NET 2014Treinamento ASP.NET 2014
Treinamento ASP.NET 2014
 
Arquitetura web para sistemas de negócio
Arquitetura web para sistemas de negócioArquitetura web para sistemas de negócio
Arquitetura web para sistemas de negócio
 
COMPARANDO FRAMEWORKS DE ARQUITETURA CORPORATIVA PARA APLICAÇÃO EM E-COMMERCE
COMPARANDO FRAMEWORKS DE ARQUITETURA CORPORATIVA PARA APLICAÇÃO EM E-COMMERCECOMPARANDO FRAMEWORKS DE ARQUITETURA CORPORATIVA PARA APLICAÇÃO EM E-COMMERCE
COMPARANDO FRAMEWORKS DE ARQUITETURA CORPORATIVA PARA APLICAÇÃO EM E-COMMERCE
 
ODI SERIES - Melhores Práticas
ODI SERIES - Melhores PráticasODI SERIES - Melhores Práticas
ODI SERIES - Melhores Práticas
 
SQLAlchemy - Desenvolvendo uma aplicação com Python
SQLAlchemy - Desenvolvendo uma aplicação com Python SQLAlchemy - Desenvolvendo uma aplicação com Python
SQLAlchemy - Desenvolvendo uma aplicação com Python
 
Programação Oritentada a Aspecto
Programação Oritentada a AspectoProgramação Oritentada a Aspecto
Programação Oritentada a Aspecto
 
Pipeconf no CoffeOps Campinas
Pipeconf no CoffeOps CampinasPipeconf no CoffeOps Campinas
Pipeconf no CoffeOps Campinas
 
RubyConf 17 - Colocando sua aplicação vue nos trilhos
RubyConf 17 - Colocando sua aplicação vue nos trilhosRubyConf 17 - Colocando sua aplicação vue nos trilhos
RubyConf 17 - Colocando sua aplicação vue nos trilhos
 
Projeto de Software
Projeto de SoftwareProjeto de Software
Projeto de Software
 
Vraptor 3
Vraptor 3Vraptor 3
Vraptor 3
 
Arquitetura de-software
Arquitetura de-softwareArquitetura de-software
Arquitetura de-software
 
Tendências e Dicas para o Desenvolvimento de Software
Tendências e Dicas para o Desenvolvimento de SoftwareTendências e Dicas para o Desenvolvimento de Software
Tendências e Dicas para o Desenvolvimento de Software
 
Criando Framework - Conceitos, Estratégias e Dicas
Criando Framework - Conceitos, Estratégias e DicasCriando Framework - Conceitos, Estratégias e Dicas
Criando Framework - Conceitos, Estratégias e Dicas
 
TDC Floripa 2015 Desenvolvendo Sistemas de Gestão a partir de Modelos Execut...
TDC Floripa 2015  Desenvolvendo Sistemas de Gestão a partir de Modelos Execut...TDC Floripa 2015  Desenvolvendo Sistemas de Gestão a partir de Modelos Execut...
TDC Floripa 2015 Desenvolvendo Sistemas de Gestão a partir de Modelos Execut...
 
TDC2018SP | Trilha PHP Essencial - O que nao fazer ao atualizar para o PHP 7
TDC2018SP | Trilha PHP Essencial - O que nao fazer ao atualizar para o PHP 7TDC2018SP | Trilha PHP Essencial - O que nao fazer ao atualizar para o PHP 7
TDC2018SP | Trilha PHP Essencial - O que nao fazer ao atualizar para o PHP 7
 

Mais de Ricardo Terra

Microsserviços com Spring Boot e ORM
Microsserviços com Spring Boot e ORMMicrosserviços com Spring Boot e ORM
Microsserviços com Spring Boot e ORM
Ricardo Terra
 
Apostila Linguagens Formais e Autômatos (LFA)
Apostila Linguagens Formais e Autômatos (LFA)Apostila Linguagens Formais e Autômatos (LFA)
Apostila Linguagens Formais e Autômatos (LFA)
Ricardo Terra
 
Análise Estática de Código: Aplicações
Análise Estática de Código: AplicaçõesAnálise Estática de Código: Aplicações
Análise Estática de Código: Aplicações
Ricardo Terra
 
Engenharia de Software: POC
Engenharia de Software: POCEngenharia de Software: POC
Engenharia de Software: POC
Ricardo Terra
 
Which Programming Language is the best one?
Which Programming Language is the best one?Which Programming Language is the best one?
Which Programming Language is the best one?
Ricardo Terra
 
Refactoring
RefactoringRefactoring
Refactoring
Ricardo Terra
 
Matemática Computacional
Matemática ComputacionalMatemática Computacional
Matemática Computacional
Ricardo Terra
 
English---and LaTeX---Writing Tips
English---and LaTeX---Writing TipsEnglish---and LaTeX---Writing Tips
English---and LaTeX---Writing Tips
Ricardo Terra
 
Casamento de Padrões
Casamento de PadrõesCasamento de Padrões
Casamento de Padrões
Ricardo Terra
 
Apostila Algoritmos e Estrutura de Dados (AEDS)
Apostila Algoritmos e Estrutura de Dados (AEDS)Apostila Algoritmos e Estrutura de Dados (AEDS)
Apostila Algoritmos e Estrutura de Dados (AEDS)
Ricardo Terra
 
Segurança da Internet
Segurança da InternetSegurança da Internet
Segurança da Internet
Ricardo Terra
 
Java Net: Interagindo com a Internet
Java Net: Interagindo com a InternetJava Net: Interagindo com a Internet
Java Net: Interagindo com a Internet
Ricardo Terra
 
Software Architecture
Software ArchitectureSoftware Architecture
Software Architecture
Ricardo Terra
 
Aula Zero
Aula ZeroAula Zero
Aula Zero
Ricardo Terra
 
Apostila Tecnologia da Informação (TI)
Apostila Tecnologia da Informação (TI)Apostila Tecnologia da Informação (TI)
Apostila Tecnologia da Informação (TI)
Ricardo Terra
 
Apostila Lógica de Programação
Apostila Lógica de ProgramaçãoApostila Lógica de Programação
Apostila Lógica de Programação
Ricardo Terra
 
Apostila XML, DTD, XSD e XSLT
Apostila XML, DTD, XSD e XSLTApostila XML, DTD, XSD e XSLT
Apostila XML, DTD, XSD e XSLT
Ricardo Terra
 
Java JDBC: Aplicação Java que acessa um SGDB
Java JDBC: Aplicação Java que acessa um SGDBJava JDBC: Aplicação Java que acessa um SGDB
Java JDBC: Aplicação Java que acessa um SGDB
Ricardo Terra
 
Apostila Modelo ER (Entidade Relacionamento)
Apostila Modelo ER (Entidade Relacionamento)Apostila Modelo ER (Entidade Relacionamento)
Apostila Modelo ER (Entidade Relacionamento)
Ricardo Terra
 
Análise Estática de Código
Análise Estática de CódigoAnálise Estática de Código
Análise Estática de Código
Ricardo Terra
 

Mais de Ricardo Terra (20)

Microsserviços com Spring Boot e ORM
Microsserviços com Spring Boot e ORMMicrosserviços com Spring Boot e ORM
Microsserviços com Spring Boot e ORM
 
Apostila Linguagens Formais e Autômatos (LFA)
Apostila Linguagens Formais e Autômatos (LFA)Apostila Linguagens Formais e Autômatos (LFA)
Apostila Linguagens Formais e Autômatos (LFA)
 
Análise Estática de Código: Aplicações
Análise Estática de Código: AplicaçõesAnálise Estática de Código: Aplicações
Análise Estática de Código: Aplicações
 
Engenharia de Software: POC
Engenharia de Software: POCEngenharia de Software: POC
Engenharia de Software: POC
 
Which Programming Language is the best one?
Which Programming Language is the best one?Which Programming Language is the best one?
Which Programming Language is the best one?
 
Refactoring
RefactoringRefactoring
Refactoring
 
Matemática Computacional
Matemática ComputacionalMatemática Computacional
Matemática Computacional
 
English---and LaTeX---Writing Tips
English---and LaTeX---Writing TipsEnglish---and LaTeX---Writing Tips
English---and LaTeX---Writing Tips
 
Casamento de Padrões
Casamento de PadrõesCasamento de Padrões
Casamento de Padrões
 
Apostila Algoritmos e Estrutura de Dados (AEDS)
Apostila Algoritmos e Estrutura de Dados (AEDS)Apostila Algoritmos e Estrutura de Dados (AEDS)
Apostila Algoritmos e Estrutura de Dados (AEDS)
 
Segurança da Internet
Segurança da InternetSegurança da Internet
Segurança da Internet
 
Java Net: Interagindo com a Internet
Java Net: Interagindo com a InternetJava Net: Interagindo com a Internet
Java Net: Interagindo com a Internet
 
Software Architecture
Software ArchitectureSoftware Architecture
Software Architecture
 
Aula Zero
Aula ZeroAula Zero
Aula Zero
 
Apostila Tecnologia da Informação (TI)
Apostila Tecnologia da Informação (TI)Apostila Tecnologia da Informação (TI)
Apostila Tecnologia da Informação (TI)
 
Apostila Lógica de Programação
Apostila Lógica de ProgramaçãoApostila Lógica de Programação
Apostila Lógica de Programação
 
Apostila XML, DTD, XSD e XSLT
Apostila XML, DTD, XSD e XSLTApostila XML, DTD, XSD e XSLT
Apostila XML, DTD, XSD e XSLT
 
Java JDBC: Aplicação Java que acessa um SGDB
Java JDBC: Aplicação Java que acessa um SGDBJava JDBC: Aplicação Java que acessa um SGDB
Java JDBC: Aplicação Java que acessa um SGDB
 
Apostila Modelo ER (Entidade Relacionamento)
Apostila Modelo ER (Entidade Relacionamento)Apostila Modelo ER (Entidade Relacionamento)
Apostila Modelo ER (Entidade Relacionamento)
 
Análise Estática de Código
Análise Estática de CódigoAnálise Estática de Código
Análise Estática de Código
 

Último

LIÇÃO 9 - ORDENANÇAS PARA UMA VIDA DE SANTIFICAÇÃO.pptx
LIÇÃO 9 - ORDENANÇAS PARA UMA VIDA DE SANTIFICAÇÃO.pptxLIÇÃO 9 - ORDENANÇAS PARA UMA VIDA DE SANTIFICAÇÃO.pptx
LIÇÃO 9 - ORDENANÇAS PARA UMA VIDA DE SANTIFICAÇÃO.pptx
WelidaFreitas1
 
Caça-palavras ortografia M antes de P e B.
Caça-palavras    ortografia M antes de P e B.Caça-palavras    ortografia M antes de P e B.
Caça-palavras ortografia M antes de P e B.
Mary Alvarenga
 
Fato X Opinião (Língua Portuguesa 9º Ano).pptx
Fato X Opinião (Língua Portuguesa 9º Ano).pptxFato X Opinião (Língua Portuguesa 9º Ano).pptx
Fato X Opinião (Língua Portuguesa 9º Ano).pptx
MariaFatima425285
 
Unificação da Itália e a formação da Alemanha
Unificação da Itália e a formação da AlemanhaUnificação da Itália e a formação da Alemanha
Unificação da Itália e a formação da Alemanha
Acrópole - História & Educação
 
Sócrates e os sofistas - apresentação de slides
Sócrates e os sofistas - apresentação de slidesSócrates e os sofistas - apresentação de slides
Sócrates e os sofistas - apresentação de slides
jbellas2
 
UFCD_8298_Cozinha criativa_índice do manual
UFCD_8298_Cozinha criativa_índice do manualUFCD_8298_Cozinha criativa_índice do manual
UFCD_8298_Cozinha criativa_índice do manual
Manuais Formação
 
Slides Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24.pptx
Slides Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24.pptxSlides Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24.pptx
Slides Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24.pptx
LuizHenriquedeAlmeid6
 
Sinais de pontuação
Sinais de pontuaçãoSinais de pontuação
Sinais de pontuação
Mary Alvarenga
 
Aula01 - ensino médio - (Filosofia).pptx
Aula01 - ensino médio - (Filosofia).pptxAula01 - ensino médio - (Filosofia).pptx
Aula01 - ensino médio - (Filosofia).pptx
kdn15710
 
livro da EJA - 2a ETAPA - 4o e 5o ano. para análise do professorpdf
livro da EJA - 2a ETAPA - 4o e 5o ano. para análise do professorpdflivro da EJA - 2a ETAPA - 4o e 5o ano. para análise do professorpdf
livro da EJA - 2a ETAPA - 4o e 5o ano. para análise do professorpdf
Escola Municipal Jesus Cristo
 
PowerPoint Newton gostava de Ler - Saber em Gel.pdf
PowerPoint Newton gostava de Ler - Saber em Gel.pdfPowerPoint Newton gostava de Ler - Saber em Gel.pdf
PowerPoint Newton gostava de Ler - Saber em Gel.pdf
1000a
 
Slides Lição 9, Betel, Ordenança para uma vida de santificação, 2Tr24.pptx
Slides Lição 9, Betel, Ordenança para uma vida de santificação, 2Tr24.pptxSlides Lição 9, Betel, Ordenança para uma vida de santificação, 2Tr24.pptx
Slides Lição 9, Betel, Ordenança para uma vida de santificação, 2Tr24.pptx
LuizHenriquedeAlmeid6
 
PlanejamentoAnual_GEO_2024_EMPFG_FRCPA1MA_26-05-2024_09h47min.docx
PlanejamentoAnual_GEO_2024_EMPFG_FRCPA1MA_26-05-2024_09h47min.docxPlanejamentoAnual_GEO_2024_EMPFG_FRCPA1MA_26-05-2024_09h47min.docx
PlanejamentoAnual_GEO_2024_EMPFG_FRCPA1MA_26-05-2024_09h47min.docx
MatildesBraga1
 
BULLYING NÃO É AMOR.pdf LIVRO PARA TRABALHAR COM ALUNOS ATRAVÉS DE PROJETOS...
BULLYING NÃO É AMOR.pdf LIVRO PARA TRABALHAR COM ALUNOS ATRAVÉS DE PROJETOS...BULLYING NÃO É AMOR.pdf LIVRO PARA TRABALHAR COM ALUNOS ATRAVÉS DE PROJETOS...
BULLYING NÃO É AMOR.pdf LIVRO PARA TRABALHAR COM ALUNOS ATRAVÉS DE PROJETOS...
Escola Municipal Jesus Cristo
 
“A classe operária vai ao paraíso os modos de produzir e trabalhar ao longo ...
“A classe operária vai ao paraíso  os modos de produzir e trabalhar ao longo ...“A classe operária vai ao paraíso  os modos de produzir e trabalhar ao longo ...
“A classe operária vai ao paraíso os modos de produzir e trabalhar ao longo ...
AdrianoMontagna1
 
Apresentação_Primeira_Guerra_Mundial 9 ANO-1.pptx
Apresentação_Primeira_Guerra_Mundial 9 ANO-1.pptxApresentação_Primeira_Guerra_Mundial 9 ANO-1.pptx
Apresentação_Primeira_Guerra_Mundial 9 ANO-1.pptx
JulianeMelo17
 
05-os-pre-socraticos sociologia-28-slides.pptx
05-os-pre-socraticos sociologia-28-slides.pptx05-os-pre-socraticos sociologia-28-slides.pptx
05-os-pre-socraticos sociologia-28-slides.pptx
ValdineyRodriguesBez1
 
iNTRODUÇÃO À Plantas terrestres e Plantas aquáticas. (1).pdf
iNTRODUÇÃO À Plantas terrestres e Plantas aquáticas. (1).pdfiNTRODUÇÃO À Plantas terrestres e Plantas aquáticas. (1).pdf
iNTRODUÇÃO À Plantas terrestres e Plantas aquáticas. (1).pdf
andressacastro36
 
- TEMPLATE DA PRATICA - Psicomotricidade.pptx
- TEMPLATE DA PRATICA - Psicomotricidade.pptx- TEMPLATE DA PRATICA - Psicomotricidade.pptx
- TEMPLATE DA PRATICA - Psicomotricidade.pptx
LucianaCristina58
 
Slides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptx
Slides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptxSlides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptx
Slides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptx
LuizHenriquedeAlmeid6
 

Último (20)

LIÇÃO 9 - ORDENANÇAS PARA UMA VIDA DE SANTIFICAÇÃO.pptx
LIÇÃO 9 - ORDENANÇAS PARA UMA VIDA DE SANTIFICAÇÃO.pptxLIÇÃO 9 - ORDENANÇAS PARA UMA VIDA DE SANTIFICAÇÃO.pptx
LIÇÃO 9 - ORDENANÇAS PARA UMA VIDA DE SANTIFICAÇÃO.pptx
 
Caça-palavras ortografia M antes de P e B.
Caça-palavras    ortografia M antes de P e B.Caça-palavras    ortografia M antes de P e B.
Caça-palavras ortografia M antes de P e B.
 
Fato X Opinião (Língua Portuguesa 9º Ano).pptx
Fato X Opinião (Língua Portuguesa 9º Ano).pptxFato X Opinião (Língua Portuguesa 9º Ano).pptx
Fato X Opinião (Língua Portuguesa 9º Ano).pptx
 
Unificação da Itália e a formação da Alemanha
Unificação da Itália e a formação da AlemanhaUnificação da Itália e a formação da Alemanha
Unificação da Itália e a formação da Alemanha
 
Sócrates e os sofistas - apresentação de slides
Sócrates e os sofistas - apresentação de slidesSócrates e os sofistas - apresentação de slides
Sócrates e os sofistas - apresentação de slides
 
UFCD_8298_Cozinha criativa_índice do manual
UFCD_8298_Cozinha criativa_índice do manualUFCD_8298_Cozinha criativa_índice do manual
UFCD_8298_Cozinha criativa_índice do manual
 
Slides Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24.pptx
Slides Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24.pptxSlides Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24.pptx
Slides Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24.pptx
 
Sinais de pontuação
Sinais de pontuaçãoSinais de pontuação
Sinais de pontuação
 
Aula01 - ensino médio - (Filosofia).pptx
Aula01 - ensino médio - (Filosofia).pptxAula01 - ensino médio - (Filosofia).pptx
Aula01 - ensino médio - (Filosofia).pptx
 
livro da EJA - 2a ETAPA - 4o e 5o ano. para análise do professorpdf
livro da EJA - 2a ETAPA - 4o e 5o ano. para análise do professorpdflivro da EJA - 2a ETAPA - 4o e 5o ano. para análise do professorpdf
livro da EJA - 2a ETAPA - 4o e 5o ano. para análise do professorpdf
 
PowerPoint Newton gostava de Ler - Saber em Gel.pdf
PowerPoint Newton gostava de Ler - Saber em Gel.pdfPowerPoint Newton gostava de Ler - Saber em Gel.pdf
PowerPoint Newton gostava de Ler - Saber em Gel.pdf
 
Slides Lição 9, Betel, Ordenança para uma vida de santificação, 2Tr24.pptx
Slides Lição 9, Betel, Ordenança para uma vida de santificação, 2Tr24.pptxSlides Lição 9, Betel, Ordenança para uma vida de santificação, 2Tr24.pptx
Slides Lição 9, Betel, Ordenança para uma vida de santificação, 2Tr24.pptx
 
PlanejamentoAnual_GEO_2024_EMPFG_FRCPA1MA_26-05-2024_09h47min.docx
PlanejamentoAnual_GEO_2024_EMPFG_FRCPA1MA_26-05-2024_09h47min.docxPlanejamentoAnual_GEO_2024_EMPFG_FRCPA1MA_26-05-2024_09h47min.docx
PlanejamentoAnual_GEO_2024_EMPFG_FRCPA1MA_26-05-2024_09h47min.docx
 
BULLYING NÃO É AMOR.pdf LIVRO PARA TRABALHAR COM ALUNOS ATRAVÉS DE PROJETOS...
BULLYING NÃO É AMOR.pdf LIVRO PARA TRABALHAR COM ALUNOS ATRAVÉS DE PROJETOS...BULLYING NÃO É AMOR.pdf LIVRO PARA TRABALHAR COM ALUNOS ATRAVÉS DE PROJETOS...
BULLYING NÃO É AMOR.pdf LIVRO PARA TRABALHAR COM ALUNOS ATRAVÉS DE PROJETOS...
 
“A classe operária vai ao paraíso os modos de produzir e trabalhar ao longo ...
“A classe operária vai ao paraíso  os modos de produzir e trabalhar ao longo ...“A classe operária vai ao paraíso  os modos de produzir e trabalhar ao longo ...
“A classe operária vai ao paraíso os modos de produzir e trabalhar ao longo ...
 
Apresentação_Primeira_Guerra_Mundial 9 ANO-1.pptx
Apresentação_Primeira_Guerra_Mundial 9 ANO-1.pptxApresentação_Primeira_Guerra_Mundial 9 ANO-1.pptx
Apresentação_Primeira_Guerra_Mundial 9 ANO-1.pptx
 
05-os-pre-socraticos sociologia-28-slides.pptx
05-os-pre-socraticos sociologia-28-slides.pptx05-os-pre-socraticos sociologia-28-slides.pptx
05-os-pre-socraticos sociologia-28-slides.pptx
 
iNTRODUÇÃO À Plantas terrestres e Plantas aquáticas. (1).pdf
iNTRODUÇÃO À Plantas terrestres e Plantas aquáticas. (1).pdfiNTRODUÇÃO À Plantas terrestres e Plantas aquáticas. (1).pdf
iNTRODUÇÃO À Plantas terrestres e Plantas aquáticas. (1).pdf
 
- TEMPLATE DA PRATICA - Psicomotricidade.pptx
- TEMPLATE DA PRATICA - Psicomotricidade.pptx- TEMPLATE DA PRATICA - Psicomotricidade.pptx
- TEMPLATE DA PRATICA - Psicomotricidade.pptx
 
Slides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptx
Slides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptxSlides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptx
Slides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptx
 

Programação Orientada a Aspectos

  • 1. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013 Programação Orientada a Aspectos Ricardo Terra rterrabh [at] gmail.com Programação Orientada a Aspectos 1
  • 2. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013 CV Nome: Ricardo Terra Email: rterrabh [at] gmail.com www: ricardoterra.com.br Twitter: rterrabh Lattes: lattes.cnpq.br/ 0162081093970868 Ph.D. (UFMG/UWaterloo), Post-Ph.D. (INRIA/Université Lille 1) Background Acadêmico: UFLA (desde 2014), UFSJ (1 ano), FUMEC (3 anos), UNIPAC (1 ano), FAMINAS (3 anos) Profissional: DBA Eng. (1 ano), Synos (2 anos), Stefanini (1 ano) Programação Orientada a Aspectos 2
  • 3. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos Nomenclaturas §  Quaisquer das nomenclaturas abaixo é valida: §  AOP à Aspect-Oriented Programming §  POA à Programação Orientada a Aspectos (tradução) §  AOSD à Aspect-Oriented Software Development §  Já familiarizados com a variedade de termos para AOP, vamos simplesmente falar AOP 3
  • 4. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos Introdução §  Paradigmas de Programação: §  Programação Estruturada §  Programação Orientada a Objetos (OOP) §  Programação Orientada a Aspectos (AOP) §  Boas perguntas a serem realizadas: §  A OOP substitui a programação estruturada? §  Então a AOP veio para substituir a OOP? 4
  • 5. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos OOP vs AOP? §  OOP §  Paradigma dominante de programação §  Unidade básica de modularização: classes §  Desenvolvimento orientado a objetos: §  Decomposição dos sistemas em classes §  Classes implementam interesses (concerns) do sistema 5
  • 6. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos OOP vs AOP? ECOOP - European Conference on Object-Oriented Programming §  Na ECOOP 1997, Gregor Kiczaler, propôs a AOP no artigo Aspect-Oriented Programming §  "We have found many programming problems for which neither procedural nor object-oriented programming techniques are sufficient to clearly capture some of the important design decisions the program must implement. This forces the implementation of those design decisions to be scattered throughout the code, resulting in tangled code that is excessively difficult to develop and maintain." §  Principal objetivo da AOP: §  Separation of Concerns (separação de interesses, requisitos, funcionalidades…) 6
  • 7. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos OOP vs AOP? §  “O paradigma de orientação a objetos tem se consolidado como o principal paradigma para o desenvolvimento de sistemas de software. Entretanto, as abstrações e os mecanismos de composição desse paradigma possuem limitações para separar e compor alguns interesses relevantes em um sistema de software.” §  “Assim, muitas propriedades importantes espalham-se por vários módulos e misturam-se com outras propriedades de um sistema de maneira intrusiva, dificultando a reutilização e manutenção de seus componentes.” §  “A POA propõe um novo tipo de abstração – denominado aspecto – e novos mecanismos de composição que permitem a descrição modular e a composição de interesses que geralmente se encontram espalhados e misturados (crosscutting concerns) em vários pontos de um sistema de software tradicional.” 7
  • 8. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos OOP e AOP! §  Respondendo a pergunta: §  AOP não veio para substituir OOP §  AOP trabalha em conjunto com a OOP §  Uma linguagem orientada por aspectos permite confinar interesses transversais (crosscutting concerns) em módulos §  Em AOP, tais módulos são chamados de aspectos §  Boa pergunta a ser realizada: §  O que são interesses transversais (crosscutting concerns)? 8
  • 9. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos Interesses transversais §  São requisitos que não são facilmente implementados em uma ou em poucas classes do sistema §  Pode-se dizer que estes requisitos "pertencem" a todo o sistema §  Exemplos: §  Logging §  Autenticação §  Controle de acesso §  Controle de transações §  Persistência §  Não é comum, mas requisitos funcionais também podem apresentar um comportamento transversal 9
  • 10. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos Interesses transversais §  Principais problemas com requisitos transversais: §  Código espalhado (code spreading/scattered) §  Interesse transversal espalhado em diversas classes §  Código entrelaçado (code tangling) §  Interesse transversal entrelaçado com código de negócio 10
  • 11. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos Código do Apache Tomcat §  Para explicar na prática o que vem a ser um requisito transversal ou não-transversal, vamos fazer análise sobre o código fonte do Apache Tomcat 11
  • 12. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos Código do Apache Tomcat §  Requisito não-transversal §  Parsing de documento HTML 12
  • 13. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos §  Requisito transversal (exemplo tradicional) §  Logging Código do Apache Tomcat Código espalhado (scattered) e entrelaçado (tangled) 13
  • 14. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos OOP vs AOP? ⇒ Implementação OOP de logging Implementação AOP de logging §  Boa pergunta a ser realizada: §  Qual das implementações acima está mais fácil de ser desenvolvida e de ser mantida? 14
  • 15. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos §  Identificar e caracterizar os requisitos §  Implementar requisitos não-transversais utilizando CLASSES §  Implementar requisitos transversais utilizando ASPECTOS §  Aspecto é uma unidade de modularização §  Aspectos são desenvolvidos de forma isolada §  Os módulos influenciados não necessitam de modificações §  São combinados com os outros módulos usando mecanismos declarativos ou programáticos §  Boa pergunta a ser realizada: §  Vamos supor que eu implemente alguns aspectos. Como é feita a sua combinação com os outros módulos de minha aplicação? Utilizando AOP 15
  • 16. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos Interseção §  Processo de interseção, conhecido como WEAVING §  Ele é o responsável por “injetar” os aspectos, ou melhor, é a ferramenta que combina código OO e código OA para a geração do sistema final §  É um processo relativamente lento 16
  • 17. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos Conceitos básicos §  Joinpoints (pontos de junção) §  São pontos da execução do programa: §  chamadas e execuções de métodos ou construtores §  retorno de métodos ou construtores §  lançamento ou tratamento de exceções §  alteração de campos de classe §  Pointcuts (coleção de pontos de junção) §  Exemplos: §  Todas as execuções de métodos públicos §  Toda criação de objetos da classe Point §  Toda chamada do método Point.setX ou Point.setY §  Toda alteração do campo x da classe Point 17
  • 18. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos Conceitos básicos §  Advices §  Código que deve executar no momento de qualquer joinpoint de um pointcut §  Exemplos: §  chamar um método de log antes de toda chamada a método público do programa §  abrir conexão antes de executar métodos de persistência §  fechar conexão depois de executar métodos de persistência §  chamar um método de atualização depois que qualquer atributo de uma figura geométrica for alterado §  executar um outro método ao invés de executar o método §  Aspectos §  Coleção de pointcuts e advices 18
  • 19. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos Prática §  Linguagens que permitem implementação AOP: §  Java §  AspectJ (a que será abordada) §  HyperJ §  Spring AOP §  C e C++ §  AspectC e AspectC++, respectivamente §  Aplicações de destaque que utiliza AOP: §  FreeBSD (reestruturação do kernel) §  JBoss AOP §  Implementação de sistemas distribuídos 19
  • 20. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos Prática §  AspectJ §  Extensão orientada a aspectos para Java §  Declarações de aspectos são similares a declarações de classes (como veremos nos exemplos a frente) §  Em um aspecto podem ser declarados: §  Pointcuts (conjuntos de junção) §  Advices 20
  • 21. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos Prática §  Com a teoria já absorvida podemos ir um pouco além e mostrar alguns exemplos §  Os exemplos a seguir foram feitos utilizando: §  Eclipse (Kepler) §  http://www.eclipse.org §  AJDT: AspectJ Development Tools 2.2.3 §  http://www.eclipse.org/ajdt 21
  • 22. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos §  Observe as classes abaixo: §  Boa pergunta a ser realizada: §  O que há de errado com o código acima? public class Point { private int x, y; public int getX() {..} public void setX(int x) {..} public int getY() {..} public void setY(int y) {..} public void draw(Graphics g){..} public void refresh(){ this.draw(Canvas.getGraphics(this)); } } public class Line { private Point p1, p2; public Point getP1() {..} public void setP1(Point p1) {..} public Point getP2() {..} public void setP2(Point p2) {..} public void draw(Graphics g){..} public void refresh(){ this.draw(Canvas.getGraphics(this)); } } Prática 01 22
  • 23. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos §  Métodos comuns public class Point { private int x, y; public int getX() {..} public void setX(int x) {..} public int getY() {..} public void setY(int y) {..} public void draw(Graphics g){..} public void refresh(){ this.draw(Canvas.getGraphics(this)); } } public class Line { private Point p1, p2; public Point getP1() {..} public void setP1(Point p1) {..} public Point getP2() {..} public void setP2(Point p2) {..} public void draw(Graphics g){..} public void refresh(){ this.draw(Canvas.getGraphics(this)); } } Prática 01 23
  • 24. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos public class Point extends Figure { private int x,y; public int getX() {..} public void setX(int x) {..} public int getY() {..} public void setY(int y) {..} public void draw(Graphics g){..} } public class Line extends Figure { private Point p1,p2; public Point getP1() {..} public void setP1(Point p1) {..} public Point getP2() {..} public void setP2(Point p2) {..} public void draw(Graphics g){..} } public abstract class Figure { public abstract void draw(Graphics g); public void refresh(){ this.draw(Canvas.getGraphics(this)); } } Prática 01 §  Solução: uso de herança como mecanismo de reuso 24
  • 25. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos §  Observe as classes abaixo: §  Boa pergunta a ser realizada: §  O que há de errado com o código acima? public class Point extends Figure { ... public void setX(int x) { this.x = x; this.refresh(); } public void setY(int y) { this.y = y; this.refresh(); } ... } public class Line extends Figure { ... public void setP1(Point p1) { this.p1=p1; this.refresh(); } public void setP2(Point p2) { this.p2=p2; this.refresh(); } ... } Prática 01 25
  • 26. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos §  Chamada a um mesmo método no final de todos setters public class Point extends Figure { ... public void setX(int x) { this.x = x; this.refresh(); } public void setY(int y) { this.y = y; this.refresh(); } ... } public class Line extends Figure { ... public void setP1(Point p1) { this.p1=p1; this.refresh(); } public void setP2(Point p2) { this.p2=p2; this.refresh(); } ... } Prática 01 26
  • 27. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos public aspect RefreshingAspect { pointcut setterMethods(): execution(public void Figure+.set*(..)); after(Figure f): setterMethods() && this(f) { f.refresh(); } } public class Point extends Figure { ... public void setX(int x) { this.x = x; } public void setY(int y) { this.y = y; } ... } public class Line extends Figure { ... public void setP1(Point p1) { this.p1=p1; } public void setP2(Point p2) { this.p2=p2; } ... } Prática 01 §  Solução: uso de aspecto 27
  • 28. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos §  Observe a classe abaixo: §  Boa pergunta a ser realizada: §  O que há de errado com o código acima? public class Concerns { public void doSomething(int value){ Logger.logEntry("doSomething(" + value + ")"); ... Logger.logExit("doSomething"); } public void doAnotherThing(char a, double b){ Logger.logEntry("doAnotherThing(" + a + "," + b + ")"); ... Logger.logExit("doAnotherThing"); } } Prática 02 28
  • 29. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos §  Implementação OOP de um requisito transversal public class Concerns { public void doSomething(int value){ Logger.logEntry("doSomething(" + value + ")"); ... Logger.logExit("doSomething"); } public void doAnotherThing(char a, double b){ Logger.logEntry("doAnotherThing(" + a + "," + b + ")"); ... Logger.logExit("doAnotherThing"); } } Prática 02 29
  • 30. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos public aspect LoggingAspect { pointcut publicMethods() : execution(public * *(..)); pointcut logObjectMethods() : execution(* Logger.*(..)); pointcut loggableCalls(): publicMethods() && !logObjectMethods(); before() : loggableCalls() { Logger.logEntry(thisJoinPoint.getSignature().toString()); } after() : loggableCalls() { Logger.logExit(thisJoinPoint.getSignature().toString()); } } Prática 02 §  Solução: uso de aspecto 30
  • 31. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos public class Concerns { public void doSomething(int value){ ... } public void doAnotherThing(char a, double b){ ... } } Prática 02 §  Assim, o desenvolvedor não precisa dar atenção a requisito de logging 31
  • 32. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos Prática 02 §  Demostração da criação de todo um projeto orientado a aspectos 32
  • 33. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos §  Observe uma das classes de persistência do sistema: §  Boa pergunta a ser realizada: §  O que há de errado com o código acima? public class UsuarioDAO implements IDataAccessObject{ ... public void add(Usuario usuario) throws SQLException{ Connection conn = null; try { conn = ConnectionLocator.getConnection(); //Abre a conexão PreparedStatement st = conn.prepareStatement("insert into USUARIO values (?,?,?)"); st.setString(1, usuario.getLogin()); st.setString(2, usuario.getSenha()); st.setString(3, usuario.getNome()); st.execute(); st.close(); conn.commit(); //Realiza commit } catch (SQLException e) { if (conn!=null){ conn.rollback(); //Realiza rollback } throw e; }finally{ if (conn!=null){ conn.close(); //Fecha a conexão } } } ... }//Fim da Classe Prática 03 33
  • 34. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos §  Observe uma das classes de persistência do sistema: §  Boa pergunta a ser realizada: §  O que há de errado com o código acima? public class UsuarioDAO implements IDataAccessObject{ ... public void add(Usuario usuario) throws SQLException{ Connection conn = null; try { conn = ConnectionLocator.getConnection(); //Abre a conexão PreparedStatement st = conn.prepareStatement("insert into USUARIO values (?,?,?)"); st.setString(1, usuario.getLogin()); st.setString(2, usuario.getSenha()); st.setString(3, usuario.getNome()); st.execute(); st.close(); conn.commit(); //Realiza commit } catch (SQLException e) { if (conn!=null){ conn.rollback(); //Realiza rollback } throw e; }finally{ if (conn!=null){ conn.close(); //Fecha a conexão } } } ... }//Fim da Classe Prática 03 public class UsuarioDAO implements IDataAccessObject{ ... public void add(Usuario usuario) throws SQLException{ Connection conn = null; try { conn = ConnectionLocator.getConnection(); //Abre a conexão PreparedStatement st = conn.prepareStatement("insert into USUARIO values (?,?,?)"); st.setString(1, usuario.getLogin()); st.setString(2, usuario.getSenha()); st.setString(3, usuario.getNome()); st.execute(); st.close(); conn.commit(); //Realiza commit } catch (SQLException e) { if (conn!=null){ conn.rollback(); //Realiza rollback } throw e; }finally{ if (conn!=null){ conn.close(); //Fecha a conexão } } } ... }//Fim da Classe 34
  • 35. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos §  Observe uma das classes de persistência do sistema: §  Boa pergunta a ser realizada: §  O que há de errado com o código acima? public class UsuarioDAO implements IDataAccessObject{ ... public void add(Usuario usuario) throws SQLException{ Connection conn = null; try { conn = ConnectionLocator.getConnection(); //Abre a conexão PreparedStatement st = conn.prepareStatement("insert into USUARIO values (?,?,?)"); st.setString(1, usuario.getLogin()); st.setString(2, usuario.getSenha()); st.setString(3, usuario.getNome()); st.execute(); st.close(); conn.commit(); //Realiza commit } catch (SQLException e) { if (conn!=null){ conn.rollback(); //Realiza rollback } throw e; }finally{ if (conn!=null){ conn.close(); //Fecha a conexão } } } ... }//Fim da Classe Prática 03 public class UsuarioDAO implements IDataAccessObject{ ... public void add(Usuario usuario) throws SQLException{ Connection conn = null; try { conn = ConnectionLocator.getConnection(); //Abre a conexão PreparedStatement st = conn.prepareStatement("insert into USUARIO values (?,?,?)"); st.setString(1, usuario.getLogin()); st.setString(2, usuario.getSenha()); st.setString(3, usuario.getNome()); st.execute(); st.close(); conn.commit(); //Realiza commit } catch (SQLException e) { if (conn!=null){ conn.rollback(); //Realiza rollback } throw e; }finally{ if (conn!=null){ conn.close(); //Fecha a conexão } } } ... }//Fim da Classe 35
  • 36. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos §  Implementação OOP de controle transacional public class UsuarioDAO implements IDataAccessObject{ ... public void add(Usuario usuario) throws SQLException{ Connection conn = null; try { conn = ConnectionLocator.getConnection(); //Abre a conexão PreparedStatement st = conn.prepareStatement("insert into USUARIO values (?,?,?)"); st.setString(1, usuario.getLogin()); st.setString(2, usuario.getSenha()); st.setString(3, usuario.getNome()); st.execute(); st.close(); conn.commit(); //Realiza commit } catch (SQLException e) { if (conn!=null){ conn.rollback(); //Realiza rollback } throw e; }finally{ if (conn!=null){ conn.close(); //Fecha a conexão } } } ... }//Fim da Classe Prática 03 36
  • 37. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos Prática 03 §  Esta implementação faz com o código do controle transacional esteja espalhado e entrelaçado em todos os métodos dos DAOs §  O ideal seria que, na chamada de qualquer método transacional, fosse automaticamente feito: §  Abertura de conexão §  Realização do commit da transação §  Encerramento da conexão §  Tratamento de eventuais exceções que possam vir a ocorrer 37
  • 38. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos public aspect PersistenceAspect percflow(topLevelTransactedMethods()) { public Connection com.terra.dao.IDataAccessObject._connection; pointcut transactedMethods() : execution(* com.terra.dao.IDataAccessObject+.*(..)); pointcut topLevelTransactedMethods(): transactedMethods() && !cflowbelow(transactedMethods()); Object around(IDataAccessObject dao) throws SQLException : topLevelTransactedMethods() && target(dao){ Object operationResult = null; try{ dao._connection = ConnectionLocator.getConnection(); operationResult = proceed(dao); if (dao._connection!=null){ dao._connection.commit(); } }catch(SQLException e){ if (dao._connection!=null){ dao._connection.rollback(); } throw e; }finally{ if (dao._connection!=null){ dao._connection.close(); } } return operationResult; } } // Fim do Aspecto Prática 03 §  Solução: uso de aspecto 38
  • 39. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos Prática 03 public aspect PersistenceAspect percflow(topLevelTransactedMethods()) { public Connection com.terra.dao.IDataAccessObject._connection; pointcut transactedMethods() : execution(* com.terra.dao.IDataAccessObject+.*(..)); pointcut topLevelTransactedMethods(): transactedMethods() && !cflowbelow(transactedMethods()); Object around(IDataAccessObject dao) throws SQLException : topLevelTransactedMethods() && target(dao){ Object operationResult = null; try{ dao._connection = ConnectionLocator.getConnection(); operationResult = proceed(dao); if (dao._connection!=null){ dao._connection.commit(); } }catch(SQLException e){ if (dao._connection!=null){ dao._connection.rollback(); } throw e; }finally{ if (dao._connection!=null){ dao._connection.close(); } } return operationResult; } } // Fim do Aspecto 39
  • 40. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos public class UsuarioDAO implements IDataAccessObject{ public void add(Usuario usuario) throws SQLException{ PreparedStatement st = _connection.prepareStatement("insert into USUARIO values (?,?,?)"); st.setString(1, usuario.getLogin()); st.setString(2, usuario.getSenha()); st.setString(3, usuario.getNome()); st.execute(); st.close(); } }//Fim da Classe Prática 03 §  Assim, o desenvolvedor não precisa dar atenção ao controle transacional nos métodos de persistência 40
  • 41. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos Considerações finais §  Desenvolver uma solução utilizando aspecto é um pouco trabalhoso, mas é realizada apenas uma única vez §  AOP é poderoso, entretanto pode ser perigoso §  AOP quebra o raciocínio modular §  Nada impede, mas o AOP não deve ser usado para qualquer interesse, mas apenas, para os interesses transversais §  Melhora o nível de modularização do sistema, com baixo acoplamento e alta coesão §  O processo de weaver demora §  A sintaxe do AspectJ não é trivial §  Desenvolver utilizando AOP é “massa”! 41
  • 42. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos Dúvidas? ??? 42
  • 43. Ricardo Terra (rterrabh [at] gmail.com) Outubro, 2013Programação Orientada a Aspectos Ricardo Terra rterrabh [at] gmail.com Apresentação e vídeo disponíveis em: www.ricardoterra.com.br/palestras Principais referências bibliográficas: KICZALES, Gregor et al. Aspect-Oriented Programming. ECOOP, 1997. TIRELO, Fábio et al. Desenvolvimento de Software Orientado por Aspectos. XXIII JAI, 2004. VALENTE, M. T. Programação Orientada por Aspectos. Programa de Pós-graduação em Informática PUC Minas, 2006. Obrigado! 43