Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 21.01.2013 Ostrzeżenie: (0%)
|
Witam, uczę się OOP, zacząłem dla testów pisać klasę obsługująca bazę na podstawie PDO ( Trudno to nazwać DIC ). I proszę Was o ocenę czy w dobrą stronę to zmierza czy może podejście mam złe i później sobie skomplikuje życie ?
"Klasa DIC"
Pomijając kwestię iż trzymam dane do połączenia w klasie, czy ma mniej więcej tak to wyglądać ? Ciekawi mnie dlaczego musiałem zdefiniować funkcję prepare ... jak jej nie dopiszę to wywala mi później że nie istnieje ;x Klasa User:
Kod napisany tylko żeby sprawdzić czy się uruchamia. A wywołuje metody tak:
Ogólnie działa, no chyba że skasuje metode prepare w klasie DataBaseConnection to wtedy już nie ;p Tylko pytanie jak już wcześniej napisałem czy dobrą drogą idę ? |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%)
|
Z Twoim kodem wszystko jest źle i nie ma to wiele wspólnego z Dependency Injection - niestety podobnie jest z późniejszymi postami w tym wątku.
1. Po co istnieje klasa DataBaseConnection skoro nie robi ona absolutnie nic poza obcięciem możliwości "surowego" PDO? Przecież możesz bezpośrednio korzystać z obiektu PDO w swoim kodzie - nie musisz tego robić przez obiekt pośredniczący. 2. Jak już, to konstruktor klasy DataBaseConnection powinien przyjąć obiekt PDO w swoim argumencie, a nie tworzyć go samemu - wtedy mielibyśmy do czynienia właśnie z DI. 3. Jeżeli nie jesteś wstanie zrobić nic z wyjątkiem, to go nie wyłapuj. 4. Musiałeś zdefiniować dla klasy DataBaseConnection metodę prepare bo dlaczego niby miałaby ona istnieć sama z siebie? Obiekt PDO udostępnia prepare(), query(), beginTransaction() i masę innych, nie DataBaseConnection. 5. W klasie User już poprawnie przekazałeś obiekt połączenia z zewnątrz. Jedynie niepotrzebnie na siłę wykorzystujesz właściwości login czy query bo tam możesz skorzystać ze zwykłych zmiennych lokalnych. Czyli generalnie powinno to wyglądać to mniej-więcej tak: Pomijam tutaj już fakt, że wybieranie danych z bazy i ich reprezentacja w formie jednego obiektu klasy User jest bardzo złym podejściem. Powinieneś mieć raczej jeden obiekt przeznaczony do reprezentowania użytkownika (User) i drugi do wybierania takowych np. z bazy danych, czyli tzw. "model" (UserRepository). Jeszcze co do bzdur wypisanych w postach: 1. W żadnym wypadku klasa typu user nie powinna dziedziczyć po połączeniu z bazą danych, bo: (a) nie jest takowym, ((IMG:style_emoticons/default/cool.gif) dojdzie do tego że będziesz miał otwartych po kilka połączeń na raz - kompletnie niepotrzebnie. 2. Jeżeli w jakiejś klasie potrzebujesz mieć dostęp do bazy danych to obiekt PDO powinieneś właśnie przekazać w konstruktorze. 3. Użycie Singetonu dla "klasy od bazy danych" to idiotyzm: (a) przecież może istnieć wiele równoległych połączeń do różnych baz danych((IMG:style_emoticons/default/exclamation.gif) !), ((IMG:style_emoticons/default/cool.gif) niweczysz tym wszelkie zalety płynące z IoC (DI) 4. Model nie jest synonimem operacji na bazie danych. Ta ostatnia jest w ogóle nie potrzebna. Przecież dane mogą pochodzić z dziesiątek innych źródeł, a tak w ogóle to model nie oznacza tylko wybierania danych, ale również i ich przetwarzanie. |
|
|
|
marcinq123 Ocena podejścia do Dependency Injection 5.01.2015, 20:54:55
Turson Pokaż var_dump($baza) w konstruktorze klasy U... 5.01.2015, 21:38:56 
marcinq123 Cytat(Turson @ 5.01.2015, 21:38:56 ) ... 5.01.2015, 22:00:21
Damonsson Takie trochę na siłę to DI. Do każdego obiektu będ... 5.01.2015, 21:45:58
Turson Właśnie Singleton się do tego nadaje. 5.01.2015, 22:02:23
marcinq123 No właśnie, ogólnie sobie poczytałem ... i w sumie... 5.01.2015, 22:08:22
Damonsson Jeżeli to jest po prostu zwykły model, to musisz m... 5.01.2015, 22:22:01 
Damonsson Cytat(Crozin @ 6.01.2015, 12:41:19 ) ... 6.01.2015, 15:54:44
pyro @Crozin, +1 . Miałem to samo wymienić, ale nie chc... 6.01.2015, 13:16:13
marcinq123 Prawdę mówiąc, po cichu liczyłem na Twoją odpowied... 6.01.2015, 14:01:38
Crozin CytatNo właśnie zdefiniowałem tylko prepare() a np... 6.01.2015, 14:14:06
marcinq123 Na tą chwile zostały rozwiane moje wątpliwości ;] ... 6.01.2015, 14:33:51
Crozin Cytat1. Jeżeli to jest zwykły model do połączenia ... 6.01.2015, 19:29:22
Damonsson 1. Metody, które i tak zawsze pobierają coś z bazy... 6.01.2015, 20:46:10
Crozin Doctrine 1? Ale mamy 2015 rok, środowisko PHP już ... 7.01.2015, 00:20:07 ![]() ![]() |
|
Aktualny czas: 24.12.2025 - 16:51 |