![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
Piszę sobie klasę do obsługi bazy danych i przyglądam się tak bardzo popularnemu wzorcowi singleton. Wszyscy jako przykład użyteczności tego wzorca podają przykład tworzenia instancji klasy do obsługi bazy, tzn połączenia z bazą. Zacząłem się zastanawiać gdzie jest sens, oczywiście w języku php. Zakładam, że mam taką klasę i w skrypcie łącze się z bazą danych, jeśli nie ma nawiązanego połączenia to tworzę obiekt tej klasy a jeśli jest to nie tworzę.
Wszystko jasne. Tylko gdzie jest sens stosowania tego w php. Przecież w skrypcie zazwyczaj tworzy się połączenie z bazą, wykonuje potrzebne operacje na bazie a po zakończeniu wywoływania skryptu, połączenie i tak jest zamykane automatycznie.. Więc jaki jest sens stosowania tego w php? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Przyjaciele php.pl Postów: 1 224 Pomógł: 40 Dołączył: 6.07.2004 Skąd: Wuppertal Ostrzeżenie: (0%) ![]() ![]() |
Singleton pozwala Ci uzyskać dostęp do obiektu w kazdym miejscu Twojej aplikacji. Nie wazne czy to uchwyt bazy danych, czy obiekt config czy cokolwiek co sobie wymyślisz.
Jeśli chcesz zrobić obiektową otoczkę Twojego korzystania z bazy danych najlepiej narysuj sobie schemat jaki obiekt ma za co odpowiadać. Ja generalnie stosowałem 3 obiekty. 1. DB_Connection - to był obiekt oparty właśnie o singleton, wewnątrz niego trzymałem uchwyt do db. Były tez tam 'logi' zapytań i inne pierdoły. 2. DB_Query - obiekt zapytania. Robiłem wtedy tak:
3. DB_Result - to co zwróciła funkcja execute, w zaleznosci od zapytania wiersze albo inne bajery. Singletona uzywalem w tym przypadku po to zeby mieć łatwy dostęp do połączenia z bazą. Dochodzi jeszcze kolejna kwestia, czy będziesz uzywać kilku baz danych na raz? bo jeśli tak - ja założyłem ze nie będę - to musisz inaczej zaprojektować swój system np.
Do tego powinienneś przemyśleć dodatkowo czy będziesz korzystał tylko z baz typu mysql? Jeśli nie wtedy DB_Connection powinno być interfejsem, a implementować i używać powinienneś DB_Connection_Mysql, DB_Connection_Pgsql itd... Jest bardzo duzo zależności, musisz sam wszystko przemyśleć, a wzorce to tylko sposób implementacji. Radze Ci lepiej zacznij od poznania problemu, a dopiero potem szukaj rozwiązania. Bo tutaj pytasz o pewien sposób użycia singletonu, a nie do końca jestem pewny czy wiesz do czego chcesz go użyć. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
Jeśli chcesz zrobić obiektową otoczkę Twojego korzystania z bazy danych najlepiej narysuj sobie schemat jaki obiekt ma za co odpowiadać. Ja generalnie stosowałem 3 obiekty. 1. DB_Connection - to był obiekt oparty właśnie o singleton, wewnątrz niego trzymałem uchwyt do db. Były tez tam 'logi' zapytań i inne pierdoły. 2. DB_Query - obiekt zapytania. Robiłem wtedy tak:
3. DB_Result - to co zwróciła funkcja execute, w zaleznosci od zapytania wiersze albo inne bajery. Singletona uzywalem w tym przypadku po to zeby mieć łatwy dostęp do połączenia z bazą. Moim zdaniem niepotrzebnie rozbijałeś to na 3 obiekty. Ja chcę zamknąć wszystko w jednej klasie. Dochodzi jeszcze kolejna kwestia, czy będziesz uzywać kilku baz danych na raz? bo jeśli tak - ja założyłem ze nie będę - to musisz inaczej zaprojektować swój system np.
Do tego powinienneś przemyśleć dodatkowo czy będziesz korzystał tylko z baz typu mysql? Jeśli nie wtedy DB_Connection powinno być interfejsem, a implementować i używać powinienneś DB_Connection_Mysql, DB_Connection_Pgsql itd... Ja wymyśliłem to trochę w inny sposób. Najwyżej podczas testów klasy stwierdzę, że trzeba coś zmienić. Mam interfejs który zawiera wymagane metody. Teraz każda klasa (osobna dla każdego rodzaju bazy) implementuje ten interfejs. W pliku konfiguracyjnym mam zapisane z jakiej bazy korzystam i na podstawie tego zapisu będzie wykorzystywana odpowiednia klasa do połączenia. Ale zacząłem się zastanawiać czy nie będę chciał korzystać z kilku różnych baz, np w jednej aplikacji pobierać dane z bazy pgsql na serwerze xxx.xxx.xxx.xxx i zapisywać w bazie mysql na localhost (to tylko przykład).. To mój sposób z plikiem konfiguracyjnym nie jest za dobry. Oczywiście można by w pliku konfiguracyjnym definiować konfiguracje dla dwóch baz, ale co jeśli będę chciał korzystać z 10 różnych (hardcorowy przykład ale staram się nie ograniczać).. Jeszcze się nad tym zastanowię. Ale tutaj całkiem rozsądne jak nie jedyne słuszne rozwiązanie to wzorzec registry. Jest bardzo duzo zależności, musisz sam wszystko przemyśleć, a wzorce to tylko sposób implementacji. Radze Ci lepiej zacznij od poznania problemu, a dopiero potem szukaj rozwiązania. Bo tutaj pytasz o pewien sposób użycia singletonu, a nie do końca jestem pewny czy wiesz do czego chcesz go użyć. Już się nad tym zastanawiałem i wiem co chcę osiągnąć. Natomiast pytam się o singletona bo wbrew opiniom innym nie widzę sensu stosowania go w php. CHYBA, że w jednym skrypcie (pojedynczym bo nie ma co ukrywać ale każda aplikacja w php to kolejne skrypty) korzystamy z kilku różnych baz - wtedy moim zdaniem singleton się sprawdzi. Ale jeśli korzystamy tylko z jednej bazy, to stosowanie singletona moim zdaniem jest przerostem formy nad treścią. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 8.10.2025 - 11:01 |