Programowanie aspektowe
Motywacją do rozwoju programowania aspektowego jest obserwacja, że w programach pojawiają się elementy dwóch typów:
- elementy dające się hermetyzować w jednostki o ściśle określonej funkcjonalności, dobrze oddzielone od innych (realizowane poprzez komponenty, klasy, a także funkcje)
- elementy, które „przecinają” (cross-cut) jednostki hermetyzacji, określające pewien aspekt całej grupy jednostek hermetyzacji, aspekt który powinien być jednakowo traktowany we wszystkich grupach
Przykładami aspektów są np.: organizacja dostępu do pamięci, organizacja komunikacji między komponentami, synchronizacja komponentów, zagwarantowanie bezpieczeństwa, obsługa awarii i błędów, optymalizacja.
Sposobem realizacji programowania aspektowego jest wprowadzenie do jednostek hermetyzacji danego języka programowania możliwości modyfikacji określonego aspektu danej jednostki. Sposobem osiągnięcia tego celu jest np. wprowadzenie punktów łączenia (join points) – miejsc gdzie modyfikacja jest możliwa.
Drugim mechanizmem jest możliwość kontroli danego aspektu dla całej grupy jednostek hermetyzacji:
- odpowiedni język umożliwia wyrażenie działań (advices) realizowanych w momencie osiągnięcia punktu łączenia w dowolnej jednostce hermetyzacji
- faktyczne wykrycie punktów łączenia i realizacja przewidzianych działań dokonywane jest często w trakcie wykonania kodu (wymaga to współpracy środowiska wykonania)
Przykład w AspectC++
#include<cstdio>
aspect Tracing{
// wyświetla nazwę funkcji przed jej wykonaniem
advice execution („% ...::%(...)”) : before () {
std::printf („in %s\n”, JoinPoint::signature ());
}
}
Programowanie aspektowe jest realizowane na dzień dzisiejszy przez rozszerzenia istniejących języków programowania (np. AspectJ dla Javy i co najmniej 50 innych dla innych języków i środowisk, np. .NET). Programowanie aspektowe staje się dostępne w coraz większej liczbie środowisk wykonywania oprogramowania.
Programowanie aspektowe jest związane z inną cechą oprogramowania: mechanizmem refleksji, za pomocą którego program może modyfikować swoje własne zachowanie w trakcie wykonania. Programowanie aspektowe wprowadza szereg nierozwiązanych jeszcze problemów związanych np. z wydajnością i bezpieczeństwem kodu.