Domanda

AOP è un paradigma di programmazione interessante secondo me.Tuttavia, non ci sono state ancora discussioni a riguardo qui su StackOverflow (almeno non sono riuscito a trovarle).Cosa ne pensi in generale?Utilizzi AOP nei tuoi progetti?O pensi che sia piuttosto una tecnologia di nicchia che non esisterà per molto tempo o non diventerà mainstream (come ha fatto l'OOP, almeno in teoria ;))?

Se utilizzi AOP, facci sapere anche quali strumenti utilizzi.Grazie!

È stato utile?

Soluzione

SÌ.

Le preoccupazioni ortogonali, come la sicurezza, vengono risolte meglio con l’intercettazione in stile AOP.Che ciò avvenga automaticamente (tramite qualcosa come un contenitore per l'iniezione di dipendenze) o manualmente non è importante per l'obiettivo finale.

Un esempio:gli attributi "prima/dopo" in xUnit.net (un progetto open source che corro) sono una forma di intercettazione del metodo in stile AOP.Decori i tuoi metodi di test con questi attributi e subito prima e dopo l'esecuzione del metodo di test, viene chiamato il tuo codice.Può essere utilizzato per operazioni come la configurazione di un database e il rollback dei risultati, la modifica del contesto di sicurezza in cui viene eseguito il test, ecc.

Un altro esempio:gli attributi del filtro in ASP.NET MVC agiscono anche come intercettori di metodi specializzati in stile AOP.Uno, ad esempio, ti consente di dire come dovrebbero essere trattati gli errori non gestiti, se si verificano nel tuo metodo di azione.

Molti contenitori di inserimento delle dipendenze, inclusi Castle Windsor e Unity, supportano questo comportamento "in the box" o tramite l'uso di estensioni.

Altri suggerimenti

Python supporta AOP consentendoti di modificare dinamicamente le sue classi in fase di runtime (che in Python è tipicamente chiamato Monkeypatching anziché AOP).Ecco alcuni dei miei casi d'uso AOP:

  1. Ho un sito web in cui ogni pagina è generata da una funzione Python.Mi piacerebbe seguire un corso e proteggere con password tutte le pagine Web generate da quel corso.L'AOP viene in soccorso;prima che venga chiamata ciascuna funzione, eseguo il controllo della sessione appropriato e il reindirizzamento, se necessario.

  2. Mi piacerebbe eseguire la registrazione e la profilazione di una serie di funzioni nel mio programma durante il suo utilizzo effettivo.AOP mi consente di calcolare i tempi e stampare i dati nei file di registro senza modificare effettivamente nessuna di queste funzioni.

  3. Ho un modulo o una classe piena di funzioni non thread-safe e mi ritrovo a utilizzarlo in codice multi-thread.Alcuni AOP aggiungono il blocco di queste chiamate di funzione senza dover accedere alla libreria e modificare nulla.

Questo genere di cose non si verificano molto spesso, ma ogni volta che si verificano, il MonkeyPatching è MOLTO utile.Python dispone anche di decoratori che implementano il modello di progettazione Decoratore (http://en.wikipedia.org/wiki/Decorator_pattern) per realizzare cose simili.

Tieni presente che la modifica dinamica delle classi può anche consentirti di aggirare bug o aggiungere funzionalità a una libreria di terze parti senza dover effettivamente modificare quella libreria.Non ho quasi mai bisogno di farlo, ma le poche volte che è successo è stato incredibilmente utile.

Non capisco come sia possibile gestire problemi trasversali come la registrazione, la sicurezza, la gestione delle transazioni e la gestione delle eccezioni in modo pulito senza utilizzare AOP.

Chiunque utilizzi il framework Spring (probabilmente circa il 50% degli sviluppatori aziendali Java) utilizza AOP, che lo sappia o no.

A Terracotta utilizziamo la strumentazione AOP e bytecode in modo piuttosto estensivo per integrarci e strumentare software di terze parti.Ad esempio, il nostro Integrazione primaverile è realizzato in gran parte utilizzando aspettowerkz.In poche parole, dobbiamo intercettare in vari punti le chiamate ai fagioli Spring e alle fabbriche di fagioli per raggrupparli.

Quindi AOP può essere utile per l'integrazione con codice di terze parti che non può essere modificato altrimenti.Tuttavia, abbiamo scoperto che esiste un'enorme trappola: se possibile, utilizza solo l'API pubblica di terze parti nei tuoi punti di unione, altrimenti rischi che il tuo codice venga danneggiato da una modifica a qualche metodo privato nella prossima versione minore, e diventa un incubo per la manutenzione.

L'AOP e la demarcazione delle transazioni sono una combinazione perfetta.Utilizziamo le annotazioni Spring AOP @Transaction, rendono la demarcazione tx più semplice e intuitiva di quanto abbia mai visto altrove.

Abbiamo usato aspettiJ in uno dei miei grandi progetti per un bel po' di tempo.Il progetto era composto da diversi servizi web, ciascuno con diverse funzioni, che costituivano il front-end per un complicato sistema di elaborazione/interrogazione dei documenti.Da qualche parte circa 75.000 righe di codice.Abbiamo utilizzato gli aspetti per due funzionalità relativamente minori.

Il primo è stato il monitoraggio del flusso delle applicazioni.Abbiamo creato un aspetto che veniva eseguito prima e dopo ogni chiamata di funzione per stampare "funzione inserita" e "funzione uscita".Con il selettore di funzioni (pointcut forse?(non ricordo il nome giusto) abbiamo potuto usarlo come strumento di debug, selezionando solo le funzioni che volevamo tracciare in un dato momento.Questo è stato davvero un ottimo utilizzo per alcuni aspetti del nostro progetto.

La seconda cosa che abbiamo fatto sono state le metriche specifiche dell'applicazione.Inseriamo aspetti nei metodi dei nostri servizi Web per acquisire tempistiche, informazioni sugli oggetti, ecc.e scaricare i risultati in un database.Questo è stato utile perché potevamo acquisire queste informazioni, ma allo stesso tempo mantenere tutto il codice di acquisizione separato dal codice "reale" che svolgeva il lavoro.

Ho letto di alcune soluzioni interessanti che gli aspetti possono portare sul tavolo, ma non sono ancora convinto che possano davvero fare qualcosa che non potresti fare (forse meglio) con la tecnologia "normale".Ad esempio, non riuscivo a pensare a nessuna caratteristica o funzionalità importante di cui uno qualsiasi dei nostri progetti avesse bisogno che non potesse essere realizzata altrettanto facilmente senza gli aspetti - dove ho trovato utili gli aspetti sono il tipo di cose minori che ho menzionato .

Utilizzo molto AOP nelle mie applicazioni C#.Non sono un grande fan dell'utilizzo degli attributi, quindi ho utilizzato Castle DynamicProxy e Boo per applicare gli aspetti in fase di runtime senza inquinare il mio codice

Utilizziamo AOP nella nostra facciata di sessione per fornire un quadro coerente affinché i nostri clienti possano personalizzare la nostra applicazione.Ciò ci consente di esporre un singolo punto di personalizzazione senza dover aggiungere il supporto di hook manuale per ciascun metodo.

Inoltre, AOP fornisce un unico punto di configurazione per l'impostazione e lo smontaggio di transazioni aggiuntive e le consuete operazioni di registrazione.Tutto sommato, molto più gestibile che fare tutto questo a mano.

L'applicazione principale su cui lavoro include uno script host.AOP consente all'host di esaminare le proprietà di uno script prima di decidere se caricare o meno lo script nel dominio dell'applicazione.Poiché alcuni script sono piuttosto macchinosi, ciò consente un caricamento molto più rapido in fase di esecuzione.

Inoltre utilizziamo e prevediamo di utilizzare un numero significativo di attributi per cose come il controllo del compilatore, il controllo del flusso e il debug in-IDE, che non devono necessariamente far parte dell'applicazione distribuita finale.

Utilizziamo PostSharp per la nostra soluzione AOP.Attualmente utilizziamo aspetti di memorizzazione nella cache, gestione degli errori e nuovi tentativi del database e stiamo trasformando i nostri controlli di sicurezza in un Aspetto.

Funziona alla grande per noi.Agli sviluppatori piace molto la separazione delle preoccupazioni.Agli architetti piace molto che la logica a livello di piattaforma sia consolidata in un'unica posizione.

La libreria PostSharp è un postcompilatore che esegue l'iniezione del codice.Ha una libreria di intercettazioni predefinite cerebralmente facili da implementare.Sembra di cablare i gestori di eventi.

Sì, utilizziamo AOP nella programmazione delle applicazioni.Utilizzo preferibilmente AspectJ per integrare aop nelle mie applicazioni Spring.Dai un'occhiata a questo articolo per avere una prospettiva più ampia per lo stesso.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top