Esempio di preoccupazione trasversale


121

Qual è un buon esempio di a cross-cutting concern ? L'esempio di cartella clinica sulla pagina di wikipedia mi sembra incompleto.

In particolare da questo esempio, perché la registrazione porterebbe alla duplicazione del codice ( scattering )? (Oltre a semplici chiamate come log("....")ovunque, che non sembra un grosso problema).

Qual è la differenza tra a core concern e a cross-cutting concern?

Il mio obiettivo finale è ottenere una migliore comprensione della AOP.

Risposte:


235

Prima di comprendere la preoccupazione trasversale , dobbiamo capire la preoccupazione .

A Concern è un termine che si riferisce a una parte del sistema suddivisa in base alla funzionalità.

Le preoccupazioni sono di due tipi:

  1. Le preoccupazioni che rappresentano funzionalità singole e specifiche per i requisiti primari sono note come preoccupazioni principali .
    OPPURE
    La funzionalità primaria del sistema è nota come preoccupazione principale.
    Ad esempio : logica aziendale
  2. Le preoccupazioni che rappresentano le funzionalità per i requisiti secondari sono indicate come preoccupazioni trasversali o preoccupazioni a livello di sistema .
    OPPURE
    La preoccupazione trasversale è una preoccupazione che è applicabile in tutta la domanda e interessa l'intera domanda.
    Ad esempio: la registrazione, la sicurezza e il trasferimento dei dati sono le preoccupazioni necessarie in quasi tutti i moduli di un'applicazione, quindi sono problemi trasversali.

Cortesia

inserisci qui la descrizione dell'immagine

Questa figura rappresenta un'applicazione tipica suddivisa in moduli. La preoccupazione principale di ogni modulo è fornire servizi per il suo particolare dominio. Tuttavia, ciascuno di questi moduli richiede anche funzionalità ausiliarie simili, come la registrazione della sicurezza e la gestione delle transazioni. Un esempio di problemi di crosscutting è il "logging", che viene spesso utilizzato nelle applicazioni distribuite per facilitare il debug tracciando le chiamate ai metodi. Supponiamo di eseguire la registrazione sia all'inizio che alla fine del corpo di ogni funzione. Ciò comporterà il taglio incrociato di tutte le classi che hanno almeno una funzione.

(Cortesia)


1
"La preoccupazione trasversale è una preoccupazione che è applicabile in tutta l'applicazione" sure Non ne sono sicuro poiché la gestione delle transazioni non è applicabile "in tutta" l'applicazione, ma è ancora una preoccupazione trasversale. E l'immagine non mi dice nulla a dire il vero, è solo fonte di confusione ..
Koray Tugay

Buona spiegazione, ma ho un piccolo problema con il quadro in cui chiamiamo queste preoccupazioni, preoccupazioni trasversali non trasversali e penso che sarebbe meglio tagliare altre preoccupazioni con preoccupazioni trasversali, non in un altro modo. Come lo sviluppo orientato agli
aspetti

ancora la risposta non spiega il problema con il semplice utilizzo di qualcosa come Log4j e la registrazione come LogManager.getLogger (). info (ModuleName, msg)
Vicky Singh

49

Penso che il miglior esempio di una preoccupazione trasversale sia il comportamento transazionale. Dover inserire blocchi try-catch con chiamate commit e rollback in tutti i metodi del servizio sarebbe repellente, ad esempio. Annotare i metodi con un pennarello che AOP può utilizzare per incapsularli con il comportamento transazionale desiderato è una grande vittoria.

Un altro buon candidato come esempio di preoccupazione trasversale è l'autorizzazione. Annotare un metodo di servizio con un indicatore che indica chi può chiamarlo e lasciare che alcuni consigli di AOP decidano se consentire o meno la chiamata al metodo, può essere preferibile alla gestione del codice del metodo di servizio.

L'implementazione della registrazione con il consiglio AOP potrebbe essere un modo per ottenere maggiore flessibilità, in modo da poter modificare ciò che viene registrato modificando un punto di unione. In pratica non vedo progetti che lo fanno molto spesso. In genere, l'utilizzo di una libreria come log4j che consente di filtrare per livello di registrazione e categoria, in fase di esecuzione se necessario, funziona abbastanza bene.

Una delle preoccupazioni principali è il motivo per cui l'applicazione esiste, la logica di business che l'applicazione automatizza. Se disponi di un'applicazione logistica che gestisce il trasporto di merci, capire quanto carico puoi imballare su un camion o qual è il percorso migliore da prendere per il camion per consegnare le consegne potrebbe essere una preoccupazione fondamentale. Le preoccupazioni trasversali sono in genere dettagli di implementazione che devono essere tenuti separati dalla logica aziendale.


2
Quindi, anche se il comportamento transazionale esiste davvero solo nel livello di accesso ai dati, poiché i blocchi try-catch sono duplicati su molti metodi, è considerato trasversale. La mia percezione originale era che il taglio incrociato significava che il codice si estendeva su più livelli dell'applicazione.
jlars62

4
@ jlars62: trasversale significa che va ad angolo retto rispetto alle caratteristiche.
Nathan Hughes

