Target-action

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

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.

Wady

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:

  • może zignorować warunek i wykonać nic
  • może rozważyć taki stan jako błąd, który najprawdopodobniej spowoduje nieoczekiwane zamknięcie programu lub wywołanie run-time exception.

Przykład w Cappuccino

AppController.j
@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

objective-j/design-patterns/target-action.txt · ostatnio zmienione: 2009/12/06 00:33 przez widmogrod
 
Wszystkie treści w tym wiki, którym nie przyporządkowano licencji, podlegają licencji: CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki