2008-10-28 20 views
158

Rozumiem programowanie zorientowane obiektowo i przez długi czas pisałem programy OO. Ludzie wydają się mówić o programowaniu zorientowanym na aspekt, ale nigdy tak naprawdę nie nauczyłem się, co to jest i jak z niego korzystać. Jaki jest podstawowy paradygmat?Co to jest programowanie aspektowe?

To pytanie jest związane, ale nie całkiem zapytać go:

Aspect-Oriented Programming vs. Object Oriented Programming

+0

IMAO, link podany w pytaniu ma wyraźniejszy i dokładną odpowiedź niż przyjętym ten tutaj. Osoby czytające to pytanie mogą je najpierw przeczytać. –

Odpowiedz

138

AOP rozwiązuje problem przekrojowych dotyczy, który byłby każdy rodzaj kodu, który jest powtarzany w różnych metody i zwykle nie można ich całkowicie refaktoryzować do własnego modułu, np. przy logowaniu lub weryfikacji. Tak więc, z AOP można zostawić te rzeczy z głównego kodu i zdefiniować go pionowo tak:

function mainProgram() 
{ 
    var x = foo(); 
    doSomethingWith(x); 
    return x; 
} 

aspect logging 
{ 
    before (mainProgram is called): 
    { 
     log.Write("entering mainProgram"); 
    } 

    after (mainProgram is called): 
    { 
     log.Write( "exiting mainProgram with return value of " 
        + mainProgram.returnValue); 
    } 
} 

aspect verification 
{ 
    before (doSomethingWith is called): 
    { 
     if (doSomethingWith.arguments[0] == null) 
     { 
      throw NullArgumentException(); 
     } 

     if (!doSomethingWith.caller.isAuthenticated) 
     { 
      throw Securityexception(); 
     } 
    } 
} 

a potem aspekt-tkacz służy do kompilacji kodu w tym:

function mainProgram() 
{ 
    log.Write("entering mainProgram"); 

    var x = foo(); 

    if (x == null) throw NullArgumentException(); 
    if (!mainProgramIsAuthenticated()) throw Securityexception(); 
    doSomethingWith(x); 

    log.Write("exiting mainProgram with return value of "+ x); 
    return x; 
} 
+7

Czy potrzebujesz wsparcia językowego? W jakim języku jest twój przykład? – Sophie

+3

To jest pseudokod, ale najbardziej znanym przykładem jest AspectJ, która jest modyfikacją AOP Java, która używa podobnej techniki zwanej cutpoints. –

+15

Właściwie nazywają się one punktami odcięcia :) –

0

AOP to sposób na lepszą modularyzację aplikacji pod kątem funkcjonalności obejmujących wiele granic. AOP to kolejny sposób na hermetyzację tych funkcji i śledzenie pojedynczej odpowiedzialności poprzez przeniesienie tych przekrojowych problemów (rejestrowanie, obsługa błędów itp.) Z głównych komponentów aplikacji. Właściwe użycie AOP może z czasem doprowadzić do zwiększenia łatwości konserwacji i rozszerzalności aplikacji.

8

Niestety, wydaje się zaskakująco trudne, aby AOP był naprawdę użyteczny w normalnej organizacji średniej wielkości. (Wsparcie dla edytora, poczucie kontroli, fakt, że zaczynasz od mało ważnych rzeczy prowadzących do gnicia kodu, ludzie wracający z domu do swoich rodzin itp.)

Moje nadzieje pokładam w programowanie kompozytowe, co jest czymś bardziej realistycznym. Łączy się z wieloma popularnymi pomysłami i daje ci coś naprawdę fajnego.

Spójrz na najbliższych i wdrażania tutaj: qi4j.org/

PS. Właściwie, myślę, że jedna z piękności z AOP jest również jego piętą achillesową: jest nieinwazyjna, pozwalając ludziom ją zignorować, jeśli może, więc będzie traktowana jako drugorzędna troska w większości organizacji.

+2

Wciąż zawiera kilka bardzo ważnych punktów, jednak – Ash

3

Skopiowane z duplikatu dla kompletności (brzęczyk):

klasy i metody atrybutów w .NET są formą programowanie aspektowe. Dekorujesz swoje klasy/metody za pomocą atrybutów. Za kulisami dodaje kod do twojej klasy/metody, która wykonuje określone funkcje atrybutu. Na przykład oznaczenie klasy serializowalnej umożliwia jej automatyczne serializowanie w celu przechowywania lub przesyłania do innego systemu. Inne atrybuty mogą oznaczać niektóre właściwości jako niezdolne do serializacji, a te będą automatycznie pomijane w serializowanym obiekcie. Serializacja jest aspektem implementowanym przez inny kod w systemie i stosowana do twojej klasy przez zastosowanie atrybutu "konfiguracja" (dekoracja).

5

Skopiowane z duplikatu dla kompletności (Einstein):

Klasyczne przykłady to bezpieczeństwo i rejestrowania.Zamiast pisać kod w aplikacji, aby rejestrować wystąpienie x lub sprawdzić obiekt z dla kontroli dostępu bezpieczeństwa, istnieje ustrojstwo językowe "poza pasmem" normalnego kodu, które może systematycznie wprowadzać zabezpieczenia lub logować się do rutynowych procedur, które nie mają ich w natarczywych taki sposób, że mimo tego, że twój kod go nie dostarcza - jego opieka.

Bardziej konkretnym przykładem jest system operacyjny zapewniający kontrolę dostępu do pliku. Program nie musi sprawdzać ograniczeń dostępu, ponieważ system bazowy to działa.

Jeśli uważasz, że potrzebujesz AOP z mojego doświadczenia, to naprawdę musisz poświęcić więcej czasu i wysiłku na odpowiednie zarządzanie meta-danymi w twoim systemie, z naciskiem na przemyślane projektowanie struktur/systemów.

2

skopiowane z wiosną w działaniu

AOP często definiuje się jako technikę, która promuje oddzielenie dotyczy w systemie informatycznym. Systemy składają się z kilku komponentów , z których każdy odpowiada za określoną funkcję. Jednak często te komponenty przenoszą dodatkowe obowiązki poza ich podstawowe funkcje. Usługi systemowe, takie jak rejestrowanie, zarządzanie transakcjami i bezpieczeństwo, często znajdują się w komponentach , których podstawową odpowiedzialnością jest coś innego. Usługi te są zwykle nazywane zagadnieniami przekrojowymi, ponieważ mają skłonność do przecinania wielu komponentów w systemie.

1

Istnieje przykład AOP, jako przykładu wykorzystano sprężynowe AOP. Przykład jest dość łatwy do zrozumienia.

Schemat AOP Spring (programowanie zorientowane na aspekt) służy do modularyzacji zagadnień przekrojowych w aspektach. Mówiąc prościej, jest to po prostu przechwytywacz przechwytujący niektóre procesy, na przykład, gdy metoda jest wykonywana, Spring AOP może przejąć metodę wykonywania i dodać dodatkową funkcjonalność przed lub po wykonaniu metody.

referencyjny: http://www.mkyong.com/spring/spring-aop-examples-advice/

+0

W informatyce programowanie aspektowe (AOP) jest paradygmatem programowania, którego celem jest zwiększenie modułowości poprzez umożliwienie rozdzielenia zagadnień przekrojowych. –

0

AOP może być używany do wykonywania czynności, które nie są związane z logiką biznesową aplikacji, takich jak logowanie, buforowanie itp Działania te można umieścić w oddzielnej części aplikacji i następnie ponownie wykorzystane w całej aplikacji. Zwykle istnieją dwa sposoby osiągnięcia tego. Wstrzykiwanie kodu automagicznie przez preprocesor przed/po metodzie lub dołączanie klas proxy, które przechwytują wywołanie metody i może następnie wykonać rzeczy przed/po wywołaniu metody.

Oto przykład w .Net. Używa klas proxy do przechwytywania wywołań metod i wykonuje kod przed wywołaniem wywołań metody saif.

Aspect Oriented Programming (AOP) in .NET Core and C# using AutoFac and DynamicProxy