7
@ jlars62: per ad angolo retto intendo: pensa a una funzione come a una pila di livelli. una preoccupazione trasversale può essere applicata a un solo livello, ma è comune a tutte le funzionalità.
Nathan Hughes

L'autorizzazione di @NathanHughes è un buon esempio. Ho appena modificato la mia app per inserire tutto il codice di autorizzazione in un'architettura trasversale e ha funzionato a meraviglia per ripulire un sacco di codice. Considero il dominio come una casa. Se hai la chiave per entrare, puoi fare quello che vuoi lì (si presume che sia un proprietario). Ma non chiuderesti a chiave tutte le porte della casa e chiederesti una chiave di accesso. O sei dentro o non lo sei.
richard

Il "comportamento transazionale" può essere comune a molte funzionalità, ma non sarà "trasversale" perché non "attraversa" i livelli. Il motivo, ad esempio, la registrazione è un problema trasversale è perché potrei voler accedere al livello di presentazione, livello aziendale, livello dati ecc.
CodingYoshi

14

Oltre alla risposta accettata, desidero menzionare un altro esempio per una preoccupazione trasversale: la comunicazione remota. Diciamo che voglio solo chiamare localmente altri componenti nel mio ecosistema come se fossero in esecuzione. Forse in alcuni casi lo fanno anche. Ma ora voglio eseguire i miei servizi distribuiti in un cloud o in un cluster. Perché dovrei preoccuparmi di questo aspetto come sviluppatore di applicazioni? Un aspetto potrebbe occuparsi di scoprire chi chiamare e come, serializzare i dati trasmessi se necessario ed effettuare una chiamata a distanza. Se tutto fosse in esecuzione, l'aspetto dovrebbe semplicemente inoltrare la chiamata locale. Sul lato chiamato, l'aspetto deserializza i dati, effettua la chiamata locale e restituisce il risultato.

Ora lasciate che vi racconti una piccola storia su cose "banali" come l'output di log: solo poche settimane fa ho refactoring una base di codice complessa, ma non troppo grande (circa 250.000 righe di codice) per un client. In poche centinaia di classi è stato utilizzato un tipo di framework di registrazione, in altre poche centinaia un altro. Poi c'erano diverse migliaia di righeSystem.out.println(*)dove in realtà avrebbe dovuto esserci l'output del registro. Quindi ho finito per sistemare migliaia di righe di codice sparse per tutta la base del codice. Fortunatamente ho potuto usare alcuni trucchi intelligenti in IntelliJ IDEA (ricerca e sostituzione strutturale) per velocizzare l'intera azione, ma ragazzo non pensi che sia stato banale! Certo, la registrazione del debug fortemente dipendente dal contesto si verificherà sempre all'interno di un corpo del metodo, ma molti tipi importanti di registrazione come le chiamate al metodo di traccia (anche gerarchicamente con un output ben rientrato), la registrazione di eccezioni gestite o non gestite, il controllo degli utenti (registrazione delle chiamate a metodi limitati basati sui ruoli dell'utente) e così via possono essere facilmente implementati in alcuni aspetti senza che inquinino il codice sorgente. Lo sviluppatore di applicazioni quotidiano non ha bisogno di pensarci o anche di vedere le chiamate del logger sparse nella base del codice.

Posso fornire spiegazioni simili per altre preoccupazioni trasversali. Mantenere il codice pulito e libero da dispersioni e grovigli IMO è una questione di professionalità, non qualcosa di opzionale. Ultimo ma non meno importante, mantiene il codice leggibile, manutenibile, refactoring. Amen.


0

Le preoccupazioni trasversali sono gli scenari che dovrebbero essere sempre presenti indipendentemente dal tipo di applicazione.

Ad esempio, registrazione, sicurezza, profilazione delle prestazioni, localizzazione, accessibilità, transazione ecc. Indipendentemente dal software che stiamo costruendo, la registrazione è necessaria (altrimenti come qualcuno eseguirà il debug o otterrà alcune informazioni rilevanti dai dati del prodotto). La sicurezza (autenticazione / autorizzazione ecc.) È necessaria quando solo l'utente autentico può accedere all'applicazione con il giusto set di privilegi. Abbiamo bisogno di sapere come funziona la tua applicazione, quindi dobbiamo fare la profilazione. Nel caso in cui l'applicazione venga utilizzata da utenti internazionali (con la propria lingua localizzata), è necessario supportare la stessa nell'applicazione. L'accessibilità è un caso di usabilità per le persone disabili che utilizzano la nostra applicazione.

Ora, indipendentemente dal fatto che la nostra applicazione sia basata su desktop, web e così via, se deve essere utilizzata dagli utenti finali in tutta l'area geografica nell'ambiente di produzione, sono necessari tagli incrociati. Finora non ho detto nulla su cosa sia l'applicazione, ecc., Ma dato l'elenco delle preoccupazioni che dovrebbero essere affrontate prima di rilasciarla agli utenti finali nell'ambiente di produzione. e questo è tutto su problemi di taglio incrociato (che deve essere gestito da tutte le applicazioni / metodi / classi, cioè a vari livelli).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.