.[ ČeskéHry.cz ].
Kdy použít Singleton? K čemu ho využíváte?
Jdi na stránku 1, 2  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné
Zobrazit předchozí téma :: Zobrazit následující téma  

Používáte návrhový vzor singleton?
Ano, celkem často.
32%
 32%  [ 8 ]
Výjimečně.
48%
 48%  [ 12 ]
Zásadně nikdy.
20%
 20%  [ 5 ]
Celkem hlasů : 25

Autor Zpráva
Houp



Založen: 28. 07. 2007
Příspěvky: 672

PříspěvekZaslal: 29. srpen 2012, 19:27:40    Předmět: Kdy použít Singleton? K čemu ho využíváte? Odpovědět s citátem

K tomuto tématu mě inspirovalo jiné téma zde. Používáte ho a případně k jakým účelům? (zkuste se zaměřit, kdy se hodí při vývoji her)
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Houp



Založen: 28. 07. 2007
Příspěvky: 672

PříspěvekZaslal: 29. srpen 2012, 19:31:01    Předmět: Odpovědět s citátem

Osobně si vedu jako singleton logger sloužící k debugování a resource manager pro načítání modelů, textur, fontů.

Co myslíte, je to vhodné použití tohoto návrhového vzoru?
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 29. srpen 2012, 19:42:21    Předmět: Odpovědět s citátem

Jako logger, pak na VFS, manager alokace / dealokace objektů...

Jako pořád lepší singleton, než všechno nastřílet "public static" Smile
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 29. srpen 2012, 19:53:38    Předmět: Odpovědět s citátem

perry napsal:
Jako logger, pak na VFS, manager alokace / dealokace objektů...

Jako pořád lepší singleton, než všechno nastřílet "public static" Smile


ono je to skoro to stejne - u singletonu je vyhoda, ze se to da rychleji napravit a uvest do stavu pro pouziti dvou instanci ...

pro hry si dokazu prave ony loggery, file-systemy apod. predstavit jako globalni
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
micky



Založen: 28. 02. 2008
Příspěvky: 348
Bydliště: Plzeň, Praha

PříspěvekZaslal: 29. srpen 2012, 22:30:35    Předmět: Odpovědět s citátem

Singleton pro globální nastavení (obalení nějakého datového souboru/souborů). Ohledně managerů textur, loggerů a tak dále se singletonu vyhýbám, přece jen může být víc loggerů nad víc vlákny apod.
_________________
https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 29. srpen 2012, 23:52:22    Předmět: Odpovědět s citátem

Singleton pro filesystem může být, protože 2 instance filesystemu z pohledu aplikace žádný systém nemá. Resource manager by neměl být singleton, protože je vždycky svázaný s renderovacím kontextem (tedy konkrétním oknem).

Každopádně vždycky se dá bez singletonu obejít.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Augi



Založen: 28. 07. 2007
Příspěvky: 782
Bydliště: Čerčany

PříspěvekZaslal: 30. srpen 2012, 08:49:15    Předmět: Odpovědět s citátem

Singleton coby návrhový vzor je dnes všeobecně považován za anti-pattern (podobně jako Service Locator) a jeho použití se doporučuje jen ve výjimečných případech, např. právě v případě logování.

Problém Singletonu je především ten, že zavádí globální stav, a že u třídy, která ho používá, to není zřejmé, protože to nelze vykoukat z hlaviček metod (člověk se musí podívat do implementace, aby viděl, že se sahá na nějaký globální objekt).

Zcela legitimní je ale singleton coby lifestyle/lifetime, tedy že existuje jediná instance dané třídy. Tuto instanci je ale vhodné předávat do všech objektů, tj. nevystavovat ji přes nějakou globální proměnnou! To umožní, že třídy, které jsou na této třídě závislé, dokáží existovat i v prostředí, kde je instancí více.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 30. srpen 2012, 15:51:29    Předmět: Odpovědět s citátem

Augi napsal:
Zcela legitimní je ale singleton coby lifestyle/lifetime, tedy že existuje jediná instance dané třídy. Tuto instanci je ale vhodné předávat do všech objektů, tj. nevystavovat ji přes nějakou globální proměnnou! To umožní, že třídy, které jsou na této třídě závislé, dokáží existovat i v prostředí, kde je instancí více.


jj tohle je asi nejzajimavejsi pouziti - tzn. pripravis engine na to, ze instanci muze byt vice, ale zaroven si ulehcis zivot na zacatku tim, ze udelas na pozadi jednu instanci pro vsechny.

