![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 155 Pomógł: 0 Dołączył: 6.07.2015 Ostrzeżenie: (10%) ![]() ![]() |
Witam,
Tworzę aplikacje OOP PHP, napisałem klasę Database w której są metody od połaczenia, select, update itp. Mam w aplikacji wiele innych klas takich jak, Site, User, Account itd, nie widzę sensu aby w każdej tworzyć w konstruktorze instancję klasy Database, moje pytanie to jak można zrobić aby w każdej z klas miec dostęp do metod z Database, extends do każdej z klas? Czy jest jakiś sensowniejszy pomysł aby to rozwiązać? Ten post edytował MeGusta 15.06.2017, 21:36:58 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 6 378 Pomógł: 1116 Dołączył: 30.08.2006 Ostrzeżenie: (0%) ![]() ![]() |
Dependency injection
-------------------- |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 374 Pomógł: 79 Dołączył: 6.04.2010 Skąd: Ostrów Wielkopolski Ostrzeżenie: (0%) ![]() ![]() |
extends do każdej z klas? extends zdecydowanie nie, bo to by było nielogiczne. extends to rozszerzenie/rozbudowanie innej klasy. Ani User ani Account itd nie rozszerzają klasy Database, tylko ją wykorzystują/używają. User mógłby rozszerzać np. Person, gdzie Person miałby atrybuty "name" i "age", a User dodatkowo na przykład "email". Tak jak Samochód może rozszerzać Pojazd, albo Kotek rozszerzać Zwierzaka. Ale ani Samochód ani Kotek nie mogą rozszerzać SposobuPoruszaniaSie; mogą SposobPoruszaniaSie co najwyżej wykorzystywać. Od tego jest to co viking napisał - dependedncy injection. napisałem klasę Database w której są metody od połaczenia, select, update itp. Mam w aplikacji wiele innych klas takich jak, Site, User, Account itd, nie widzę sensu aby w każdej tworzyć w konstruktorze instancję klasy Database A właśnie że jest sens ![]() Generalnie, to klasa Database jest pośrednikiem między innymi klasami a fizycznym źródłem danych. Jeśli User, Site, Account itd. mają być pamiętane, to muszą być świadome źródła danych - czy to będzie Database, czy FileSystem, czy Session, czy cokolwiek. To tak jak Kotek żeby łazić po płocie musi być świadomy swoich kończyn (chociażby na poziomie podświadomości ![]() Tylko że ta technika - konstruktorem, tak jakby stawia klasie wymóg istnienia _konkretnej_ zależności. Nic w tym złego. Ale jak pomyślisz "a co jeśli nie zawsze chciałbym wykorzystywać Database do operowania Userami? Albo brać ich nie z Database a z innego źródła?". I tutaj właśnie musiałbyś skorzystać z rozszerzania (zrobić generalny opis źródła danych, który Twoja Database by rozszerzała) albo interfejsu z setterem, który wymuszałby zdefiniowanie źródła danych dla wybranych klas:
Tak czy inaczej, to wszystko to przekazywanie zależności i to ma sens bo jeśli chcesz żeby klasa brała informacje z bazy, to musi o tym wiedzieć i trzeba jej to za każdym razem powiedzieć. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 19.07.2025 - 03:12 |