Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 22 Next »

Funkcje ułatwiają wykonywanie często wykonywanych operacji, takich jak np. sumowanie wartości. Zapobiega to wielokrotnej duplikacji kodu. Funkcje powinny być niezależne oraz jak najbardziej ogólne i elastyczne (możliwość wykorzystania ich w jak największej liczbie przypadków).

System pozwala na rejestrowanie i wykorzystywanie predefiniowanych funkcji zarówno po stronie serwera jak i po stronie przeglądarki.

Spis wbudowanych funkcji systemowych dostępny jest na stronie: Spis dostępnych funkcji

Rejestracja funkcji

Funkcja musi zawsze być zarejestrowana po stronie serwera oraz może dodatkowo być zarejestrowana po stronie przeglądarki, gdy chcemy, aby była też tam wykorzystywana.

Rejestracja na serwerze

Rejestracja funkcji dostępnych w systemie odbywa się podczas uruchomienia systemu oraz dynamicznie dla dynamicznych zasobów, takich jak wtyczki. Za rejestrację i przechowywanie funkcji odpowiada FunctionRegistry. Podczas rejestracji wyszukiwane są najpierw wszystkie klasy oznaczone adnotacją @Functions, następnie w tych klasach wyszukiwane są metody oznaczone adnotacją @Function i zostają one zarejestrowane jako funkcje.

Poniższy przykład przedstawia definicję prostej funkcji zwracającej wartość wyższej liczby.

@Functions
public class BasicFunctions
{
    @Function
    public Integer maxOf( Integer a, Integer b )
    {
        return Math.max( a, b );
    }
}

Zarejestrowana funkcja posiada nazwę, zwracany typ oraz definicję parametrów -> Function.

Rejestracja po stronie przeglądarki

Używanie stworzonej funkcji po stronie przeglądarki (na formularzu zadania) wymaga od programisty dostarczenia jej implementacji w języku JavaScript. Taka implementacja wykorzystywana jest podczas dynamicznych obliczeń po stronie przeglądarki klienta.

Funkcje rejestrowane są z wykorzystaniem API PW.fn.Functions (skrócona nazwa PW.Functions):

// funkcja "max" która zwraca obiekt typu "float" i przyjmuje 2 parametry typu "float"
PW.Functions.register("max", "float", ["float", "float"], function(value1, value2){
	return Math.max(value1, value2);
});
 
// funkcja "upper" która zwraca obiekt typu "string" i przyjmuje 1 parametry typu "string"
PW.Functions.register("i[[er", "float", ["float"], function(text){
	return text.toUpperCase();
});

Podczas rejestracji funkcji niezbędne jest zdefiniowanie:

  • nazwy (można zarejestrować wiele funkcji o tej samej nazwie ale musza mieć one inne typy parametrów)
  • typu zwracanej wartości
  • typów parametrów
  • implementacji funkcji

Tak zarejestrowana funkcja zostanie wywołana tylko dla wywołań z argumentami które będą pasowały do zdefiniowanych typów (albo będą tego samego typu albo mogą zostać przekonwertowane).

Oczywiście tak przygotowany skrypt musi zostać wstrzyknięty w obszar formularza zadania. Więcej o wstrzykiwaniu skryptów tutaj.

Funkcje ogólne

Jeżeli podczas rejestracji funkcji nie zdefiniujemy typów parametrów, to funkcja będzie traktowana jako implementacja ogólna. Taka implementacja zostaje wywołana jeżeli nie będzie żadnej innej implementacji funkcji, która może zostać wywołana z aktualnymi parametrami. Parametry przekazane do takiej funkcji są instancjami klasy PW.component.Arg.

// brak zdefiniowanych typów
PW.Functions.register("isVariable", "boolean", function(arg1){
	// arg1 jest obiektem klasy PW.component.Arg
	return !arg1.isArray && arg.value.is("variable");
});

Funkcje ogólne tworzone dla każdej funkcji, która z definicji działa na danych dowolnego typu. Przykładem takiej funkcji systemowej jest funkcja eq.

Rejestracja we wtyczce

Rejestracja funkcji we wtyczce jest taka sama jak zostało to opisane powyżej, jednak należy dodatkowo zaznaczyć, że wtyczka ta udostępnia funkcje do zarejestrowania. W tym celu należy w pliku suncode-plugin.xml dodać wpis:

<functions key="functions" />

Taki wpis spowoduje automatyczne wyszukanie wszystkich zdefiniowanych funkcji.

  • No labels