trzewiczek info



27.09.2010 kod:blog
Setter/Getter w ChucKu
Temat setterów i getterów jest w programowaniu obiektowym powszechny. Sam ChucK pozwala na bardzo ładną ich implementację, z którą spotykamy się w ChucKu dosłownie na każdym kroku.

Przypuśćmy, że mamy klasę jakiegoś playera, który w jakiś niezwykle ciekawy sposób odtwarza dla nas pliki dźwiękowe. Jedną z jego zmiennych jest referencja do buffora (SndBuf) obsługującego plik dźwiękowy. Chcielibyśmy przygotować fajnego settera i gettera dla tej zmiennej. No to proszę:

public class Player
{
    SndBuf _buffer;
    // najpierw setter
    fun SndBuf buffer( SndBuf buf )
    {
        // jakiś kod settera
    }
    // teraz getter
    fun SndBuf buffer()
    {
        // jakiś kod gettera
    }
}

Z dowolnego miejsca w programie możemy skorzystać z nich w następujący sposób:

SndBuf buf1, bu2;
Player player;

buf1 @=> player.buffer;
player.buffer() @=> buf2;

Fajne, bo pozwala na korzystanie w obu przypadkach z jednej nazwy, która z jednej strony niewiele różni się od bezpośredniego odwołania do zmiennej, ale z drugiej strony pozwala na zachowanie zasad bezpieczeństwa dzięki setterom i getterom. Technika ta stosowana jest w ChucKu na każdym kroku.

Pytanie brzmi: Po co nam w setterze SndBuf, jako typ zwracanej wartości, skoro to setter?! ChucK jest bardzo zaskakującym językiem i okazuje się, że typ zwracanej wartości musi się zgadzać pomiędzy przeciążanymi funkcjami. Nie wiadomo, po co, bo przecież typ zwracany nie wchodzi de facto w skład sygnatury funkcji. Z tego jednak powodu obie funkcje muszą mieć możliwość zrócenia typu zmiennej, dla której służą jako setter i getter.

Warto zwrócić jeszcze uwagę na to, że taka implementacja możliwa jest dlatego, że ChucK przeciąża operator => na potrzebu wywołań funkcji. Z tego powodu jest równoznaczne, w który z dwóch poniżej podanych sposobow funkcja zostanie wywołana.

SndBuf buf1, bu2;
Player player;

// tradycyjnie
player.buffer( buf2 );

// chuckowo
buf1 @=> player.buffer;

No i tak. Praując na codzień w ActionScripcie, który nie pozwala na przeciążanie funkcji, przygoda z ChucKiem staje się oddechem świeżego powietrza.
N E W S