Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Context] Czy to taka konstrukcja nie łamie założeń?
starach
post 7.06.2009, 20:45:54
Post #1





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


Wykombinowałem sobie żeby inicjalizacja Context'u wyglądała następującą:
  1. <?php
  2. $c = new Context();
  3. $c->Router(new Router());
  4. $c->Loader(Loader::createInstance()->setRouter($c->Router()));
  5. ?>
Czy nie łamie to ogólnie przyjętych zasad?
Go to the top of the page
+Quote Post
wookieb
post 7.06.2009, 20:53:55
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




O jakie zasady ci chodzi?


--------------------
Go to the top of the page
+Quote Post
phpion
post 7.06.2009, 21:00:34
Post #3





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Chyba context powinien być singletonem więc konstrukcja new Context nie powinna się pojawić winksmiley.jpg
Go to the top of the page
+Quote Post
starach
post 7.06.2009, 21:07:37
Post #4





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


Cytat(wookieb @ 7.06.2009, 21:53:55 ) *
O jakie zasady ci chodzi?
Chociażby właśnie o to co napisał phpion tongue.gif
  1. <?php
  2. class Context
  3. {
  4.    private $aObjects = array();
  5.    public function Loader(LoaderInterface $l = null)
  6.    {
  7.        if($l !== null) {
  8.            $this->setObject($l, 'LoaderInterface');
  9.        } else {
  10.            return $this->getObject('LoaderInterface');
  11.        }
  12.    }
  13.    public function Router(RouterInterface $r = null)
  14.    {
  15.        if($r !== null)    {
  16.            $this->setObject($r, 'RouterInterface');
  17.        } else {
  18.            return $this->getObject('RouterInterface');
  19.        }
  20.    }
  21.    public function getObject($class)
  22.    {
  23.        if(!isset($this->aObjects[$class])) {
  24.            throw new Error('context.objectnotfound', array('class' => $class));
  25.        }
  26.        return $this->aObjects[$class];
  27.    }
  28.    public function setObject($object, $id = null)
  29.    {
  30.        if(method_exists($object, 'setContext'))
  31.        {
  32.            $object->setContext($this);
  33.        }
  34.        $class = $id !== null ? $id : get_class($object);
  35.        $this->aObjects[$class] = $object;
  36.    }
  37. }
  38. ?>
Go to the top of the page
+Quote Post
LBO
post 7.06.2009, 21:52:15
Post #5





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


@orglee, twoja implementacja nie jest zła, ale wyróżnij settery i gettery, bo teraz jest mało intuicyjne. Wg mnie - tego co czytałem i "co czuję" (mam nadzieję, że rozumiesz o co mi chodzi przez to) - kontekst jest bardzo świadom siebie i tego co trzyma wewnątrz (wtedy metody proxy mają sens). A tak masz bardziej rejestr (bo co stoi na przeszkodzie, żeby kontekst trzymał wyspecjalizowany obiekt rejestru?). Pamiętaj także, że kontekst nie służy tylko jako kontener dla obiektów, może też udostępniać wyspecjalizowane metody zależne od aplikacji, którą piszesz.

@phpion, a dlaczego powinien być singletonem? Co jak co, ale dzięki kontekstowi zapobiega się tworzeniu singletonów z obiektów loggera, database managera, czy routera. Po co więc to psuć?
Wiem, że kontekst w symfony jest tak zbudowany, ale mi osobiście nie zdarzyło się jeszcze korzystać z tego.
Dzięki IoC mam kontekst tam gdzie być powinien i nigdzie więcej. Jako przykład podam formularze w sf i referrera. Mnóstwo (znakomita większość) tutoriali podaje jako rozwiązanie pobranie contextu z singletona wewnątrz formularza, a następnie wyciągnięcie z requesta stringa z referrerem. Podczas, gdy IMHO najczystszym i najbardziej przenośnym (czyli mógłbym użyć formularza poza sf) rozwiązaniem byłoby zapodanie referrera w options formularza[edit], lub bezpośrednie ustawienie wartości pola. Sęk w tym, żeby zrobić to w akcji, tam gdzie mam kontekst udostępniony[edit].

Singleton jest dla leniwych smile.gif

@orglee, pamiętaj, że to tylko wskazówki - jeżeli działa teraz, to znaczy, że jest dobrze, jeżeli nie działa - wtedy miałem rację ;P

Pozdrawiam, Alan

Ten post edytował LBO 7.06.2009, 21:58:39
Go to the top of the page
+Quote Post
starach
post 7.06.2009, 22:22:12
Post #6





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


Cytat
A tak masz bardziej rejestr (bo co stoi na przeszkodzie, żeby kontekst trzymał wyspecjalizowany obiekt rejestru?)
IMHO Nawet jeśli przekażesz rejestr do jakieś klasy to nie uczyni z niego kontekstu, a to że składuję obiekty w tablicy nie zmienia Context'u w rejestr. smile.gif

Co masz na myśli jeśli chodzi o wyróżnienie settera i gettera?
Go to the top of the page
+Quote Post
LBO
post 7.06.2009, 22:31:25
Post #7





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


Cytat
Co masz na myśli jeśli chodzi o wyróżnienie settera i gettera?


  1. <?php
  2. $loader = $context->Loader(); // zwraca obiekt loadera
  3.  
  4. $context->Loader($loader); // zapisujesz obiekt loadera
  5.  
  6. // Wygląda to dziwnie.
  7.  
  8. $loader = $context->getLoader();
  9.  
  10. $context->setLoader($loader);
  11.  
  12. // to już nie
  13. ?>
Go to the top of the page
+Quote Post
starach
post 7.06.2009, 22:49:28
Post #8





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


Aha już rozumiem. Pozostanę jednak przy mojej wersji. W miarę jak projekt będzie się rozrastał i będę dodawał nowe klasy do Context'u będzie zwiększać się też ilość metod. Przy 12 różnych obiektach to jest 12 dodatkowych metod. Standardowe nazewnictwo setterów i getterów stosuję tylko przy typach prymitywnych i jeśli ustawiam lub pobieram bliżej nieokreślony obiekt.
Go to the top of the page
+Quote Post
LBO
post 1.07.2009, 15:37:38
Post #9





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


Zwięzły, ale treściwy artykuł na temat kontekstu w SF. Poruszany tam problem miałem nawet okazję skomentować kilka postów wyżej smile.gif

Cytat(LBO @ 7.06.2009, 22:52:15 ) *
[...] @phpion, a dlaczego powinien być singletonem? Co jak co, ale dzięki kontekstowi zapobiega się tworzeniu singletonów z obiektów loggera, database managera, czy routera. Po co więc to psuć?
Wiem, że kontekst w symfony jest tak zbudowany, ale mi osobiście nie zdarzyło się jeszcze korzystać z tego. [...]
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: 14.08.2025 - 12:24