Conceitos:
Interesses (concerns): representam requisitos, funcionalidades ou propriedades.
Interesses transversais (crosscutting concerns): interesses espalhados pelas classes do sistema. Ex.: logging, autenticação, controle de acesso, concorrência e transações, distribuição e persistência.
Código entrelaçado (code tangling): código de interesses transversais misturado com código do negócio.
Código espalhado (code spreading): código de interesses transversais espalhados no código do negócio.
Separação de interesses: cada interesse, um módulo.
Weaver: ferramenta que combina o código dos interesses não-transversais (orientação a objeto) com o código dos interesses transversais (orientação a aspecto).
Pontos de Junção (joinpints): pontos no fluxo de execução em que o código de aspecto é executado. Ex.: chamadas, execuções e retorno de métodos e construtores, lançamento e tratamento de exceções, alteração de campos de classe.
Conjuntos de Junção (pointcuts): conjunto de pontos de junção. Ex.: todas as chamadas de métodos públicos, toda criação de objetos de uma determinada classe, toda chamada de um método determinado, toda alteração de um campo específico de uma classe.
Regras de Junção (advices): código de aspecto que modifica o código principal. Ex.: executar um determinado método antes de toda chamada de método público.
Aspectos: coleção de conjuntos de junção e regras de junção. Tipos:
Before: antes da execução
After: depois da execução
Around: durante a execução
Call: relacionado a uma chamada de um método
Execution: relacionado à execução de um trecho de código
Transversalidade estática (intertype declarations): alterar a estrutura estático de um tipo. (tempo de compilação) Ex.: introdução de campos e métodos em classes, modificação de hierarquia, declaração de erros e enfraquecimento de excessões.
Transversalidade dinâmica (dynamic crosscutting): alterar o comportamento da execução do programa.
Quantificação (quantification): capacidade de executar o código do aspecto em diversos pontos do código principal.
Desconhecimento (Obliviousness ): característica do código de aspecto de ser desconhecido pelo programador do código principal.
Principais Problemas:
Raciocínio modular: aspectos não devem alterar qualquer parte do código, interferindo na modularidade do mesmo. Solução: interfaces entre o código principal e o código de aspectos, permitindo a evolução de ambos os códigos em paralelo.Fragilidade dos conjuntos de junção (point cuts): a alteração no código principal pode comprometer o funcionamento do aspecto. Solução: interfaces entre o código principal e o código de aspectos.
Baixo grau de quantificação: um aspecto altera poucas partes do código, não representando ganho significativo de compreensibilidade e alterabilidade.