![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 105 Pomógł: 0 Dołączył: 5.12.2004 Ostrzeżenie: (0%) ![]() ![]() |
Hejka.
Ostatnio po przeczytaniu paru tekstów o wzorcach zacząłem się zastanawiać nad tworzeniem instancji obiektów w systemie (lepiej późno niż w cale (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) ). Czy nie zacząć stosować swojego rodzaju „fabryki” tak, aby mieć większą kontrolę nad tym, co się dzieje w systemie jeśli idzie o obiekty. Zaciekawił mnie ten „problem”, a jako, że nie znalazłem podobnych wątków postanowiłem napisać o tym i zapytać się, co o tym sądzicie. Generalnie od jakiegoś czasu w swoim systemiku korzystam z funkcji __autoload() przy ładowaniu plików z klasami. I samo w sobie jest to IMHO ok, tyle, że od pewnego momentu zaczęło mnie drażnić przekazywanie obiektów w parametrach nowo tworzonych obiektów. Fajnie by było, żeby sam skrypt dbał o to jaki plik załadować, jeżeli dany obiekt potrzebuje instancji innych klas do działania to niech je sobie sam stworzy, jeśli rozszerza jakaś klasę to niech zanim stworzy tą właściwą zapewni dostęp do wszystkich klas nadrzędnych po których ona dziedziczy, podobnie z interfejsami… My tylko chcemy stworzyć np.: obiekt klasy Session, a to że on wymaga PDO (w konstruktorze wymaga przekazania obiektu typu PDO) to nie nasz problem. Skąd by było wiadomo, co i jak? Z pliku xml, tablicy... w której to była by definicja wszystkich klas systemu, z których korzysta. Te dane z pliku, czy innego źródła były by ładowane przez jakaś klase typu ClassConfigurationLoader, która tworzyła by tablice, a w niej pod kluczem w postaci "nazwa klasy" wsadzał by wartość w postaci stworzonego obiektu zapewniającego dostęp do wszystkich danych z konfiguracji. Za tworzenie obiektów dostępnych klas odpowiadala by klasa np: ObjectGenerator. W jednej z metod podawali bysmy tylko nazwe interesujacej nas klasy, a skrypt, wg. konfiguracji, sprawdzal by czy ta klasa korzysta z innych klas, czy po jakis dziedziczy itd. Dodatkowo ObjectGenerator moglby byc wywolywan z poziomu klasy ObjectManager, ktory to moglby zliczac wywolywania, czas generowania, cacheowac (singleton) itd. Co sądzicie o takim podejściu? Napewno, nie jest to nic nowatorskiego, ale ciekawy jestem waszych opinii, wad, zalet, ktorych moze ja nie dostrzegam. Poza tym ciekawy jestem tez waszego sposobu tworzenia obiektow i ich przekazywania w parametrach. Czy raczej uzywacie jednego modulu do powolywania obiektow, czy wszedzie new? jeszcze przyklad jak mogla by wygladac taka konfiguracja klas (na przykladzie tablicy, ale nie ma problemu by bylo to xml, czy inne zrodlo):
Ten post edytował xarr 14.01.2007, 19:35:45 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 105 Pomógł: 0 Dołączył: 5.12.2004 Ostrzeżenie: (0%) ![]() ![]() |
Zanim spróbujesz utworzyć obiekt klasy x, musisz sprawdzić czy czasem nie dziedziczy on po innej klasie, która nie została dotychczas załadowana lub interfejsie. Jeżeli tak to najpierw musisz załadować odpowiednie pliki klas i interfejsów. Dlatego te informacje są dosyć potrzebne w konfiguracji. Można się co najwyżej przyczepić, czy klasy maja być zapisane w tablicy, bo w php jest możliwość dziedziczenia tylko po 1 klasie na danym poziomie.
Btw. troszkę źle napisałem przykład. Obiekt Pdo powinien być przekazany jako parametr, a nie jako rodzic (Session extends Pdo):
Zatem obiekt Pdo jest przekazywany w parametrze (automatycznie tworzony przy instancji Session), implementuje też interfejs ISession, więc zanim utworzy obiekt Session, musi zapewnić plik z tym interfejsem. Więc dopisujemy:
Dodatkowo klasa HttpSession może rozszerzać klasę Session i wtedy dodajemy definicje Session, a do parametru extensions w definicji HttpSession dodajemy 'Session' i wtedy na podobnej zasadzie skrypt zanim utworzy obiekt HttpSession zapewni także dostęp do pliku z klasa Session (require_once). Pytanie tylko, czy definicje interfejsów powinny być w tym samym pliku/tablicy, co definicje klas? Pozostaje tez problem static (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Bo narazie wszystko działa na zasadzie operatora new. Wprawdzie sprawa singletona jest przerzucona na barki klasy ObjectManager, która to w momencie 'simgleton'=>true zapisuje obiekt w cache`u, ale co w przypadku klas, na które składają się tylko metody statyczne? Tego jeszcze nie wiem, jakieś pomysły? Pozdrawiam i dzięki za opinie Ociu. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 10.10.2025 - 01:47 |