Obiecte constante (Immutable)
Definitie
Reprezinta o politica de manipulare a obiectelor, prin
care se interzice modificarea starii interne a acestora dupa ce ele au
fost create.
Sablonul Immutable este util in situatiile
in care anumite obiecte sunt accesate in comun de mai multe alte obiecte,
iar starea celor dintai este mai frecvent consultata decat modificata.
In asemenea situatii, problema cea mai serioasa este ridicata de realizarea
coordonarii accesului la obiectele partajate, mai ales daca citirea starii
si modificarea ei sunt efectuate in mod asincron.
Conform sablonului Immutable, un obiect
odata creat nu-si mai modifica starea interna; daca este necesara modificarea
starii, atunci se creaza un obiect cu noile valori ale starii.
Exemplu: intr-un
program de joc care implica plasarea si uneori miscarea unor piese pe campul
de joc, se poate adopta decizia de a folosi obiecte constante pentru a
reprezenta pozitia pieselor:
Se observa ca in clasa Position, pe langa constructor, apar doar metode de acces in citire a starii, precum si o metoda de creare a unei noi instante a clasei, dar nu exista nici o metoda de modificare a starii.
In limbajul Java clasa String este un exemplu
de aplicare a sablonului Immutable. Astfel, metode ca toLowerCase
sau substring, care determina o secventa de caractere pe
baza unui obiect String, returneaza noua secventa intr-un
nou obiect String.
Motivatii
Pentru a evita sarcina de a controla propagarea si sincronizarea
modificarilor starii unui obiect utilizat in comun de mai multi clienti,
se defineste obiectul respectiv ca obiect constant. Aceasta se realizeaza
prin includerea in clasa corespunzatoare doar a constructorilor si a metodelor
de acces in citire a starii.
Consecinte
Atunci cand se doreste modificarea starii unui obiect
constant, de fapt trebuie creata o noua instanta a clasei repsective, pasand
constructorului noile valori de stare.
Implementare
La implementare se aplica 2 reguli:
class Position {
private: int x, y; public: Position(int xx, int yy): x(xx), y(yy) { } int getX( ) { return x; } int getY( ) { return y; } Position offset(int xoff, int yoff) { return *(new Position(x+xoff, y+yoff)); } }; |
O varianta a sablonului Immutable
o reprezinta obiectul Read-only, utilizat atunci cand exista
cel putin o clasa client care trebuie sa modifice instantele unei clase
dupa ce ele au fost create. In acest caz se procedeaza astfel: se defineste
o interfata care contine doar metodele de consultare a starii, iar clasele
client obisnuite vor accesa obiectul read-only prin intermediul
acestei interfete; clasa client care trebuie sa modifice starea obiectului
il va accesa direct.
Tema
Se cere sa se aplice varianta Read-only Object
a sablonului Immutable pentru urmatoarea situatie: