Você usa AOP (Programação Orientada a Aspectos) em software de produção?

StackOverflow https://stackoverflow.com/questions/20663

  •  09-06-2019
  •  | 
  •  

Pergunta

POA é um paradigma de programação interessante na minha opinião.No entanto, ainda não houve discussões sobre isso aqui no stackoverflow (pelo menos não consegui encontrá-las).O que você pensa sobre isso em geral?Você usa AOP em seus projetos?Ou você acha que é uma tecnologia de nicho que não existirá por muito tempo ou que não se tornará popular (como o OOP fez, pelo menos em teoria;))?

Se você usa AOP, informe-nos quais ferramentas você também usa.Obrigado!

Foi útil?

Solução

Sim.

Preocupações ortogonais, como segurança, são melhor resolvidas com interceptação no estilo AOP.Se isso é feito automaticamente (por meio de algo como um contêiner de injeção de dependência) ou manualmente, não é importante para o objetivo final.

Um exemplo:os atributos "antes/depois" em xUnit.net (um projeto de código aberto que executo) são uma forma de interceptação de método no estilo AOP.Você decora seus métodos de teste com esses atributos e, pouco antes e depois da execução do método de teste, seu código é chamado.Ele pode ser usado para configurar um banco de dados e reverter os resultados, alterar o contexto de segurança no qual o teste é executado, etc.

Outro exemplo:os atributos do filtro em ASP.NET MVC também atuam como interceptadores de métodos especializados no estilo AOP.Um deles, por exemplo, permite dizer como os erros não tratados devem ser tratados, caso ocorram no seu método de ação.

Muitos contêineres de injeção de dependência, incluindo Castle Windsor e Unity, suportam esse comportamento "na caixa" ou por meio do uso de extensões.

Outras dicas

Python oferece suporte a AOP permitindo que você modifique dinamicamente suas classes em tempo de execução (o que em Python normalmente é chamado de monkeypatching em vez de AOP).Aqui estão alguns dos meus casos de uso de AOP:

  1. Tenho um site em que cada página é gerada por uma função Python.Eu gostaria de fazer uma aula e tornar todas as páginas da web geradas por essa aula protegidas por senha.AOP vem em socorro;antes de cada função ser chamada, faço a verificação de sessão apropriada e redireciono, se necessário.

  2. Eu gostaria de fazer alguns registros e perfis de várias funções em meu programa durante seu uso real.AOP me permite calcular o tempo e imprimir dados em arquivos de log sem modificar nenhuma dessas funções.

  3. Eu tenho um módulo ou classe cheio de funções não seguras para threads e me vejo usando-o em algum código multithread.Alguns AOP adicionam bloqueio nessas chamadas de função sem precisar entrar na biblioteca e alterar nada.

