Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Ładowanie obiektów.
xarr
post 14.01.2007, 19:34:04
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 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):
  1. <?php
  2. 'Pdo' => array(
  3. 'name'=>'Pdo',
  4. 'file' => false,
  5. 'singleton' => true,
  6. 'extensions' => array(),
  7. 'interfaces' => array(),
  8. 'params' => array('mysql:ble ble','login','pass')),
  9.  
  10. 'Session' => array(
  11. 'name'=>'HttpSession',
  12. 'file' => 'session.php',
  13. 'singleton' => true,
  14. 'extensions' => array('oPdo'),
  15. 'interfaces' => array('ISession'),
  16. 'params' => array())
  17. );
  18. ?>


Ten post edytował xarr 14.01.2007, 19:35:45
Go to the top of the page
+Quote Post
Ociu
post 16.01.2007, 13:53:18
Post #2





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




Nie najgorzej. Nie rozumiem po co Ci interfejsy i rozszerzenia.
IMHO, w bardziej rozbudowanych systemach nie przekazywać obiektów jako parametry, tylko dziedziczyć je.
W sumie to tyle wielkim skrótem smile.gif

pozdrawiam
Go to the top of the page
+Quote Post
xarr
post 16.01.2007, 15:53:56
Post #3





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):
  1. <?php
  2. 'Pdo' => array(
  3. 'name'=>'Pdo',
  4. 'file' => false,
  5. 'singleton' => true,
  6. 'extensions' => array(),
  7. 'interfaces' => array(),
  8. 'params' => array('mysql:ble ble','login','pass')),
  9.  
  10. 'HttpSession' => array(
  11. 'name'=>'HttpSession',
  12. 'file' => 'session.php',
  13. 'singleton' => true,
  14. 'extensions' => array(),
  15. 'interfaces' => array('ISession'),
  16. 'params' => array('Pdo'))
  17. );
  18. ?>


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:
  1. <?php
  2. 'ISession' => array(
  3. 'name' => 'ISession',
  4. 'file' => 'session.interface.php'
  5. )
  6. ?>

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 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.
Go to the top of the page
+Quote Post
Ociu
post 16.01.2007, 16:04:23
Post #4





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




Dalej uważam, ze definicje iterfejsów i rozszerzeń nie są konieczne. Nie piszesz kodu, który Ci nie będzie potrzebny. Także wszystkie pliki będą dołączane do systemu. Najlepiej będzie stworzyć funkcję, która będzie tworzyła mapę plików: interfejsów, klas i innych. Interfejsy do jednej mapy, klasy do innej a inne wywalić.

Idąc tropem myślenia prostego człowieka, lepiej inkludować jak leci, a nie analizować, czy klasa Ci jest potrzebna czy nie. Zauważ, że moze być sytuacja, ze pare klas dziewdziczy po tym samym obiekcie. Wtedy znowu trzeba dorawiać sprawdzanie czy plik został dołączony i taki wynalazek będzie uruchamiany przez cały dzień.

IMHO. Mapa dla klas, po kolei lecieć z dołączaniem, tworzenie obiektów, osobna mapa na singleton, osobna na interfejsy.

pozdrawiam, Wojtek
Go to the top of the page
+Quote Post
NuLL
post 16.01.2007, 16:15:01
Post #5





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

Ostrzeżenie: (0%)
-----


Proste pytanie - po co sie tak meczyc ? snitch.gif


--------------------
Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
Go to the top of the page
+Quote Post
xarr
post 16.01.2007, 18:17:00
Post #6





Grupa: Zarejestrowani
Postów: 105
Pomógł: 0
Dołączył: 5.12.2004

Ostrzeżenie: (0%)
-----


Null dla pozniejszej wygody, testowania, itd ;]

Ociu... generalnie zeby dolaczyc klasy po ktorych dziedziczy klasa x, nalezy dostac sie do glownego rodzica, a potem w dol dolaczac pokolei dzieciakow, wiec to jest nieuniknione. W miedzy czasie oczywiscie pokolei rowniesz dolaczac interfejsy smile.gif Ale to tylko groznie brzmi smile.gif
Co do sensu... niby mozna by zaladowac wszystkie pliki i darowac sobie... tylko czy zawsze korzystasz, ze wszystkiego? Przy mniejszych i srednich projektach, ok... mozna od biedy wlaczyc te parenascie klas i juz, ewentualnie zaprzegnac __aoutoload i wlaczac w momencie pierwszego pojawienia sie w wywolaniu, ale co jesli masz w systemie dziesiatki plikow? Poza tym zaleta takiego managera jest to, lub moze byc to, ze wiesz kiedy, co i jak, oraz jak dlugo jest wywolywany dany obiekt, czy grupa obiektow.

Nie wydaje mi sie tez by narzut czasowy spowodowany 2-3 petlami przy dolaczaniu dziedziczonych klas byl duzy, ale to chyba musze potestowac.

A co do mapy, moglbys cos dokladniej napisac jak mialo by to wygladac?
Go to the top of the page
+Quote Post
rashid
post 26.01.2007, 13:44:36
Post #7





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 22.11.2003

Ostrzeżenie: (0%)
-----


Factory ma sens, jesli w kilku miejscach w programie tworzysz obiekty tej samej klasy w nieco odmienny sposob. W twoim scenariuszu widze w zasadzie obiekt tworzony jednokrotnie. Zamiast komplikowac sobie zycie implementujac fabryke, po prostu umiesc kod inicjujacy w konstruktorze.

Przemysl tez czy ma sens tworzenie plikow konfiguracyjnych. Jesli laczysz sie ciagle z ta sama baza, to prosciej jest parametry umiescic w konstruktorze. Wyglada to moze 'nieprofesjonalnie', ale jest znacznie lepszym rozwiazaniem niz dopisywanie kilkudziesieciu linii kodu do obrabiania pliku konfiguracyjnego, z ktorego aplikacja przez 2 lata wczytuje ta sama informacje. Konfig sobie zawsze mozesz 'wypiac' do pliku zewnetrznego jesli bedzie taka potrzeba.


--------------------
Robert Janeczek
G-Forces Web Management Polska
robert.janeczek@gforces.pl
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 18.04.2024 - 12:32