![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 175 Pomógł: 17 Dołączył: 23.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Witam
Na tyle ile możliwości ma PHP w tej dziedzinie napisałem własną wersję klasy Singleton dla wzorca Singletonu, zamieszczając ją tutaj na forum chciałbym uzyskać troche opinii i propozycji odnośnie mojego rozwiązania (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Gdzieś czytałem, że nie zaleca się rozpoczynać nazw metod od dwóch podkreślników, gdyż koliduje to z ogólnie przyjętym schematem nazewnictwa metod magicznych oraz konstruktora i destruktora w PHP. Jeśli też tak uważacie, proszę o propozycję ładnej nazwy angielskiej tejże metody (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Przykład użycia:
Pozdrawiam Ten post edytował Ociu 8.06.2008, 15:34:00
Powód edycji: poprawiłem bbCode (ociu)
|
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 853 Pomógł: 25 Dołączył: 27.08.2003 Skąd: Katowice Ostrzeżenie: (0%) ![]() ![]() |
Moim zdaniem składnia typu Example::getInstance('Example') to programistyczne masło maślane. Równie dobrze moge wywołać Singleton::getInstance('Example') czy też Example::getInstance('jakakolwiek klasa'). Uważam, że trzeba się pogodzić z tym, że PHP (w wersji < 5.3) przy wywoływaniu metod statycznych odwołuje się do ojca, a nie dziecka i w klasach pochodnych ponownie definiować getInstance() itp. albo po prostu używać np. rejestru Registry::getInstance('class name') czy czegoś w tym stylu (i spokojnie czekać na PHP 5.3). Właściwie Twoje rozwiązanie przypomina bardziej wzorzec Registry ;-)
Po co __initialize? w tym celu jest __construct przecież. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 175 Pomógł: 17 Dołączył: 23.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
No właśnie, to czekanie jest najgorsze, a do tej pory trzeba sobie jakoś radzić (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Czemu __initialize? Generalnie może zdarzyć się tak, że mimo to iż dziedziczę po wzorcu Singleton (może nie koniecznie bezpośrednio, ale w którejś podklasie z kolei) może się zdarzyć tak, że przypadkowo przeładuje konstruktor na publiczny, a jest to możliwe. Szkoda, że nie ma w PHP wymuszenia używanego dostępu do zmiennej bądź klasy (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ten problem postanowiłem więc rozwiązać w taki sposób jak widać. Innym ciekawym rozwiązaniem byłoby zastosowanie AspectPHP, gdyby to istniejące projekty byłyby zadowalająco dobrze napisane, a tak to trzeba się męczyć. Dzięki AspectPHP taki Singleton możnaby uzyskać automatycznie. Dość interesującym projektem jest wtyczka do Eclipse - APDT, która bazuje trochę na PHPAspect (chyba napisana przez tych samych autorów) lecz PHPAspect jest napisany w PHP i niestety nie grzeszy wydajnością. A wracając do APDT, jest to projekt, który jeszcze nie wyszedł po za repozytoria SVN, jednak zapowiada się wspaniale (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 246 Pomógł: 31 Dołączył: 13.11.2006 Skąd: się znamy? Ostrzeżenie: (0%) ![]() ![]() |
Jeśli tworzysz sobie klasę abstract Singletona rozumiem, że będziesz jej używał gdzie się da? Tylko niestety singleton przeczy zasadą OOP, tworzy niepotrzebne "węzełki" w kodzie. Popracuj nad workflow obiektów a nie twórz takie potworki.
Jestem też ciekaw co Ci daje wywołanie zdefiniowanej funkcji w konstruktorze kiedy nie ma ona żadnego dostępu do metod i parametrów klasy. Przemyśl dobrze co napisałeś. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 175 Pomógł: 17 Dołączył: 23.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Jestem też ciekaw co Ci daje wywołanie zdefiniowanej funkcji w konstruktorze kiedy nie ma ona żadnego dostępu do metod i parametrów klasy. Przemyśl dobrze co napisałeś. Czy mógłbym Cię prosić o rozwinięcie swojej myśli? Chciałbym być pewien tego co rozumiem z Twojej wypowiedzi (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Z góry wielkie dzięki za poświęcony czas. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 246 Pomógł: 31 Dołączył: 13.11.2006 Skąd: się znamy? Ostrzeżenie: (0%) ![]() ![]() |
Czy mógłbym Cię prosić o rozwinięcie swojej myśli? Chciałbym być pewien tego co rozumiem z Twojej wypowiedzi (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Z góry wielkie dzięki za poświęcony czas. Ok, źle przeczytałem kod. Ale nadal nie widzę sensu dla metody __initialize. Skoro nie pozwalasz nadpisać __construct, tym samym nadpisujesz __initialize to jest on tu tylko niepotrzebnym mostem. Rozumiem ochronę konstruktora jeśli byłoby tam coś jeszcze ale tu... W dodatku wymuszasz istnienie metody __initialize a jednocześnie nie ma tu żadnego interface'u. Konstruktor jest właściwą metodą do inicjacji. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 175 Pomógł: 17 Dołączył: 23.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Wiesz, specjalnie nie tworzylem abstrakcyjnej metody __initialize, bo pewnie nie zawsze bedzie mi potrzeba zrobic cos podczas powolywania obiektu do zycia. Z drugiej strony... chyba jednak pasowaloby dac to slowko abstract przed __initialize (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
A piszac bardziej profesjonalnie, rzeczywiscie jest tak, ze do inicjacji jest konstruktor, tylko dla mnie problemem jest to, ze moge sobie w klasie pochodnej zmienic uprawnienia konstruktora (przypadkowo), np. na publiczne i szlag by trafil Singletona. Nie znam sposobu w PHP (i chyba ogolnie tak w OOP sie nie da), zeby wymusic na klasach pochodnych przeladowywanie konstruktora na konkretny sposob dostepu do niego (public, protected, private). Co radzisz mistrzu? (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) |
|
|
![]()
Post
#8
|
|
Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
Co do __initialize to sie zgadzam, i mozna tak robic, z wyzej wymienionych powodow [wzorzec templateMEthod, + nie mamy mozliwosci nadpisania konstruktora w podklasach].
A klasa jako ogol - totalny bezsens, singleton to zlo, i jest zaprzeczeniem OOP, to jest po prostu global ukryty w klasie. Ze wszystko ma byc singletonem? masakra. W moim FW + libie do DB jest.... 1 singleton, ciezko bylo by mi sie bez niego obejsc, jest to glowna klasa biblioteki baz danych, przez ktora pobieram bierzace polaczenie z baza. Niby mozna to inaczej zrobic, ale skonczy sie na $user = $this->DB_manager->newInstanceForClass( 'User' ); ktore przekaze instancje polaczenia. Gore wziela wygoda pisania niz calkowicie czyste oop (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 175 Pomógł: 17 Dołączył: 23.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Generalnie, rzeczywiscie niewiele byloby klas, ktorych instancji nie chcielibysmy miec wiecej niz jednej. Do takich klas możnaby wg mnie zaliczyc klase do obslugi bazy danych, do obslugi sesji, do obslugi autoryzacji, do obslugi systemu szablonow, do obslugi bledow (set_error_handler), itp.
Tak więc, czy ktoś zrobi sobie klasę do tego typu przypadków, czy po prostu utworzy odpowiedni interfejs, to już chyba zależy od indywidualnych potrzeb. Nawet w książkach o zaawansowanym programowaniu w PHP często pojawia się wzorzec Singletonu i nie jest on w żaden negatywny sposób krytykowany, jest to więc wzorzec powszechnie używany nawet przez zaawansowanych programistów. Co czasem jest niezgodne z OOP nie znaczy, że jest bez sensu i do kitu, prawda? A jak się widzi użycie interfejsu iSingleton (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 246 Pomógł: 31 Dołączył: 13.11.2006 Skąd: się znamy? Ostrzeżenie: (0%) ![]() ![]() |
Przeczytaj sobie to: http://blog.dywicki.pl/2007/02/01/singleton/
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 175 Pomógł: 17 Dołączył: 23.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
W takim razie, czy zamiast tego, można używać wzorca rejestru? Czy to też taki anty-wzorzec?
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 28.09.2025 - 02:46 |