Esse tipo de coisa não aparece com muita frequência, mas sempre que acontece, o monkeypatching é MUITO útil.Python também possui decoradores que implementam o padrão de design Decorator (http://en.wikipedia.org/wiki/Decorator_pattern) para realizar coisas semelhantes.

Observe que a modificação dinâmica de classes também permite solucionar bugs ou adicionar recursos a uma biblioteca de terceiros sem realmente precisar modificar essa biblioteca.Quase nunca preciso fazer isso, mas nas poucas vezes que surgiu, foi incrivelmente útil.

Não entendo como alguém pode lidar com questões transversais como registro, segurança, gerenciamento de transações e tratamento de exceções de maneira limpa, sem usar AOP.

Qualquer pessoa que use a estrutura Spring (provavelmente cerca de 50% dos desenvolvedores corporativos Java) está usando AOP, quer saiba disso ou não.

No Terracota usamos AOP e instrumentação de bytecode bastante extensivamente para integrar e instrumentar software de terceiros.Por exemplo, nosso Integração de primavera é realizado em grande parte usando aspectowerkz.Resumindo, precisamos interceptar chamadas para beans Spring e fábricas de beans em vários pontos para agrupá-los.

Portanto, o AOP pode ser útil para integração com código de terceiros que não pode ser modificado de outra forma.No entanto, descobrimos que há uma grande armadilha - se possível, use apenas a API pública de terceiros em seus pontos de junção, caso contrário você corre o risco de ter seu código quebrado por uma alteração em algum método privado na próxima versão secundária, e ele se tornará um pesadelo de manutenção.

AOP e demarcação de transação são uma combinação perfeita.Usamos anotações Spring AOP @Transaction, o que torna a demarcação de tx mais fácil e intuitiva do que eu já vi em qualquer outro lugar.

Usamos o AspectJ em um dos meus grandes projetos há algum tempo.O projeto era composto por diversos serviços web, cada um com diversas funções, que constituíam o front end de um complicado sistema de processamento/consulta de documentos.Algo em torno de 75 mil linhas de código.Usamos aspectos para duas funcionalidades relativamente pequenas.

Primeiro foi rastrear o fluxo do aplicativo.Criamos um aspecto que era executado antes e depois de cada chamada de função para imprimir "função inserida" e "função encerrada".Com o seletor de função (pointcut talvez?Não lembro o nome certo) conseguimos usar isso como uma ferramenta de depuração, selecionando apenas funções que queríamos rastrear em um determinado momento.Este foi um uso muito bom para aspectos do nosso projeto.

A segunda coisa que fizemos foram métricas específicas do aplicativo.Colocamos aspectos em torno de nossos métodos de serviço da web para capturar tempo, informações de objetos, etc.e despeje os resultados em um banco de dados.Isso foi bom porque pudemos capturar essas informações, mas ainda manter todo o código de captura separado do código "real" que fez o trabalho.

Eu li sobre algumas soluções interessantes que os aspectos podem trazer para a mesa, mas ainda não estou convencido de que elas possam realmente fazer algo que você não poderia fazer (talvez melhor) com a tecnologia "normal".Por exemplo, não consegui pensar em nenhum recurso ou funcionalidade importante que qualquer um de nossos projetos precisasse que não pudesse ser feito tão facilmente sem aspectos - onde descobri que os aspectos são úteis são os tipos de coisas menores que mencionei .

Eu uso muito AOP em meus aplicativos C#.Não sou um grande fã de usar atributos, então usei Castle DynamicProxy e Boo para aplicar aspectos em tempo de execução sem poluir meu código

Usamos AOP em nossa fachada de sessão para fornecer uma estrutura consistente para nossos clientes personalizarem nosso aplicativo.Isso nos permite expor um único ponto de personalização sem precisar adicionar suporte de gancho manual para cada método.

Além disso, o AOP fornece um ponto único de configuração para configuração e desmontagem de transações adicionais e os itens usuais de registro.Ao todo, é muito mais fácil de manter do que fazer tudo isso manualmente.

O principal aplicativo em que trabalho inclui um host de script.AOP permite que o host examine as propriedades de um script antes de decidir se deseja ou não carregar o script no domínio do aplicativo.Como alguns dos scripts são bastante complicados, isso torna o carregamento muito mais rápido em tempo de execução.

Também usamos e planejamos usar um número significativo de atributos para coisas como controle do compilador, controle de fluxo e depuração no IDE, que não precisam fazer parte do aplicativo distribuído final.

Usamos PostSharp para nossa solução AOP.Temos aspectos de cache, tratamento de erros e novas tentativas de banco de dados que usamos atualmente e estamos no processo de tornar nossas verificações de segurança um Aspecto.

Funciona muito bem para nós.Os desenvolvedores realmente gostam da separação de interesses.Os arquitetos realmente gostam de ter a lógica do nível da plataforma consolidada em um único local.

A biblioteca PostSharp é um pós-compilador que faz a injeção do código.Possui uma biblioteca de interceptações predefinidas que são fáceis de implementar.Parece uma conexão em manipuladores de eventos.

Sim, usamos AOP na programação de aplicativos.Preferencialmente uso AspectJ para integrar AOP em meus aplicativos Spring.Dê uma olhada neste artigo para obter uma perspectiva mais ampla para o mesmo.

http://codemodeweb.blogspot.in/2018/03/spring-aop-and-aspectj-framework.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top