Target-action (docelowa akcja) jest to paradygmat projektowania (wzór/przykład projektowania w jakiejś dziedzinie) w architekturze oprogramowania, w której program komputerowy jest podzielony na obiekty, które dynamicznie ustalają relacje przez przekazywanie sobie informacji, który obiekt powinny celować (target) i jaką akcję/wiadomość(action) wysłać to tego obiektu gdy pojawi się zdarzenie (event). Jest to bardzo przydatne przy implementowaniu graficznych interfejsów, których są z natury sterowane zdarzaniem (event-driven).
Rozważmy taki przykład (napisany w Objective-J):
[button setTarget: self]; [button setAction: @selector(doSomething:)];
Teraz kiedy przycisk identyfikowany z zmienną „button” jest naciśnięty, system spróbuje wysłać wiadomośc nazwaną „doSomething:” do obiektu w którym ten kod został wywołany.
Zalety tego podejścia w programowaniu zdarzeniowym (event-drive) umożliwia lepsze uporanie się z dynamizmem, w porównaniu z bardziej statycznymi podejściami, np. przez rozszerzanie (subclassing). To dla tego że subclassing jest relatywnie sztywnym sposobem programowania - programista musi polegać na między-połączeniowej logice w trakcie projektowania programu i później to nie może być zmienione (chyba że program zostanie zatrzymany, przeprojektowany i zbudowany ponownie). Z drugiej strony, programowanie bazujące na target-action może zmienić te połączenia całkowicie w trakcie działania programu, co pozwala programowi (samemu w sobie) tworzyć nowe wzajemne połączenia i całkowicie nowe zachowanie.
Ponieważ ekstremalny dynamizm i wolność zachowań danych programiście zaprojektowanych przez paradygmat target-action trzymany w umyśle, może się zdarzyć że projektant programu niewłaściwie zaimplementuje część logiki wewnętrznych połączeń i może to czasami prowadzić do trudności z wyśledzeniem błędu. Spowodowane jest to brakiem kontroli czasu kompilacji dostarczonej przez kompilator który nie może zobaczyć wewnętrznych połączeń. Ta kontrola gęstości (logiczności) wewnętrznych połączeń jest zostawiona całkowicie programiście. Wyniki źle połączonych target-action wiązań mogą różnić się w zależności od sposobu określonego systemu w którym program jest zaimplementowany w odniesieniu do tego:
@import <Foundation/CPObject.j> @implementation AppController : CPObject { } - (void)applicationDidFinishLaunching:(CPNotification)aNotification { // Tworzenie nowego widoku var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask], contentView = [theWindow contentView]; // Dodanie widoku do okna przeglądarki [theWindow orderFront:self]; // Utworzenie nowego przycisku w punkcie 0,0 o wymiarach 120x18px var button = [[CPButton alloc] initWithFrame: CGRectMake(0, 0, 120, 18)]; // Ustawienie tekstu na przycisku [button setTitle:"Kliknij mnie!"]; /** * Target-action * Po kliknięciu przycisku, akcja będzie przekazana do tego obiektu "self" tj. AppController * i zostanie wywołana metoda "clicked:" */ [button setTarget:self]; [button setAction:@selector(clicked:)]; // dodanie przycisku do widoku [contentView addSubview:button]; } - (void)clicked:(id)sender { // Zwraca zaznaczona zakładkę [sender setTitle:@"Zostałem kliknięty!"]; } @end
Źródło: Target-Action