spájame
slovenskú
IT komunitu
pridaj sa
Registrácia · Login
Marián Veselý

Marián Veselý


Overený používateľ, členom od 11.3.2012

(zatiaľ žiadne)

Marián Veselý nenapísal žiadne články/novinky

Marián Veselý napísal 1 komentár

0 0 Marián Veselý 2012-03-11 09:21:43
Aj keď je to už trochu stará diskusia, nedalo mi nepridať aj moju trochu do ohňa. Snáď to niekomu do budúcnosti pomôže. :)

@Marek:
Je celkom ťažké sa vyznať v tom, o čom hovoríš, lebo používaš prinajmenšom nezvyčajnú terminológiu. Keď hovoríš o "spustenom" objekte a "behu" inštancií, viac ako OOP to pripomína procedurálne programovanie a začiatočníkov (ktorým tento članok bol zrejme určený) to môže viesť k nesprávnej predstave. Objekty niesú procedúry, ale zaobalené dáta a tie sa nespúšťajú ale vykonávaš nad nimi operácie pomocou z vonku prístupného rozhrania (interface, pozostávajúci z metód).

Čo sa týka použitia Singletonu, požičiam si jednu vetu z už spomínaného php.net: "The Singleton ensures that there can be only one instance of a Class and provides a global access point to that instance." Ako vidíš, účel Singletonu je zabrániť existencii viacerých instancií jedinej triedy. To je hlavný význam tohto vzoru a žiaden iný. Častokrát som videl (hlavne php programátorov) používať Singleton pre databázové pripojenia. Keďže pripojenie chceme vytvoriť len raz, vložiť ho do konštruktoru a spraviť triedu ako Singleton (čo zaistí, že konštruktor sa zavolá maximálne raz) sa veľa ľudom zdá byť dobré riešenie. Toto môže byť aj súvislosť, podľa ktorej si usúdil, že sa používa na optimalizáciu. Niesom PHP programátor, takže neviem ohodnotiť ako dobrý alebo zlý je tento nápad, ale ak by si niečo také spravil pri písaní webového serveru, ktorý PHP interpretuje, skončil by si s jediným pripojením k databáze a server by nebol schopný obsluhovať viac požiadavkov ktoré pracujú s databázou súbežne (a taký server je nanič).

Druhá spomínaná vec v tej vete je "global access". Jediný rozdiel medzi globálnymi premennými a Singleton triedou prístupnou zovšadiaľ je, že globálne premenné ti znečistia namespace (ak ten pojem nepoznáš, viď http://en.wikipedia.org/wiki/Namespace_(computer_science)). Inak je to ale rovnaká záležitosť. Singleton ku ktorému môžeš pristupovať zovšadiaľ zanáša coupling (párovanie, viď http://en.wikipedia.org/wiki/Low-Coupling_/_High-Cohesion_pattern#Disadvantages) tried. To znamená, že ak chceš nejakú triedu oddeliť od programu a použiť inde, ale ona používa ten Singleton, musíš tento Singleton preniesť s ňou. Tomuto (a ďalším problémom) sa pri návrhu snažia všetci zabrániť a coupling minimalizujú.

Je škoda, že keď už si si požičal ukážku kódu pre Singleton z php.net, nepozrel si sa aj na to, čo je priamo pod ňou, a teda zvýraznené varovanie, že Singleton je dosť kontroverzný návrhový vzor. Môj skromný názor je snažiť sa mu vyhnúť vždy keď to ide (čo samozrejme nemusí byť vždy jednoduché).

@Neo:
Väčšinou sa ti niečo také nestane ak makáš na niečom v malom týme (povedzme do 10 ľudí). Akonáhle ale začneš mať niečo veľké, tak sa môže stať všeličo, od ľudí ktorý strkajú nos kam nemajú, až po potrebu niekoľkých instancií aj keď si to pri písaní tej triedy nepredpokladal. Preto sa často používa kontrola kompilátoru/interpreteru toho-ktorého jazyka, aby sa týmto problémom zamedzilo čo najskor.

@Milan
Pekne si prispieval, hlavne tie odkazy niesú zlé. :) Čo sa týka toho kedy Singleton nepoužiť, povedal by som, že prístup rôznych vláken súbežne je pre singleton pohroma. To isté platí o testovaní a ďalšia taká vec čo ma napadá je situácia, kedy je Singletony treba mazať a oni sú na sebe závislé nejakým nepekným spôsobom. Povedzme, že máš (vykonštruovaný prípad) Singletony Window, Logger a DatabaseManager. Niekde dojde k chybe a Logger to ma zapísať do databázy (DatabaseManager) a zároveň zobraziť dialóg ktorý musí patriť k oknu (Window). Čo ale ak k tejto chybe dojde vo Window po tom, čo sa DatabaseManager už zničil (prípadne opačná situácia)? Toto je ale skôr problém nízkoúrovňových jazykov a nie záležitostí ako PHP, Java alebo C#. Taktiež, ak by si niekedy písal framework, je možno lepšie sa od začiatku vyhýbať Singletonom, než ich odstrániť neskôr a donútiť užívateľov prekopávať tisícky riadkov kódu pri prechode na novú verziu.

Páčilo sa mi...

Zajtra.sk > Ľudia > Marián Veselý