![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 53 Pomógł: 1 Dołączył: 28.09.2007 Skąd: Gdynia Ostrzeżenie: (0%) ![]() ![]() |
Zrobiłem sobie klasę AJAX, będącą zestawem narzędzi i mającą jakieśtam swoje właściwości (do konfiguracji). Utworzyłem ją jako zwykły obiekt, będący zmienną globalną mniej więcej tak:
Kod var AJAX = { property1 : null, property2 : null, method1 : function() { ... } } Odwołuję się do niej prosto: AJAX.method1(); . Komodo Edit daje prawidłowe podpowiedzi do właściwości i metod. Co więcej, w środku utworzyłem więcej modułów JSON, tak że mogę odwoływać się do nich per AJAX.module1.method1(). Wszystko pięknie. Prawie dokładny odpowiednik klasy statycznej w PHP. Nawet lepiej, bo to klasa która może zawierać inne klasy. Moduł składający się z modułów. Git. W takim razie po co używać singletonów? Co one mogą, czego nie może moduł JSON? Zrobiłem pełną edycję poprzedniego posta, bo nikt chyba nie złapał o co mi w ogóle chodzi. Ten post edytował pp-layouts 1.12.2009, 00:23:12 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 53 Pomógł: 1 Dołączył: 28.09.2007 Skąd: Gdynia Ostrzeżenie: (0%) ![]() ![]() |
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 (IMG:style_emoticons/default/smile.gif) 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? (IMG:style_emoticons/default/smile.gif) Czyżby kaprys programistów przyzwyczajonych do języków, w których nie da się zdefiniować klasy statycznej lub object literala? |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 332 Pomógł: 294 Dołączył: 12.10.2008 Skąd: Olkusz Ostrzeżenie: (0%) ![]() ![]() |
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! pogrubiłem i podkreśliłem - w zasadzie nie zauważyłeś, ale sam sobie odpowiedziałeś na pytanie - tworząc dynamicznie obiekt dynamicznie a nie od razu przydzielasz mu dynamicznie miejsce w pamięci, gdzie niby pierwsze wywołanie będzie odrobinę wolniejsze gdyż tego obiektu nie ma jeszcze w pamięci (w zasadzie nie zauważalna różnica), jednak jeśli np. bibliotekę masz b.dużą i masz jeszcze szereg być może potrzebnych i podobnych do siebie klas - zwracających to samo jednak muszą być inne bo to będzie zależało od sytuacji - ta sama struktura, te same metody - aczkolwiek nie wgłębiając się choć metody mają te same dane wyjściowe to inaczej np. działają bo jedną klasą parsujesz np. csv a druga w konstruktorze przyjmuje plik xml (wiem - to już nie js - ale tak na szybko przykład) - w jakimś "sterowniku" decydujesz którą klasę użyć i przydzielasz jej w pamięci dynamicznie miejsce... podczas gdy klasy całe w sobie są statyczne to one już jakieś tam miejsce w tej pamięci zajmują... trochu tu odbiegam od singleton, ale nie zawsze też tej klasy np. się używa... i zazwyczaj moim zdaniem to po prostu zbiór metod (a raczej funkcji pogrupowanych tematycznie) gdzie potrzebna jest tylko jedna instancja - jest jakby bezpostaciowa ta klasa więc po co ma zajmować więcej pamięci przez kolejne jej obiekty?? - po za tym raczej go tworzą tak, żeby był też dostęp w wewnętrznych funkcjach/klasach - na co pozwalają statyczne metody, statyczny obiekt - ale po co on od razu ma istnieć w całości?? - skąd wiesz, że zawsze go użyjesz w każdej sytuacji?? ps. może inny temat ale ja JSON używam do pogrupowania tematycznie zmiennych, po za tym w samym JSON nie zrobisz w js zmiennych prywatnych i metod prywatnych - ale jest bardzo wygodny do zwracania metod publicznych oraz zmiennych publicznych - w js nie lubię pisać co chwila this.cośtam - wolę tu json'a który jest naturalnym językiem dla js... po za tym pisząc w json też możesz nadać instancje klasie... jakiś czas temu zadałem na forum tutaj pytanie i różnicy chyba nie ma - ja jej nie widzę i nikt mi nie odpowiedział: [JavaScript] Obiekty Ten post edytował zegarek84 10.01.2010, 13:46:25 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 16.10.2025 - 10:07 |