PHP Aspect Oriented Design

5

Questa è una continuazione di questa domanda di revisione del codice .

Ciò che è stato sottratto a quel post e altri aspetti del design orientato è difficile da eseguire il debug. Per contrastare ciò, ho implementato la possibilità di attivare il tracciamento degli schemi di progettazione. Girare traccia su funziona come:

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

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

Nel log attuale con la traccia attivata, viene visualizzato in questo modo:

    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 le informazioni sono suddivise, i dati si traducono in:

  • Chiamato da un adattatore o filtro o osservatore
  • La funzione chiamata era una chiusura
  • La posizione della chiusura
  • Classe: metodo in cui l'adattatore è stato implementato su
  • La traccia di dove il metodo è stato chiamato da
  • Avvia linea e fine riga

Il codice ha dimostrato di funzionare in ambienti di produzione e presenta vari esempi da implementare, quindi la dimostrazione del concetto esiste. Non è DI e realizza cose che DI non può. Non chiamerei il codice boilerplate ma lo chiamerei gonfio. In sintesi, i punti deboli sono il codice gonfiato e una curva di apprendimento in cambio della funzionalità orientata all'aspetto.

Al di là della normale paura di qualcosa di nuovo e diverso, quali sono altri punti deboli in questa implementazione del design orientato all'aspetto, se esiste?

PS: altri esempi di AOP qui: link

    
posta Devin Dixon 13.02.2012 - 19:02
fonte

1 risposta

2

Non sembra davvero AOP, perché devi ancora copiare quel frammento di codice ovunque. È più incapsulato, certo, ma sta ancora "infettando" la tua normale logica di business. Quindi se setAdapterTrace ha bisogno di un altro parametro, o qualcosa di simile cambia, ora devi cambiare tutte le altre classi che lo usano. Questo è meno un problema con PHP che con, per esempio, .NET o Java, a causa della sua natura dinamica, ma sembra ancora qualcosa che si scontra con il principio della singola responsabilità (che presumo sia la ragione per cui si sta affrontando tutto questo ). Nella migliore delle ipotesi, è come un "povero DOP".

Se intendi utilizzare AOP con PHP, hai esaminato strumenti esistenti come php-aop ? Non l'ho fatto, quindi sono interessato a quello che potresti trovare senza di essi che vorresti scrivere il tuo strumento AOP.

Dovrei anche notare che i framework web come CakePHP possono possedere alcune funzionalità simili ad AOP che è possibile utilizzare (ad es. beforeFilter in CakePHP). Pertanto, se stai utilizzando un framework, potresti già disporre delle funzionalità necessarie.

    
risposta data 13.02.2012 - 20:37
fonte