![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 56 Pomógł: 0 Dołączył: 23.11.2003 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Jak w temacie, czy myslicie ze tworzenie specjalnej grupy obiektow do obslugi roznorodnych zdarzen: informacji debug, wyjatkow, bledow jest dobrym pomyslem?
W praktyce wygladaloby to tak: $events = new EventListener(); $events->registerHandler('Exception', new ExceptionHandler()); // Zlapany w bloku catch() wyjatek: $events[] = $e; Powiadamiamy w ten sposob EventListenera o zajsciu nowego zdarzenia. Nastepnie zostaje wykonany lancuszek klas odpowiedzialnych za obsluge danego typu zdarzenia. Co sadzicie o tym? Pozdrawiam, -------------------- Making IT works
|
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Czy nie chodzi ci o to samo, czym było by wykorzystanie funkcji set_exception_handler() ?
-------------------- |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 56 Pomógł: 0 Dołączył: 23.11.2003 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Nie, bo imho zdarzenia nie musza miec nic wspolnego z wyjatkami...
-------------------- Making IT works
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
A może wzorzec Observer ? Sama nazwa, jak i zastosowanie spełnią chyba twoje wymagania.
-------------------- |
|
|
![]()
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%) ![]() ![]() |
Serafin - podoba mi się to rozwiązanie
![]() -------------------- Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
|
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 521 Pomógł: 0 Dołączył: 3.11.2003 Skąd: 3city Ostrzeżenie: (0%) ![]() ![]() |
Kilka luźnych uwag:
1) To jest chyba wykorzystanie interfejsu ArrayAccess? 2) Jak Observer, to warto (jeżeli się da) wykorzystać kod z SPL. Nic odkrywczego nie wymyślili, ale może uda się wypracować jakiś standard/ 3) Bardzo by się przydał lazy loading, bo przecież ExceptionHandler przeważnie nie będzie wywoływany. Albo handle/proxy (jak w WACT lub phiend.handle), albo delegate/invoker (jak w WACT lub niepublikowanej jeszcze części phiend.handle). 4) Zmieniłbym nazewnictwo, bo EventListener sugeruje, że jest to Observer, a tymczasem jest to drugi element tego wzorca - Observable. Robiony przeze mnie pakiet phiend.logger ma klasę Logger, którza przyjmuje wiadomości/zdarzenia i kieruje do listenerów. Efekt jest chyba podobny... |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 2 262 Pomógł: 21 Dołączył: 3.05.2004 Skąd: Sopot, Krakow, W-wa Ostrzeżenie: (0%) ![]() ![]() |
@Hawk Wątpię aby to byl ArrayAccess. Ja osobiscie tez wykorzystuje statyczny rejestr w ktorym zapisuje komunikaty -np. nie mozna sie polaczyc z baza i jechac tylko na cache o ile sie da.
Co handlerow - tez mam swoje - inicjowane wraz z jadrem systemu - choc zastanawiam sie czy jest jakas metoda ktora pozwoli na to aby ominac wywolanie handler jesli w aplikacji nie zajdzie zaden wyjatek ![]() ![]() -------------------- Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 115 Pomógł: 1 Dołączył: 15.01.2003 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 2 262 Pomógł: 21 Dołączył: 3.05.2004 Skąd: Sopot, Krakow, W-wa Ostrzeżenie: (0%) ![]() ![]() |
Ale ja nie chce rejestrowac tego handlera dopoki nie jest mi potrzebny - ba, najlepiej zadnego handlera nie inicjowac. Tu robisz wywolanie jawnie inicjujac aplikacje - ja chce tego uniknac. Pomysl juz mam
![]() Pozatym pomysl z tablica jest poroniony. Lepiej wg mnie.
Przelaczniki ala DOS i to mi sie podoba ![]() -------------------- Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
|
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 56 Pomógł: 0 Dołączył: 23.11.2003 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Zmienilem nieco idee. Pokazuje wiec kod:
Jak widac skorzystalem z wzorca Obserwator. To rozwiazanie jest teraz w miarę szybkie i dosyc skuteczne. Postaram sie zaimplementowac cos jeszcze. Pozdrawiam, // Edit Hawk: Co do lazy loading, masz racje obserwatorzy czy tez exceptionhandler nie zawsze beda potrzebni, w takim razie mozna nieco zmodyfikowac cala idee by zamiast obiektow przekazywac tylko nazwy odpowiednich obserwatorow. Ten post edytował serafin 14.07.2005, 08:32:03 -------------------- Making IT works
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 179 Pomógł: 0 Dołączył: 9.11.2004 Ostrzeżenie: (0%) ![]() ![]() |
@NuLL: Reflection API sprawdziłoby się raczej tylko w przypadku statycznych handlerów klas - tzn jesli masz handler np. XYZ::onDoSomething(). W tym wypadku moznaby albo za kazdym razem leciec reflectionem po klasachw wposzukiwaniu obsługi zdarzeń, albo (tylko raz) stworzyć mapę klas z danymi handlerami.
Ale co jeśli obiektów danego typu jest dużo? Na dodatek lokalnych w jakiejś funkcji? W tym wypadku chyba właśnie lepiej zastosować obserwatorów(chyba nawet trzeba) i po kolei ich rejestrować, tak jak zrobił serafin. Chyba nie ma innego wyjścia ![]() Może się mylę, poprawcie jakby co ![]() |
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 134 Pomógł: 0 Dołączył: 27.01.2005 Skąd: Białystok Ostrzeżenie: (0%) ![]() ![]() |
hymm..., ja myślę, żę obserwator nie jest tu niezbędny, ale bardzo ułatwia pracę. Choć sam debug zrobił bym inaczej (wyświetlanie komunikatów na końcu) i oddzielny obserwator dla wyjątków i błędów. Ogólnie myślę, że jest wiele sposobów prowadzenia debugera i jeżeli chodzi o uniwersalność "statyczne klasy", które mają metody i właściwości statyczne są lepsze i nie trzeba znać wzorca obserwatora. Aczkolwiek eventy mi się podobają, proste i w miarę skuteczne.
-------------------- |
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
serafin: zastanawiam się po co te register() i unregister() w Obserwatorze. Chyba przejrzyściej by wyglądało, gdybyś to w obiekcie obserowanym registrował obserwator, a nie odwrotnie.
-------------------- |
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 56 Pomógł: 0 Dołączył: 23.11.2003 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Vengeance: rejestrujesz w Obserwatorze Podmiot ktory ma obserwowac. Wiec logiczny jest taki kierunek rejestracji
![]() -------------------- Making IT works
|
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
A co logicznego jest w tym, że w Obserwatorze rejestruje Podmiot do obserwacji... z czego ten Obserwator tak na prawde potem rejestruje się w Podmiocie :]
Nie wydaje ci sie to drogą "na około" ? -------------------- |
|
|
![]()
Post
#16
|
|
![]() Grupa: Zarejestrowani Postów: 134 Pomógł: 0 Dołączył: 27.01.2005 Skąd: Białystok Ostrzeżenie: (0%) ![]() ![]() |
Możesz wyciąć w tych metodach dodawanie do stosu podmiotów, choć ich rejestrowanie jest pomocne. A jak rejestruje się wiele podmiotów pod jednym obserwatorem to jest po prostu zbawienie.
-------------------- |
|
|
![]()
Post
#17
|
|
![]() Grupa: Zarejestrowani Postów: 521 Pomógł: 0 Dołączył: 3.11.2003 Skąd: 3city Ostrzeżenie: (0%) ![]() ![]() |
Reflection API jest fantastyczne w przypadku wywalania na ekran informacji o błędzie. Ja np. wyciągam definicję każdej metody z backtrace, włącznie z wszystkimi przełącznikami (final, static, itd), z nazwami i typami argumentów itd. W wolnym czasie chciałem zrobić parsowanie phpdoc w celu wyciągnięcia dodatkowych informacji o argumentach i zwracanym typie (i oczywiście opisu). Jak zrobię, będę mógł zaprezentować phiend.logger
![]() |
|
|
![]()
Post
#18
|
|
![]() Grupa: Zarejestrowani Postów: 56 Pomógł: 0 Dołączył: 23.11.2003 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
hawk: przejrzalem twojego phienda2. I'm quite impressed.
Bardzo spodobal mi sie plugin loader i sposob w jaki go zaimplementowales (zwlaszcza Handles i Lazy Loading) P.S. Nie obrazisz sie jak skorzystam z kilku twoich pomyslow ;> ? -------------------- Making IT works
|
|
|
![]()
Post
#19
|
|
![]() Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Czy czasem Lazy Loader nie odnosił się bardziej to logiki biznesowej niż zarządzaniem obiektami ?!
-------------------- |
|
|
![]()
Post
#20
|
|
![]() Grupa: Zarejestrowani Postów: 56 Pomógł: 0 Dołączył: 23.11.2003 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Lazy loading odnosi sie do zarzadzania obiektami. Obiekt tworzony jest wylacznie wtedy kiedy jest potrzebny, nie wczesniej. Podobnie dziala chyba mechanizm dynamicznego wiazania w javie, obiekt tworzony jest w momencie kiedy jego instancja jest potrzebna.
pozdrawiam, -------------------- Making IT works
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 8.07.2025 - 17:12 |