Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> Controller - co lepsze?, getInstance(), czy przekazywanie obiektom...
Prph
post
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:

  1. <?php
  2. // 1 rozwiazanie, klasa akcji:
  3.  
  4. public function execute(IController $oController)
  5. {
  6. $oController->.......;
  7. }
  8.  
  9. // 2 rozwiazanie, klasa akcji:
  10.  
  11. public function execute()
  12. {
  13. $oController = Controller::getInstance();
  14. $oController->.......;
  15. }
  16. ?>


Adrian.
Go to the top of the page
+Quote Post
Ludvik
post
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.


--------------------
Go to the top of the page
+Quote Post
Prph
post
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.
Go to the top of the page
+Quote Post
anas
post
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
Go to the top of the page
+Quote Post
Prph
post
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.
Go to the top of the page
+Quote Post
orson
post
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:
  1. <?php
  2. $obj = aeClassManager::getInstance('someSingletonClass', 'instanceName', true, array('param'=>'value'));
  3. $obj2 = aeClassManager::getInstance(array('someSingletonClass', 'methodToGetSingletonInstance'), 'instanceName', true, array('param'=>'value'));
  4. ?>

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.
Go to the top of the page
+Quote Post
Ludvik
post
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?


--------------------
Go to the top of the page
+Quote Post
Prph
post
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 winksmiley.jpg
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.
Go to the top of the page
+Quote Post
anas
post
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
Go to the top of the page
+Quote Post
orson
post
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ś winksmiley.jpg
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.
Go to the top of the page
+Quote Post
bigZbig
post
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
Go to the top of the page
+Quote Post
Ludvik
post
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


--------------------
Go to the top of the page
+Quote Post
Cysiaczek
post
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" smile.gif


--------------------
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.
Go to the top of the page
+Quote Post
orson
post
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.
Go to the top of the page
+Quote Post
anas
post
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
Go to the top of the page
+Quote Post
NuLL
post
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 winksmiley.jpg

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 :)
Go to the top of the page
+Quote Post
Cysiaczek
post
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.
Go to the top of the page
+Quote Post
bigZbig
post
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
Go to the top of the page
+Quote Post
Prph
post
Post #19





Grupa: Zarejestrowani
Postów: 338
Pomógł: 2
Dołączył: 4.03.2006
Skąd: Łódź

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


Cytat(bigZbig @ 3.07.2006, 09:47 ) *
@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.
Go to the top of the page
+Quote Post
NuLL
post
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 winksmiley.jpg
  1. <?php
  2.  
  3. class user
  4. {
  5. private static $oInstance=null;
  6.  
  7. private $id=0,$lang='';
  8.  
  9. public static function getInstance()
  10. {
  11. if(self::$oInstance==null) self::$oInstance=&new user();
  12.  
  13. return self::$oInstance;
  14. }
  15.  
  16. private function __construct()
  17. {
  18. $userData=httpContext::session()->getAttribute('user');
  19.  
  20. if($userData{1})
  21. {
  22. $userData=unserialize($userData);
  23.  
  24. $this->id=(int)$userData['id'];
  25. $this->lang=$userData['lang'];
  26. }
  27. else
  28. {
  29. $this->id=0;
  30. $this->lang=DEFAULT_LANG;
  31. }
  32. }
  33.  
  34. public function isLoggedIn()
  35. {
  36. return ($this->id>0);
  37. }
  38.  
  39. public function login($login,$pass)
  40. {
  41. $auth=authenticator::getInstance();
  42.  
  43. $id=$auth->authenticate($login,$pass);
  44.  
  45. if($id>0)
  46. {
  47. $this->id=$id;
  48. $this->lang=DEFAULT_LANG;
  49. return 1;
  50. }
  51. else
  52. {
  53. return 0;
  54. }
  55. }
  56.  
  57. public function save()
  58. {
  59. httpContext::session()->setAttribute('user',serialize(array('id'=>$this->id,'lang'=>$this->lang)));
  60. }
  61.  
  62. public function getLang()
  63. {
  64. return $this->lang;
  65. }
  66.  
  67. public function logout()
  68. {
  69. $this->id=0;
  70. }
  71. }
  72.  
  73. ?>

I teraz w jaki sposob majac kontekst w kontrolerze obsluzysz taka klase jesli ona nie ma singletonu questionmark.gif Bo wg mnie sztuka dla sztuki ( absurdem ) jest przekazywanie kotrolera z kontekstem do kazdej klasy withstupidsmiley.gif

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 :)
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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 Aktualny czas: 21.08.2025 - 16:55