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 ;)