Controller - co lepsze?, getInstance(), czy przekazywanie obiektom... |
Controller - co lepsze?, getInstance(), czy przekazywanie obiektom... |
3.07.2006, 19:54:12
Post
#21
|
|
Grupa: Zarejestrowani Postów: 487 Pomógł: 7 Dołączył: 7.01.2004 Skąd: Warszawa Ostrzeżenie: (0%) |
Ej, panowie, ale chyba znacie definicje Front Controllera prawda? Odpowiedzialność ciążąca na akcji powinna się sprowadzać tylko do wykonania pewnej operacji, cytując Fowlera:
Cytat("Patterns of Enterprise Application Architecture") In a complex Web site there are many similar things you need to do when handling a request. These things include security, internationalization, and providing particular views for certain users. If the input controller behavior is scattered across multiple objects, much of this behavior can end up duplicated. Also, it's difficult to change behavior at runtime. The Front Controller consolidates all request handling by channeling requests through a single handler object. This object can carry out common behavior, which can be modified at runtime with decorators. The handler then dispatches to command objects for behavior particular to a request. Padły tu tez jakies zdania o IoC, w Springu, który korzysta w pełni z IoC jest element, który pełni funkcję front controllera - jest nim DispatcherServlet (pakiet spring.web.servlet). Ten post edytował splatch 4.07.2006, 07:24:03 -------------------- Łukasz Dywicki
Independent Java and open source software consultant. Blog - Java, OSGi, integracja oprogramowania.. |
|
|
4.07.2006, 01:31:37
Post
#22
|
|
Grupa: Zarejestrowani Postów: 338 Pomógł: 2 Dołączył: 4.03.2006 Skąd: Łódź Ostrzeżenie: (0%) |
Bo wg mnie sztuka dla sztuki ( absurdem ) jest przekazywanie kotrolera z kontekstem do kazdej klasy Nie przekazuje go. Ale jezeli akcja go potrzebuje, to bierze go sobie poprzez Controller::getInstance(); Kontekst trzymam w kontrolerze, bo kontroler traktuje jak OTOCZKE aplikacji. I ta OTOCZKA ma kazdemu pozwolic wziac sobie co zechce. Jezeli potrzebuje parametru GET, niech poprosi o kontekst, a ten juz posiada HttpRequest. Oczywiscie mozna zrobic Kontekst osobna klasa. Ale wtedy znowu byloby Context::getInstance->getRequest()... Jak juz ktos powiedzial - ile osob, tyle roznych pomyslow. A ten pomysl nie jest akurat w pelni moj. Tak bylo bodajze w Mojavi, a i z Phienda2 cos zaczerpnalem. Adrian. |
|
|
5.07.2006, 00:46:42
Post
#23
|
|
Grupa: Zarejestrowani Postów: 270 Pomógł: 0 Dołączył: 15.06.2003 Ostrzeżenie: (0%) |
Może warto zastosować tutaj rozwiązanie z javy? Np inversion of control (injection)
Kod [Class1] dep=Class2,Class4 singleton=true [Class2] singleton=true [Class3] singleton=true [Class4] singleton=true Kod:
Co ciekawe działa podobnie szybko jak za każdym razem używać jawnie wywołania instancji, jedynie troszke dłużej trwa wczytywanie ini. Czasy u mnie na lh: Czas:0.0023281574249268 (menager) Czas:0.0016329288482666 (single) Czas:0.0024371147155762 (instance) W javie (spring) działa to pięknie ale php z racji tworzenia od 0 za każdym wywołaniem czasami może warto poprostu nie przekombinować i tak wyszukane rozwiązania zostawić w spokoju. Nie korzystałem z tego jeszcze w żadnym projekcie bo ostatnio nie robie wiele w php i stworzyłe tylko z ciakawości czy sie wogóle uda. Ten post edytował Bora 5.07.2006, 00:59:55 |
|
|
5.07.2006, 08:44:07
Post
#24
|
|
Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%) |
Hm... muszę przynać, że ciekawie to wygląda i nawet narzut czasowy jest do zaakceptowania. Sam będę musiał przemyśleć zastosowanie czegoś takiego u siebie.
-------------------- |
|
|
6.07.2006, 11:17:08
Post
#25
|
|
Grupa: Zarejestrowani Postów: 569 Pomógł: 0 Dołączył: 17.08.2003 Skąd: Dąbrowa Górnicza Ostrzeżenie: (0%) |
Moim zdaniem wszystko zalezy od konstrukcji aplikacji. Jesli chodzi o jakies schematy obiektow ktore beda odpalane, czyli obiekty maja takie same nazwy metod to mozna przekazywac. Ale ogolnie ja sie przykladam do przekazywania instancji. I mozna to robic w roznoraki sposob. Albo poprzez Magazyn albo przez singletone. Ja uzywam singletone. Jest to o tyle wygodne ze jesli chce przekazac instancje obiektu w parametrze, to musze miec ja juz wywolana.
Jesli nie stworzylem obiektu jakies klasy bo nie była potrzebna wczesniej, to musze stworzyc obiekt tylko po to zeby go przekazac. Wiec po co ? skoro w metodzie ktora wymaga obiektu moge odwolas sie do getInstance() i juz mam. Sadze ze jest to wygodniejsze. Przy jakichkolwiek zmienach nie musze pamietac o tym ze wymagam jakiegos obiektu w atrybucie. Przy okazji, jesli mam grupe roznych modeli, i potrzebuje pobrac 3 modele do akcji, to bedziesz je przekazywac w atrybutach ? Dziwnie by to wygladało. -------------------- Warsztat: Linux: PHP, MySQL, Apache, NetBeans, C++, Qt-Creator
Użytkownik, słowo którego specjaliści IT używają, gdy chcą powiedzieć idiota Zarządzaj swoim budżetem domowym |
|
|
6.07.2006, 14:34:51
Post
#26
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. |
Ale czy w tym wypdku o którym mówisz Sh4dow, to nie może się zdazyć tak, że jeśli będziesz miał dwie klasy (potrzebujące tego samego obiektu) z metodami getInstance(), to każda powoła do życia obiekty tego samego typu, ale różne?
-------------------- To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness; chaotic, confused, vulnerability, to inform yourself. Think for yourself. Question authority. |
|
|
6.07.2006, 14:42:44
Post
#27
|
|
Grupa: Zarejestrowani Postów: 740 Pomógł: 15 Dołączył: 23.08.2004 Skąd: Poznań Ostrzeżenie: (0%) |
@Cysiaczek - jesli to jet klasa Singleton (poprawnie zaimplementowana) to w ramach jednego wywolania nie ma szansy na powolanie do zycia wiecej niz jednej jej instancji.
-------------------- bigZbig (Zbigniew Heintze) | blog.heintze.pl
|
|
|
6.07.2006, 14:47:43
Post
#28
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. |
Tak. Zdaję sobie z tego sprawę - mimo to zastanawiam się nad samym mechanizmem jawnego wywołania instancji w ciele klasy. przy singletonie jest ok, ale gdzie indziej? Po prostu pytam.
-------------------- To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness; chaotic, confused, vulnerability, to inform yourself. Think for yourself. Question authority. |
|
|
6.07.2006, 14:55:33
Post
#29
|
|
Grupa: Zarejestrowani Postów: 740 Pomógł: 15 Dołączył: 23.08.2004 Skąd: Poznań Ostrzeżenie: (0%) |
Ale w czym problem? Zalezy od ciebie czy przekazesz obiekt do klasy czy wywolasz go wewnatrz niej. Wzorzec budowniczego np. zaklada z definicji tworzenie instancji wewnatrz klasy bo klasy te maja wlasnie takie przeznaczenie.
Klopot z wywolywaniem Singeltona wewnatrz klasy polega na tym ze wywolujesz konkretna klase. Nie jej rozszerzenie np, ale wlasnie te klase. No chyba, ze przekazujesz do swojej klasy nazwe klasy bedacej singletonem, ale to juz chyba lepeiej przekazac obiekt. -------------------- bigZbig (Zbigniew Heintze) | blog.heintze.pl
|
|
|
6.07.2006, 15:07:49
Post
#30
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. |
Aha. Własnie do tego zmierzałem - po co "psuć" klasę trzymając tam nazwę innej klasy. Lepiej chyba od razu przekazać obiekt. Zastanawia mnie jeszcze coś takiego.
Czy to byłoby dobre do wywołania/utrzymywania potrzebnych pierdół? -------------------- To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness; chaotic, confused, vulnerability, to inform yourself. Think for yourself. Question authority. |
|
|
6.07.2006, 18:15:53
Post
#31
|
|
Grupa: Zarejestrowani Postów: 487 Pomógł: 7 Dołączył: 7.01.2004 Skąd: Warszawa Ostrzeżenie: (0%) |
Singleton jest zły. Dlaczego? Jest to niemalże to samo co global. Singleton jest po to by mieć 1 instancje a nie po to by nie przekazywać obiektów!
Inversion of Controll idzie dalej, zapewnia obsługę obiektów. Kontener IoC możę się zachowywać jak fabryka i wypluwać kolejne instancje albo trzymać tylko 1 instancje. Dostęp do usług (np połączenia z bazą) jest tylko w tych miejscach, gdzie przekazaliśmy instancję kontenera. -------------------- Łukasz Dywicki
Independent Java and open source software consultant. Blog - Java, OSGi, integracja oprogramowania.. |
|
|
6.07.2006, 19:36:24
Post
#32
|
|
Grupa: Zarejestrowani Postów: 270 Pomógł: 0 Dołączył: 15.06.2003 Ostrzeżenie: (0%) |
podejrzewam że IoC może sie nie podobać osobom które mają np pare klass obsługujących cały kod. Np klassa User powinna mieć dostęp do obketku Groups ale jeśli ktoś trzymałby w tej klasie dodatkowo tworzenie miniaturki usera, zarządznaie wiadomościami i jeszcze coś wówczas rzeczywiście może być sporo niepotrzebnych stworzonych obiektów. W javie lazy-init pomaga gdzie obiekt jest tworzony dopiero gdy jest potrzebny.
Cytat Przy jakichkolwiek zmienach nie musze pamietac o tym ze wymagam jakiegos obiektu w atrybucie. Takie rzeczy powinny wyjść w testach. Tak jak pisze Splatch IoC zapewnia większe bezpieczeństwo, kodu. Pozatym klassy są mniej z sobą powiązane przez co w przyszłości prościej można je wykorzystać w innym projekcie. Ten post edytował Bora 6.07.2006, 19:40:40 |
|
|
Wersja Lo-Fi | Aktualny czas: 9.05.2024 - 18:10 |