Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Context] Czy to taka konstrukcja nie łamie założeń?
Forum PHP.pl > Forum > PHP > Object-oriented programming
starach
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?
wookieb
O jakie zasady ci chodzi?
phpion
Chyba context powinien być singletonem więc konstrukcja new Context nie powinna się pojawić winksmiley.jpg
starach
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. ?>
LBO
@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
starach
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?
LBO
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. ?>
starach
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.
LBO
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. [...]
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.