Wymiana danych pomiędzy obiektami.

0

Mamy przykładowo takie dwie klasy, z których korzystam oraz, które przekazuję
pewnemu modułowi aplikacji.

file
	- name : string
	- size : size_t

	+ getName() : string
	+ setName(n : string)
	+ getSize() : size_t
	+ setSize(s : size_t)

userAccount

	- login : string
	- pass : string

	+ userAccount(login, pass)

	+ getLogin() : string
	+ getPass() : string

Zadaniem tego tajemniczego modułu jest coś zrobić z danymi, mniejsza o to co.
Moduł ten wymaga za każdym razem przekazania do niego pewnych danych obiektu
userAccount oraz ewentualnie pewnych danych z obiektu file. Dodatkowo ten
moduł zależnie od tego co chcemy, aby wykonał musi ustawić w tych klasach
różne pola. Oczywistym jest, że moduł musi znać interfejs tych klas i właśnie
to mnie martwi, ponieważ oprócz tego modułu kilka klas także korzysta z obiektów
tych klas, ale do niczego tym innym klasom nie są potrzebne settery oraz co
gorsza drobna zmiana w wymaganiach tego tajemniczego modułu co do tych klas
może pociągnąć za sobą zmiany w znacznej części kodu. Nie wiem jak mogę bardziej
elastycznie rozwiązać wymianę informacji pomiędzy częścią kodu korzystającą
z tych klas, a tym modułem. Może jakaś klasa pośrednicząca, do której bym
wrzucał informacje, które mam przekazać temu modułowi oraz do której przekazywał
bym wskaźniki na pola, które ma ustawić. Oprócz przekazywania wskaźników
musiałbym wtedy także przekazać pośrednikowi typ bufora, na który wskazuje,
więc nie wiem czy to jest najlepsze rozwiązanie. Zależy mi po prostu na tym,
aby ta aplikacja była bardziej elastyczna.

Jeszcze jedno, ograniczyłem publiczny interfejs tego modułu do takiej funkcji:

bool doRequest(RequestType, void*, void*)

Gdzie RequestType to zwykły enum określający jakie zadanie chcemy wykonać,
a te dwa wskaźniki void* to miejsca na userAccount i File, ponieważ tak
jak wcześniej powiedziałem nie zawsze muszę przekazywać obiekt File.

edit: Cóż chyba nie będę kombinował i deleguję po prostu zadania tego modułu
do klasy file i userAccount, czyli dodam metody:
getData
setData
do kazdej z tych klas, tak aby ten moduł sobie korzystał tylko z tych metod, w razie
jakiejś zmiany w tych klasach nie będę musiał wtedy zmieniać modułu.

W każdym razie temat cały czas aktualny, jak ktoś ma inny pomysł rozwiązania
takiej 'komunikacji' to jestem otwarty na propozycje ;)

0

Cześć,
strasznie to zagmatwane, 3 razy czytałem, ale chyba już rozumiem:

masz:
klasę file oraz userAccount
"tajemniczy moduł", który modyfikuje pola tych klas
inne klasy, które tylko odczytują pola tych klas

chcesz:
uniezależnić "tajemniczy moduł" od interfejsu tych klas - zmiana modułu nie zmieni tych - współużytkowanych - klas
usunąć publiczne settery z tych klas - zeby nikt inny (oprocz "tajemniczego") nie mogl zmieniac pól.

Proponuję takie rozwiązanie:
Stwórz sobie klasę FileModifier oraz AccountModifier, zgodnie ze wzorcem projektowym Dekorator.
Udekoruj klasy file i account odpowiednimi setterami.
Zadeklaruj przyjaźń klasy file z FileModifier i account z AccountModifier. Dzieki temu bedzie mozliwe dzialanie setterow na prywatnych polach.

teraz:
Twoje klasy-modyfikatory udostepniaja interfejs do edycji pól klas account i file, jednocześnie izolują "tajemniczy moduł" od interfejsu tych klas.

Pozdrawiam ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1