Przez kolejne trzy części kursu skupimy się na klasach (daruję sobie już cudzysłowy ;) ), które znacznie rozszerzają nasze możliwości użycia obiektu Class. Na początek wyjaśni się kwestia składni wielu elementów MooTools, które poznamy później - po części poświęconej programowaniu obiektowemu.

Składnia

W MooTools przy użyciu różnego typu klas takich jak klasy rodziny Fx czy Request bazują na takiej składni:

var obiektKlasy = new Klasa(parametr1, parametr2, {opcjeKlasy});

poszczególne parametry są z reguły obowiązkowe (poza opcjami). Jak zaimplementować tego typu składnię we własnej klasie ?

Przede wszystkim musimy dodać klasę Options do właściwości Implements:

var przykladowaKlasa = new Class({
    Implements: Options,
    //... dalszy kod klasy
});

Gdy już to zrobimy mamy możliwość zastosowania obiektu options, który zawiera spis opcji klasy wraz z ich domyślnymi wartościami:

var przykladowaKlasa = new Class({
    Implements: Options,
 
    options: {
        opcja1: "wartośćDomyślna",
        opcja2: true,
        //...
        opcjaN: {
            // obiekt z opcjami
        }
    }
});

I od razu mała uwaga - najlepiej nie stosować żadnych opcji zaczynających się od znaków "on" i następujących po nich dużej litery (odpadają zatem onClick, onLoad, onRetry, onSth i wszystkie inne zapisy w takiej postaci), gdyż jeżeli dodamy klasę Events to taka opcja automatycznie stanie się zdarzeniem danej klasy.

Mamy już listę opcji i ich domyślnych wartości - pora ich użyć. W tym celu jako pierwszy argument metody initialize przekazujemy obiekt options, a w samym kodzie tej metody wywołujemy metodę setOptions z obiektem options podanym jako argument:

var przykladowaKlasa = new Class({
    Implements: Options,
 
    options: {
        opcja1: "wartośćDomyślna",
        opcja2: true,
        //...
        opcjaN: {
            // obiekt z opcjami
        }
    },
 
    initialize: function(options){
        this.setOptions(options);
        // ...
    }
});

Teraz gdy utworzymy obiekt na podstawie takiej klasy:

var obiektTestowy = new przykladowaKlasa({
    opcja1: "test",
    opcja2: false
});

Możemy uzyskać bezpośredni dostęp do wartości tych opcji poprzez zapis:

obiektTestowy.options.opcja;

Oczywiście w kodzie samej klasy do opcji odwołujemy się poprzez zapis:

this.options.opcja;

Po co to nam w ogóle ?

Z pewnością komuś klasa Options może się wydać nieprzydatna, ponieważ wszystkie opcje można podać jako argumenty konstruktora klasy. W takim rozumowaniu jest trochę racji - dlatego jeżeli ktoś ma zamiar tworzyć klasy typu:

var przykladowaKlasa = new Class({
    Implements: Options,
 
    options: {
        opcja1: "wartośćDomyślna",
        opcja2: true
    },
 
    initialize: function(options){
        this.setOptions(options);
        // ...
    }
});

To niech to sobie od razu daruje - zamiast tego niech stworzy klasę postaci:

var przykladowaKlasa = new Class({
    initialize: function(opcja1, opcja2){
        if(!$defined(opcja1)) opcja1 = "wartośćDomyślna";
        if(!$defined(opcja1)) opcja2 = true;
        // ...
    }
});

Klasa Options jest niezwykle przydatna w sytuacji gdy mamy sporo opcji i zależy nam na tym by sama klasa była łatwa w użytku - dzięki Options nie musimy się martwić o kolejność argumentów, ich wartości domyślne, a dodatkowo potencjalny użytkownik klasy otrzymuje klarowny podział na wymagane argumenty konstruktora i jego opcjonalne argumenty (jak zresztą sama nazwa klasy na to wskazuje).

Tak więc klasa Options powinna stać się najlepszą przyjaciółką osób, które lubią pisać klasy z ogromną ilością opcji konfiguracyjnych ;)

Podsumowanie

Wiemy już jak dodawać opcje do tworzonych klas z użyciem MooTools 1.2 . W następnej części skupimy się na zdarzeniach klas czyli klasie Events.

Komentarze do wpisu "MooTools 1.2 - klasa Options":

1. Bigismall napisał(a):
24 lipca 2008, 12:18:32

Piszesz :
„W takim rozumowaniu jest trochę racji – dlatego jeżeli ktoś ma zamiar tworzyć klasy typu:”
....
„To niech to sobie od razu daruje – zamiast tego niech stworzy klasę postaci:”

Chodzi ci o to że nie ma sensu używać Options przy małej liczbie pól danej klasy ?

2. Dziudek napisał(a):
24 lipca 2008, 12:24:44

@Bigismall – no używanie Options dla klas, które na starcie potrzebują 4-5 argumentów jest bez sensu chyba, że naprawdę tylko dwa z nich są wymagane a podawanie reszty działa na zasadzie – czasami piąty, a czwarty i trzeci nie – wtedy można użyć Options dla wygody by nie podawać na siłę 2 argumentów dodatkowo, choć i tak sensowność użycia Options jest tu dla mnie sporna ;) W każdym razie warto pamiętać by nie stosować wszystkiego co popadnie, a naprawdę przemyśleć podczas projektowania klasy co jest rzeczywiście potrzebne, a co nie ;)

Dodaj komentarz:

Textile Lite włączony ( szczegółowy opis znaczników ):
*strong* | # lista numerowana | * lista wypunktowana | _em_ | __italic__ | "link":http:// | bq. cytat.