az prijdes s tim ze je potreba to rozdelit, proste to jenom trasparentne rozdelis a cely kod je happy
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Houp



Založen: 28. 07. 2007
Příspěvky: 672

PříspěvekZaslal: 31. srpen 2012, 17:13:37    Předmět: Odpovědět s citátem

Nějak moc nevidím výhodu předávaného singletonu od použítí obyčejné třídy, nesingletonu? Píšete, že je to příprava na případné použití místo jednoho objektu, více objektů. Tak proč už to tak nepoužívat od začátku, že může být vytvořeno více objektů?

Myslel jsem, že jedna z hlavních výhod singletonu je nenutnost předávání si objektu jako parametru. (např. použití právě u logování)

Jinak jsem si ještě vzpomněl, že teď jsem použil singleton u trigger manageru. Ale tam už to asi ideální není. Jen upřednostňuji singleton před předávání objektu jako parametru do mnoha a mnoha tříd.
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Augi



Založen: 28. 07. 2007
Příspěvky: 782
Bydliště: Čerčany

PříspěvekZaslal: 31. srpen 2012, 18:44:34    Předmět: Odpovědět s citátem

Houp napsal:
Nějak moc nevidím výhodu předávaného singletonu od použítí obyčejné třídy, nesingletonu? Píšete, že je to příprava na případné použití místo jednoho objektu, více objektů. Tak proč už to tak nepoužívat od začátku, že může být vytvořeno více objektů?
Vtip je v tom, že když už předáváš nějakou instanci, tak ti je právě jedno, jestli se bude do všech tříd strkat jediná instance (~singleton) nebo různé instance.

Houp napsal:
Myslel jsem, že jedna z hlavních výhod singletonu je nenutnost předávání si objektu jako parametru. (např. použití právě u logování)
Ano, to je výhoda Singletonu, tj. jediné instance zpřístupněné přes nějaký globální objekt. A právě logging jakožto zástupce všudypřítomného cross-cutting concernu je pěkný příklad, kdy klasický Singleton může být výhodný, protože není třeba do všech tříd předávat odkaz na logovací objekt, což by byl omrd.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 3. září 2012, 09:39:30    Předmět: Odpovědět s citátem

Ano.. a ideálně bys měl ten Logger udělat hnedka vláknově bezpečný.

Co se týče předávání parametrů, myslím, že je to ve výsledku ještě příjemější a přehlednější, než všude psát C_Engine::getSingleton()... . Předáš si to třeba v konstruktoru objektu jen jednou a máš to.
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 3. září 2012, 09:48:40    Předmět: Odpovědět s citátem

]semo[ napsal:
Ano.. a ideálně bys měl ten Logger udělat hnedka vláknově bezpečný.

Co se týče předávání parametrů, myslím, že je to ve výsledku ještě příjemější a přehlednější, než všude psát C_Engine::getSingleton()... . Předáš si to třeba v konstruktoru objektu jen jednou a máš to.


tak tohle, ale zase neberu jako argument, protoze to resi

kód:
#define ENGINE C_Engine::getSingleton()


a uz muzes v pohode psat

kód:
ENGINE->Fn();
ENGINE->Fn2();
;
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 3. září 2012, 09:52:42    Předmět: Odpovědět s citátem

ok, máš recht..já se těmhle věcem vyhýbám, tak mě to nenapadlo
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 3. září 2012, 09:58:53    Předmět: Odpovědět s citátem

]semo[ napsal:
ok, máš recht..já se těmhle věcem vyhýbám, tak mě to nenapadlo


nerikam ze je to uplne pekne, dost casto je to spis nedoporucovane

ale par vhodne umistenych maker, dokaz zivot docela dost zjednodusit

C++ je hodne ukecanej jazyk ...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Houp



Založen: 28. 07. 2007
Příspěvky: 672

PříspěvekZaslal: 5. září 2012, 09:55:35    Předmět: Odpovědět s citátem

citace:
Co se týče předávání parametrů, myslím, že je to ve výsledku ještě příjemější a přehlednější, než všude psát C_Engine::getSingleton()... . Předáš si to třeba v konstruktoru objektu jen jednou a máš to.


a není stejné v přehlednosti místo předávání singletonu jako parametru konstruktoru v tom konstruktoru jednou zavolat :

kód:
engine = C_Engine::getSingleton();


A pak se chovat stejně jako by to bylo předáno?
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna