Zobrazit předchozí téma :: Zobrazit následující téma |
Používáte návrhový vzor singleton? |
Ano, celkem často. |
|
32% |
[ 8 ] |
Výjimečně. |
|
48% |
[ 12 ] |
Zásadně nikdy. |
|
20% |
[ 5 ] |
|
Celkem hlasů : 25 |
|
Autor |
Zpráva |
Houp
Založen: 28. 07. 2007 Příspěvky: 672
|
Zaslal: 29. srpen 2012, 19:27:40 Předmět: Kdy použít Singleton? K čemu ho využíváte? |
|
|
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 |
|
|
Houp
Založen: 28. 07. 2007 Příspěvky: 672
|
Zaslal: 29. srpen 2012, 19:31:01 Předmět: |
|
|
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 |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 29. srpen 2012, 19:42:21 Předmět: |
|
|
Jako logger, pak na VFS, manager alokace / dealokace objektů...
Jako pořád lepší singleton, než všechno nastřílet "public static" _________________ Perry.cz |
|
Návrat nahoru |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 29. srpen 2012, 19:53:38 Předmět: |
|
|
perry napsal: |
Jako logger, pak na VFS, manager alokace / dealokace objektů...
Jako pořád lepší singleton, než všechno nastřílet "public static" |
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 |
|
|
micky
Založen: 28. 02. 2008 Příspěvky: 348 Bydliště: Plzeň, Praha
|
Zaslal: 29. srpen 2012, 22:30:35 Předmět: |
|
|
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 |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 29. srpen 2012, 23:52:22 Předmět: |
|
|
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 |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 30. srpen 2012, 08:49:15 Předmět: |
|
|
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 |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 30. srpen 2012, 15:51:29 Předmět: |
|
|
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 |
|
|
Houp
Založen: 28. 07. 2007 Příspěvky: 672
|
Zaslal: 31. srpen 2012, 17:13:37 Předmět: |
|
|
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 |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 31. srpen 2012, 18:44:34 Předmět: |
|
|
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 |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 3. září 2012, 09:39:30 Předmět: |
|
|
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 |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 3. září 2012, 09:48:40 Předmět: |
|
|
]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 |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 3. září 2012, 09:52:42 Předmět: |
|
|
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 |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 3. září 2012, 09:58:53 Předmět: |
|
|
]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 |
|
|
Houp
Založen: 28. 07. 2007 Příspěvky: 672
|
Zaslal: 5. září 2012, 09:55:35 Předmět: |
|
|
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 |
|
|
|