Projeto Orientado a Aspecto PHP

5

Esta é uma continuação desta pergunta da Revisão de Código .

O que foi tirado desse post e outro design orientado a aspectos é difícil de depurar. Para combater isso, implementei a capacidade de ativar o rastreamento dos padrões de design. Ativando o rastreio funciona como:

//This can be added anywhere in the code
Run::setAdapterTrace(true);
Run::setFilterTrace(true);
Run::setObserverTrace(true);

//Execute the functon
echo Run::goForARun(8);

No log atual com o rastreamento ativado, ele é produzido da seguinte forma:

    adapter 2012-02-12 21:46:19 {"type":"closure","object":"static","call_class":"\/public_html\/examples\/design\/ClosureDesigns.php","class":"Run","method":"goForARun","call_method":"goForARun","trace":"Run::goForARun","start_line":68,"end_line":70}

filter 2012-02-12 22:05:15 {"type":"closure","event":"return","object":"static","class":"run_filter","method":"\/home\/prodigyview\/public_html\/examples\/design\/ClosureDesigns.php","trace":"Run::goForARun","start_line":51,"end_line":58}

observer 2012-02-12 22:05:15 {"type":"closure","object":"static","class":"run_observer","method":"\/home\/prodigyview\/public_html\/public\/examples\/design\/ClosureDesigns.php","trace":"Run::goForARun","start_line":61,"end_line":63}

Quando as informações são divididas, os dados são convertidos para:

  • Chamado por um adaptador ou filtro ou observador
  • A função chamada foi um encerramento
  • A localização do fechamento
  • Classe: método que o adaptador foi implementado em
  • O rastreamento de onde o método foi chamado de
  • Iniciar linha e finalizar

O código provou funcionar em ambientes de produção e apresenta vários exemplos de implementação, portanto, a prova de conceito está lá. Não é DI e realiza coisas que a DI não pode. Eu não chamaria o boilerplate de código, mas eu chamaria de inchado. Em resumo, os pontos fracos são código inchado e uma curva de aprendizado em troca de funcionalidade orientada a aspectos.

Além do medo normal de algo novo e diferente, quais são outras fraquezas nessa implementação de design orientado a aspectos, se houver?

PS: Mais exemplos de AOP aqui: link

    
por Devin Dixon 13.02.2012 / 19:02
fonte

1 resposta

2

Não parece realmente AOP, porque você ainda tem que copiar esse trecho de código em todos os lugares. É mais encapsulado, claro, mas ainda está "infectando" sua lógica comercial normal. Portanto, se setAdapterTrace precisar de outro parâmetro, ou algo assim, você terá que alterar todas as outras classes usando-o. Isso é um problema menor com PHP do que com .NET ou Java, por causa de sua natureza dinâmica, mas ainda parece algo que entra em conflito com o princípio da responsabilidade única (que eu suponho que seja sua razão para passar por tudo isso ). Na melhor das hipóteses, é como uma "AOP do pobre".

Se você pretende usar o AOP com o PHP, já examinou as ferramentas existentes, como o php-aop ? Eu não tenho, então estou interessado no que você pode achar falta deles que você gostaria de escrever sua própria ferramenta AOP.

Devo notar também que frameworks web como o CakePHP podem possuir alguma funcionalidade semelhante à AOP que você poderia usar (por exemplo, beforeFilter no CakePHP). Então, se você estiver usando uma estrutura, talvez já tenha os recursos necessários.

    
por 13.02.2012 / 20:37
fonte