Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Czy warto tworzyć menedżer zasobów jako singleton?

Ostatnio zmodyfikowano 2013-06-04 21:54
Autor Wiadomość
Boromir
Temat założony przez niniejszego użytkownika
[C++] Czy warto tworzyć menedżer zasobów jako singleton?
» 2013-06-04 01:07:09
Wiele razy słyszałem, że singleton to antywzorzec. Używałem go często do implementacji menadżera zasobów, ale ponoć jest to złe. Ciekawi mnie, czy jest jakaś realna alternatywa na przyjemne i poprawne zaimplementowanie menadżera zasobów tak aby nie trzeba było się bardzo męczyć z jego przesyłaniem. Chciałem napisać projekt bez menadżera w postaci singletona i jest coraz więcej komplikacji.

C/C++
class Zarowka {
};

class Lampka {
    Zarowka mojaZarowka;
};

class Biurko {
    Lampka mojaLampka;
};

Teraz, aby ustawić teksturę żarówki musiałbym przesyłać wskaźnik bądź referencję przez 3 klasy. Aktualnie w ramach pełnej elastyczności klasa żarówka ma ustawianą teksturę funkcją:

C/C++
void Zarowka::ustawTexture( const Textura & tx );

Dzięki czemu żarówka nawet nie wie, że istnieje coś takiego jak menadżer zasobów a kod jest bardziej uniwersalny. Aczkolwiek, gdyby klasa miała sama z siebie zmieniać teksturę to musiałaby pamiętać wskaźnik na menadżer zasobów. Co wydaje mi się gorszą zależnością, niż dostęp do menadżera zasobów przez singleton.

Wygoda płynąca ze swobodnego dostępu do menadżera zasobów jest wielka, jednak spotkałem się z opiniami, że jest to zła praktyka programistyczna a singleton nie jest niczym innym jak ukrytą zmienną globalną, których należy unikać. Jak to wygląda w przypadku menadżera zasobów? Czy użycie singletona jest usprawiedliwione i poprawne (logicznie, złożonościowo, przenościosnowo)?

P-84793
DejaVu
» 2013-06-04 20:43:22
Użyj singletona ;p Ja też często i gęsto używam singletona do zasobów wspólnych. Tak się robi, to się sprawdza, a Ci, co twierdzą żeby go nie używać pewnie sami niewiele kodu w życiu pisali.

/edit:
A jak nie chcesz mieć za dużo problemów dostępem do zasobów to zrób interfejs i napisz funkcję:
C/C++
class IManager
{
public:
    virtual ~IManager() { }
    //...
};

IManager & manager();

C/C++
//jakiś tam header
class CManager
    : public IManager
{
    //...
};

Później gdziekolwiek możesz napisać implementację funkcji manager, choć w większości przypadków jej implementacja sprowadzi się do:

C/C++
//jakiś tam plik *.cpp
IManager & manager()
{
    return CManager::getSingleton();
}
P-84864
Boromir
Temat założony przez niniejszego użytkownika
» 2013-06-04 21:54:28
Dzięki. Rozwiałeś moje wątpliwości :)
P-84881
« 1 »
  Strona 1 z 1