Pytanie Czym jest programowanie aspektowe?


Rozumiem programowanie obiektowe i piszę programy OO przez długi czas. 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?

To pytanie jest powiązane, ale nie całkiem o to pyta:

Programowanie zorientowane na aspekt a programowanie obiektowe


178
2017-10-28 03:39


pochodzenie


IMAO, link podany w pytaniu ma jaśniejszą i dokładniejszą odpowiedź niż tutaj zaakceptowana. Osoby czytające to pytanie mogą je najpierw przeczytać. - David Chen


Odpowiedzi:


AOP rozwiązuje problem zagadnienia przekrojowe, który byłby jakimkolwiek rodzajem kodu, który powtarza się różnymi metodami i zwykle nie może być całkowicie refaktoryzowany do własnego modułu, jak przy logowaniu lub weryfikacji. Tak więc, z AOP możesz zostawić te rzeczy z głównego kodu i zdefiniować go w pionie w następujący sposób:

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 an aspekt-tkacz służy do kompilacji kodu do tego:

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;
} 

154
2017-10-28 03:46



Czy potrzebujesz wsparcia językowego? W jakim języku jest twój przykład? - Sophie
Jest to pseudokod, ale najbardziej znanym przykładem jest AspectJ, która jest modyfikacją AOP Java, która używa podobnej techniki zwanej cutpoints. - Mark Cidade
Właściwie to one nazywają się punktami :) - Dónal
Wiara w czary. I myślałem, że OOP jest przesadą. - Aiden Bell
Mark, czy to jest jak dekorowanie punktu wejścia i wyjścia metody? - Filip Dupanović


Niestety, zaskakująco trudno jest uczynić AOP naprawdę użytecznym w normalnej organizacji średniej wielkości. (Wsparcie dla redaktorów, poczucie kontroli, fakt, że zaczynasz od mało ważnych rzeczy prowadzących do gnicia kodów, ludzi, którzy wracają do domu, do swoich rodzin itd.)

Mam nadzieję programowanie kompozytowe, co jest czymś bardziej realistycznym. Łączy się z wieloma popularnymi pomysłami i daje ci coś naprawdę fajnego.

Zobacz nadchodzącą implementację 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.


9
2017-10-28 04:07



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


Skopiowano z duplikatu dla kompletności (Einstein):

Klasyczne przykłady to bezpieczeństwo i logowanie. 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, ze szczególnym uwzględnieniem przemyślanego projektowania strukturalnego / systemów.


6
2017-09-15 09:27





Skopiowane ze Spring in Action

AOP jest często definiowany jako technika promująca separację   obawy w systemie oprogramowania. Systemy składają się z kilku   składniki, z których każdy odpowiada za określoną funkcję.   Ale często te komponenty również wiążą się z dodatkowymi obowiązkami   poza ich podstawową funkcjonalność. Usługi systemowe, takie jak logowanie,   zarządzanie transakcjami i bezpieczeństwo często znajdują zastosowanie   składniki, których podstawową odpowiedzialnością jest coś innego. Ten system   usługi są powszechnie określane jako kwestie przekrojowe, ponieważ   mają tendencję do przecinania wielu komponentów w systemie.


5
2018-04-24 15:23





Skopiowano z duplikatu dla kompletności (Buzzer):

Atrybuty klasy i metody w .NET są formą programowania aspektowego. 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).


4
2017-10-28 03:52





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

Struktura AOP Spring (ang. Aspect-oriented programming) 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.

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


3
2018-02-14 20:59



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


AOP to sposób na lepszą modularyzację aplikacji pod kątem funkcjonalności, która obejmuje 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.


1





AOP można wykorzystać do wykonywania działań, które nie są związane z logiką biznesową Twojej aplikacji, np. Rejestrowaniem, buforowaniem itd. Działania te można umieścić w oddzielnej części aplikacji, a następnie ponownie wykorzystać 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 wykonaj kod przed wywołaniem wywołań metody saif.

Programowanie zorientowane na aspekt (AOP) w .NET Core i C # przy użyciu AutoFac i DynamicProxy


1