![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 338 Pomógł: 2 Dołączył: 4.03.2006 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Co jest lepszym rozwiazaniem? Singletone, czy przekazywanie go obiektom? Dla przykladu:
Adrian. |
|
|
![]()
Post
#2
|
|
![]() Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Lepiej przekazywać jako argument funkcji. Pytanie tylko - po co przekazywać obiekt kontrolera akcjom? Nigdy nie spotkałem się z taką potrzebą, dlatego mnie to dziwi.
-------------------- |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 338 Pomógł: 2 Dołączył: 4.03.2006 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Dlaczego? Zobacz Mojavi - tam wszedzie sie tak robi.
Dlaczego Akcjom? Kontroler jest otoczka dla calej aplikacji. Kontroler udostepnia kontekst, ten zas request. Siadam do kodu, jednak zmienie na singletone. dotychczas caly framework mial zorganizowany na zasadzie przekazywania kontrolera obiektom. Ale zauwazylem, ze moze to powodowac bledy - chociazby typu referencja, kopia obiektu. Oczywistym jest ze powinny byc to wszedzie referencje. Adrian. |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 172 Pomógł: 0 Dołączył: 22.09.2002 Skąd: Gorzów Wlkp Ostrzeżenie: (0%) ![]() ![]() |
Hej.
Wydaje mi się że dużo lepiej jest przekazywać obiekt w konstruktorze po typie to daje możliwość podmiany implementacji danego interfejsu na inny - czyli jednym słowem zwiększa elastyczność kodu. Pracowanie na instancji tworzonej wewnątrz innej klasy powoduje że wymuszasz konkretny typ i w razie potrzeby modyfikować już istniejący kod - a nie o to chodzi w OOP. Pozdrówka anas |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 338 Pomógł: 2 Dołączył: 4.03.2006 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Z drugiej strony czesc obiektow otrzymuje w kontruktorze kontroler i nalezy sie do niego odwolac przez powiedzmy $this->_getController();. Czesc natomiast dostaje w wywolaniu metody execute().
Z nowu nie zawsze potrzebuje tego kontrolera, a jednak jest przekazywany w funkcji. Najbardziej denerwuje mnie ta roznica w przekazywaniu w kontruktorze albo w execute(); No i na sam koniec - framework ma byc dla mnie maksymalnie wygodny. |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 548 Pomógł: 2 Dołączył: 19.07.2003 Ostrzeżenie: (0%) ![]() ![]() |
witam
Jestem w trakcie kończenia innego rozwiązania. Jest klasa która jest managerem instancji ... zwraca obiekt wg jego nazwy oraz nazwy instancji (nazwa nie jest wymagana - może być utworzona automatycznie dla singletona - wtedy wiadomo że nie trzeba znać instancji, wystarczy nazwa klasy) ... może automatycznie tworzyć singletony (oczywiście jak ktoś z palca wywoła klasę która ma publiczny interfejs to dostanie obiekt ) lub nie pozwalać by dana klasa była używana jako taki ( za każdym razem zwraca nową instancję) ... po ustawieniu dodatkowych pól wewnątrz klasy (nie są wymagane) klasa tworzona może współpracować z managerem ... użycie odbywa się na zasadzie:
ten manager nie jest związany z jakąś szczególną klasą ale może być pomocny przy dużej ilości obiektów (duża aplikacja intranetowa - w tym celu go opracowuje) ... jeżeli uda mi się dziś skończyć to udostępnie w dziale gotowe skrypty może się komuś przyda ... pozdrawiam -------------------- Computer games don't affect kids; I mean if <span style="font-weight: bold;">Pac Man</span> affected us as kids,we would all be running around in darkened rooms, munching magic pills and listening to repetitive electronic music.
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Skoro tak musisz robić, to bym się skłaniał do przekazywania albo przez konstruktor albo przy wywołaniu samej akcji. Którą metodę wybierzesz, to zależy od Ciebie.
Z drugiej strony jak dla mnie, to strasznie skomplikowany jest kontroler w mojavi. Nie prościej wyodrębnić wszystkie dane kontekstu do osobnego obiektu? -------------------- |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 338 Pomógł: 2 Dołączył: 4.03.2006 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Owszem, kontroler Mojavi ma troche skomplikowanego kodu
![]() Dlatego ja piszac wlasny framework sporo usunalem. Rozwiazanie z Mojavi ma jedna zalete, ktora mi sie podoba - kontroler jest sercem calej aplikacji. To jak skrzyzowanie z ktorego mozna pojechac w kazde miejsce. Dodalem jeszcze metody zwracania loggera oraz bazy danych. Adrian. |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 172 Pomógł: 0 Dołączył: 22.09.2002 Skąd: Gorzów Wlkp Ostrzeżenie: (0%) ![]() ![]() |
@orson: czy Twoje rozwiazanie to cos na zasadzie IoC? Jeśli tak to chętnie bym popatrzył jak rozwiązałeś przechowywanie relacji między obiektami. Jeśli nie to i tak ciekawi mnie Twoje podejście, czekam na skrypcik.
pozdrówka anas |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 548 Pomógł: 2 Dołączył: 19.07.2003 Ostrzeżenie: (0%) ![]() ![]() |
witam
Niestety nie jest to IoC :/ może kiedyś ![]() Zapraszam do zapoznania się z kodem: Temat: klasa Instance Manager zarzadzanie instacjami obiektow pozdrawiam -------------------- Computer games don't affect kids; I mean if <span style="font-weight: bold;">Pac Man</span> affected us as kids,we would all be running around in darkened rooms, munching magic pills and listening to repetitive electronic music.
|
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 740 Pomógł: 15 Dołączył: 23.08.2004 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
@orson - byłbym wdzięczny gdybyś przedstawił mi zalety używania Twojego menagera do pobierania obiektu singletona w stosunku do zwykłego getInstance
-- edit -- @Prph - a nie powinno byc na odwrot, ze to akcje przekazuje sie do kontrolera, a nie kontroler do akcji? Ten post edytował bigZbig 3.07.2006, 10:49:43 -------------------- bigZbig (Zbigniew Heintze) | blog.heintze.pl
|
|
|
![]()
Post
#12
|
|
![]() Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Podpisuję się pod drugim pytaniem bigZbiga. W ten sposób tworzysz zbędne zależności pomiędzy akcjami a kontrolerem, kiedy akcja potrzebuje tylko dane z kontekstu, który można przekazać jako argument. Sam stosuję taką logikę i jakoś nigdy nie trafiłem na sytuację, która by wymagała zmiany mojego podejścia.
Ten post edytował Ludvik 3.07.2006, 11:12:23 -------------------- |
|
|
![]()
Post
#13
|
|
![]() Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. ![]() |
W zasadzie, to ja też chciałbym przeczytac opinie na temat "kto komu i co powinien przekazywac w tym ukladzie"
![]() -------------------- 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. |
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 548 Pomógł: 2 Dołączył: 19.07.2003 Ostrzeżenie: (0%) ![]() ![]() |
witam
@bigZbig: to jest rozwiązanie generalne. Pozwala ujednolicić sposób pobierania wszystkich obiektów ... nie tylko do singletownów ... nieraz wewnątrz metody musisz się odwołać do dblayera który nie może być singletonem (2 połączenia do 2 różnych baz w aplikacji) i zawsze chcesz dostawać określony obiekt ... podajesz nazwę klasy i instancję i zawsze dostaniesz ten sam obiekt co poprzednio ... pozdrawiam -------------------- Computer games don't affect kids; I mean if <span style="font-weight: bold;">Pac Man</span> affected us as kids,we would all be running around in darkened rooms, munching magic pills and listening to repetitive electronic music.
|
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 172 Pomógł: 0 Dołączył: 22.09.2002 Skąd: Gorzów Wlkp Ostrzeżenie: (0%) ![]() ![]() |
Hej.
Również uważam, że bez sensu jest tworzyć sztywne powiązania między obiektami - lepszym i dającym większe pole manewru jest rozwiązanie pozwalające bez ingerencji w już stworzony kod, manipulować istniejącymi obiektami. Właśnie dlatego pytałem o IoC. Generalnie ciekawym podejściem jest AOP - czyli programowanie aspektowe. Pokrótce chodzi o to aby do już istniejąycych obiektów, bez ingerencji w kod dorzucać nową funkcjonalność, podmieniać, wykonywać coś przed wywołaniem, lub po wywołaniu metody itd. Przykład zastosowania: Mamy sklep internetowy - wyliczamy cenę na podstawie kilku obiektów - cena bazowa -> podatek -> waluta = cena za produkt. Załóżmy że klient stwierdza po 3 miesiącach że chciałbym na wybrane produkty dorzucać promocję. Wtedy dzieki możliwości zdefiniowania funkcjonalności która wykona się ma obiekcie product, np. $product->getProductPrice(Tax $taxObject, Currency $currencyObject, ProductDAO $productDAO); zaraz po zwróceniu przez powyższą metodę wartości -> (Invoke.AfterReturning - definiuje kiedy ma sie wykonac nowa funkcjonalnosc). Po tym wszystkim należałoby zdefiniować dla jakich metod ma się to wykonać - np. Include("getProductPrice*") i mamy powiazania - tym wszystkim musi zarzadzac specjalnie przygotowane narzedzie. W chwili obecnej w php ze wgzledu na trudna implementacje nie spotkalem sie z takim czyms - ale to ciekawy pomysl, ktory warto by bylo poruszyc w przyszlosci - to daje naprawde ogromne mozliwosci manipulowania kodem, bez koniecznosci ingerowania w juz istniejacy. Co myślicie o takim podejściu? pozdrawiam anas Ten post edytował anas 3.07.2006, 11:50:40 |
|
|
![]()
Post
#16
|
|
![]() Grupa: Zarejestrowani Postów: 2 262 Pomógł: 21 Dołączył: 3.05.2004 Skąd: Sopot, Krakow, W-wa Ostrzeżenie: (0%) ![]() ![]() |
Cytat Co myślicie o takim podejściu? Podejscie fajne, ale raczej jestesmy bez szans jesli chodzi o implementacje w php. Musialbylo by to chyba dosc absudarlnie wygladac gdyz trzeba by jakoby sprawdzac kazde operacje co spowoduje narzut kodu wiekszy niz to wszystko warte.Wracajac do tematu - przekazyc kontroler do akcji. To tak jakby umieszczac generala w oddziale, dac Kalacha to reki i kazac walczyc, a on ma przeciez dowodzic ![]() Ten post edytował NuLL 3.07.2006, 11:58:04 -------------------- Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
|
|
|
![]()
Post
#17
|
|
![]() Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. ![]() |
Wydaje mi się, że samo przekazanie obiektu kontrolera nie jest złe, bo w sumie chodzi o to, aby zbudowac aplikacje na kontrolerze. Z drugiej strony ciekwaszym i bardziej elastycznym rozwiązaniem będzie utworzenie klasy bramy udostępniającej obiekt kontrolera.
w teorii user_code --> interface (obiekt lub statycznie) --> controller Oczywiście można stworzy taki interfejs bezpośrednio w klasie, ale byłoby to zbytnie sprzęganie. Wilk syty i owca cała. W każdym razie tak mi się wydaje. W drugim przypadku (przekazywanie akcji kontrolerowi) możemy napotkac w dalszej perspektywie pewne trudne do przewidzenia problemy związane z budową samej akcji, która musi by zbudowana tak, aby rozumiała kontroler i była podatna na testowanie. Ehh. To podobnie jak z prawami użytkowników - trzymac je razem z uzytkownikiem, czy w jakimś centralnym miejscu...a moze jeszcze inaczej. -------------------- 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. |
|
|
![]()
Post
#18
|
|
![]() Grupa: Zarejestrowani Postów: 740 Pomógł: 15 Dołączył: 23.08.2004 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Myślę, że tu jest generalnie problem z nazewnictwem bo kontroler u Prph'a jest jak podejrzewam specyficznym obiektem typu DTO (Data Transfer Object) służącym jedynie do transportowania informacji.
@orson - poczytaj na temat rejestru obiektów w Zend Frameworku. Moim zdaniem chyba chcesz przekombinować swojego menadżera. Ten post edytował bigZbig 4.07.2006, 07:20:27 -------------------- bigZbig (Zbigniew Heintze) | blog.heintze.pl
|
|
|
![]()
Post
#19
|
|
![]() Grupa: Zarejestrowani Postów: 338 Pomógł: 2 Dołączył: 4.03.2006 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
@Prph - a nie powinno byc na odwrot, ze to akcje przekazuje sie do kontrolera, a nie kontroler do akcji? To zalezy jak napiszesz framework. Moj kontroller przypomina nieco kontroler Mojavi. Stanowi on "otoczke" calej aplikacji. Kontroler wykonuje akcjie. Te natomiast potrzebuja dostepu do danych post i get trzymanych w Kontekscie. A to kontroler posiada ow kontekst. Jest to calkiem dobre rozwiazanie - wygodne. Wszystko co potrzebujesz jest w kontrolerze. Adrian. |
|
|
![]()
Post
#20
|
|
![]() Grupa: Zarejestrowani Postów: 2 262 Pomógł: 21 Dołączył: 3.05.2004 Skąd: Sopot, Krakow, W-wa Ostrzeżenie: (0%) ![]() ![]() |
Prosty quiz
![]()
I teraz w jaki sposob majac kontekst w kontrolerze obsluzysz taka klase jesli ona nie ma singletonu ![]() ![]() Ten post edytował NuLL 3.07.2006, 17:53:54 -------------------- Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 16:55 |