Chodzi mi o to, że czytałem kiedyś artykuł o użyciu singletonów w JS (z resztą, w PHP jest ten sam problem). Prawidłowy (kanoniczny) singleton jest obiektem, który jest instancją klasy, a różni się od nie-singletona tylko tym, że jest jedyną dopuszczalną instancją, co może zostać wymuszone jego własnym kodem.
Bardzo nie podoba mi się ta idea, bo wydaje mi się sztuką dla sztuki - tzn programistyczne wymuszanie na klasie, żeby dopuszczała tylko jedną instancję. Jeśli nie potrzebuję więcej niż 1 instancji - to ich nie tworzę! Nie mogę zakładać, że mojej klasy będzie używał idiota do nie wiadomo czego. Programowanie polega chyba na pisaniu rzeczy do konkretnych celów, znaczy się... deterministic

Wracając jednak do tych moich JSON-ów jak je nazwałem, a dokładniej i ściślej są to chyba object literale - to nie jest sztuka dla sztuki, tylko piękne i łopatologiczne uproszczenie całej masy rzeczy. Weźmy tak - mam liba, który zajmuje się interfejsem AJAX-owym. Wyświetla kręciołki, okienka, statusy, uaktualnia rzeczy itede... Mój interfejs aplikacji ma kilka stałych punktów, żeby user nie musiał za każdym razem szukać wzrokiem czy myszką, po prostu pewne rzeczy są na swoich miejscach. Logiczne jest, że odwołuję się do tego przez wspólny obiekt, wspólnego liba, ściślej - jest to grupa funkcji wewnątrz pewnej przestrzeni nazw, zdefiniowanych jako object literal.
Ma to sens, podobnie jak np Math. Nie muszę tworzyć instancji Math żeby używać Math.PI. Dalszy sens jest taki, że maksymalnie skraca wywołanie. Z dowolnego miejsca kodu piszę costam.fn(). Najszybciej, najkrócej. W php costam::fn(). Mało tego, piszę costam, a NetBeans czy KomodoEdit od razu pokazuje mi ładną listę wszystkiego co może costam. Owszem, jest to programowanie strukturalne, ale vide Math w JS - w OOP używa się tego też i basta, chyba właśnie po to jest wzorzec singletona, czy może się mylę?
I teraz samo sedno mojego pytania: o co chodzi w tych całych singletonach, gdzie autorzy tutoriali pokazują, jak za wszelką cenę nie wolno stworzyć "klasy statycznej", tylko dynamiczny obiekt, następnie utworzyć jego instancję, a potem dopilnować, żeby mogła utworzyć się tylko jedna! PO JAKIEGO GRZYBA, JA SIĘ PYTAM BO SERIO NIE ROZUMIEM!
Programuję od kilku lat, mam dziesiątki jak nie setki tysięcy linii kodu w PHP i JavaScript za sobą, a tego jak nigdy nie rozumiałem, tak nie rozumiem.
W PHP oczywistym jest dla mnie:
Kod
class krowa {
public static function mu() {
}
}
i odwołanie się do tego via:
Kod
krowa::mu();
niż jakieś udziwnienia typu (pominę już tworzenie klasy, wrzucę tylko wywołanie):
Kod
krowa::getInstance()->mu();
Chodzi o stan obiektu? Jeśli obiekt jest singletonem, jaka jest różnica pomiędzy stanem w zmiennych statycznych, a zmiennych jedynej instancji? Chodzi o to, że wewnętrzna implementacja w C kompilatora jakoś inaczej to wykonuje?
Przez jakiś czas myślałem, że coś jest ze mną nie tak, dopóki nie przeczytałem kilku ciekawych artów o JS, gdzie object literale były przedstawione jako zupełnie normana i nawet polecana technika. Widziałem je też w samym jQuery i kilku niezłych wtyczkach do niego.
Po cóż więc singletony z nieszczęsnym getInstance?

Czyżby kaprys programistów przyzwyczajonych do języków, w których nie da się zdefiniować klasy statycznej lub object literala?