Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wzorzec Strategy, + wzorzec MVC
Forum PHP.pl > Forum > PHP > Object-oriented programming
pabito
Witam
Chciałbym zapytać o wzorzec strategy. Na początku chciałbym zapytać czy ten wzorzec jest poprawnie zaimplementowany, co w nim jest nie tak(cenne są najdrobniejsze uwagi)?
Jako, że strategia definiuje rodzinę algorytmów chciałbym go wykorzystać przy widoku w MVC generując odpowiedni rodzaj widoku(HTML,PDF,XML).
Następnie chciałbym zapytać czy jest to odpowiednie miejsce na wykorzystanie tego wzorca?

  1. interface Render
  2. {
  3. public function generate();
  4. }
  5.  
  6. class RenderHTML
  7. {
  8. public function generate(){
  9. echo 'HTML';
  10. }
  11. }
  12.  
  13. class RenderXML
  14. {
  15. public function generate(){
  16. echo 'XML';
  17. }
  18. }
  19.  
  20. class RenderPDF{
  21. public function generate(){
  22. echo 'PDF';
  23. }
  24. }
  25.  
  26. class ContextRender{
  27. private $render;
  28.  
  29. public function setRender($obj){
  30. $this->render=$obj;
  31. }
  32.  
  33. public function getRender(){
  34. return $this->render;
  35. }
  36. }


następnie zostanie on użyty w ten sposób

  1. class IndexController extends Controller{
  2. public $view;// jest to obiekt ContextRender
  3.  
  4. public function abcAction()
  5. {
  6. $this->view->setRender(new RenderPDF());
  7. $this->view->getRender()->generate();
  8. }
  9. }


Co myślicie o takiej implementacji? Chciałbym poznać wzorce, więc wymyśliłem sobie o to taki przykład. Cenie sobie każde uwagi
Pilsener
Nie widzę tu strategii.
Dlaczego?
Wg mnie podstawową cechą strategii jest zawarty w niej algorytm doboru obiektów współpracujących, np.:
  1. $view->setRender(123456);
- jeśli parametr > 1000 to obiekt $view skorzysta z obiektu $a, a jeśli nie to z obiektu $b. Ale my tego nie widzimy i nie obchodzi nas to.

Natomiast coś takiego:
  1. $p = 123456;
  2. if ($p > 1000) {
  3. $view->setRender($a);
  4. } else {
  5. $view->setRender($b);
  6. }
- to wg mnie zwykły dekorator, bo używając klasy $view wiesz dokładnie, jakim obiektem zostanie ona "udekorowana"

I wg mnie to jest podstawowa różnica - strategia SAMA decyduje jakich użyje obiektów.

Mam nadzieję, że sam dobrze to rozumiem nerdsmiley.png

Acha - i tego typu współpracę klas warto ogarnąć jakimś interfejsem by mieć pewność, że np. każdy obiekt implementujący TwojRenderDecoratorInterface może być użyty do zmiany sposobu działania Twojego renderowania.
Adi32
Jest tyle pytań tego typu, dodatkowo różni ludzie różnie to rozumieją, i jest wiele dobrych wyjść a mimo to tez często się zastanawiam, czy rozwiązanie które implementuje (najczęściej w przypadku łączenia wzorców) jest zrobione dobrze. Powinna być jakaś dobra książka - jak myśleć obiektowo, jak projektować strukturę.
emp
W bardzo podobnym kontekście Martin Fowler użył wzorca stanu ( prawie to samo co strategia ) w pierwszym rozdziale tej ksiązki Refaktoryzacja ulepszanie struktury istniejacego kodu
Obiekt Martina przy konstrukcji dostaje typ , a na podstawie tego typu wybiera odpowiednia strategie którą będzie stosował tak jak napisał alkocholik. Strategie stosuje do generowania odpowiedniego widoku tekstowego lub html.
Robisz dobrze. Chronisz zmienność. Oczywiście możesz zastosować rózne wzorce, ale napewno będziesz miał jakiś interfejs typu render i klasy które go implementują.

Coś o wzorcach i jak je łączyć. Dla każdego kto nie czytał pozycje obowiązkowe:
Wzorce projektowe elementy oprogramowania obiektowego wielokrotnego uzytku
Architektura systemow zarzadzania przedsiebiorstwem wzorce projektowe
Crozin
@Pilsener: Coś Ci się chyba pomieszało. Wzorzec strategii zakłada, że implementacja algorytmu/interfejsu zostanie mu przekazana z zewnątrz, tak jak w przykładzie autora.

@pabito: Czy miałeś już może kontakt z popularnymi FW typu Zend/Symfony? Pytam, ponieważ implementacja MVC, nawet taka koślawa, jest zagadnieniem bardzo obszernym, wymagającym podjęcia większej ilości tego typu decyzji, a spieprzenie sprawy w jednym miejscu oznaczać będzie właściwie spieprzenie wszystkiego. Tobie zaś, patrząc po zadanym pytaniu, może, i najprawdopodobniej nie uda się tego zrobić poprawnie. Zawsze warto zapoznać się z istniejącymi rozwiązaniami, zobaczyć jak działają i jakie problemy wynikają z ich budowy. Wtedy można myśleć o tworzeniu czegoś własnego.

Jednak wracając do tematu: O ile w kontrolerze spokojnie możesz dać $this->view->setRendered(new HTMLRenderer('/sciezka/do/szablonu')) o tyle wywołanie metodu view->generate() powinno już odbyć się poza kontrolerem.
Pilsener
Cytat(Crozin @ 15.05.2013, 09:54:13 ) *
@Pilsener: Coś Ci się chyba pomieszało. Wzorzec strategii zakłada, że implementacja algorytmu/interfejsu zostanie mu przekazana z zewnątrz, tak jak w przykładzie autora.
- to czym w takim razie jest dekorator i jaka jest różnica? Bo jeśli tak, to strategia === dekorator. Właśnie patrzę na przykłady i różnicy nie widzę - sposób współpracy klas jest dla mnie ten sam. I jak w takim razie będzie nazywał się wzorzec w którym jeden obiekt sam wybiera sobie inny?

I czy można tu w ogóle mówić o jakiś standardach czy każdy sobie rzepkę skrobie i tyle wzorców co ich autorów?
Crozin
Na prawdę nie wiem gdzie patrzyłeś na opisy tych dwóch wzorców, ale już po samych diagramach czy przykładach z Wikipedii widać, że jedno z drugim nie ma za wiele wspólnego: http://en.wikipedia.org/wiki/Decorator_pattern http://en.wikipedia.org/wiki/Strategy_pattern
Dejmien_85
Cytat(Pilsener @ 16.05.2013, 20:55:18 ) *
- to czym w takim razie jest dekorator i jaka jest różnica? Bo jeśli tak, to strategia === dekorator. Właśnie patrzę na przykłady i różnicy nie widzę


Dekorator oraz Strategia to dwa diametralnie różne od siebie wzorce, które różnią się w implementacji oraz wykorzystaniu. Strategia to zwiększenie elastyczności kodu, nazwę to luźno "zamienność poprzez polimorfizm", a Dekorator to dynamiczne rozszerzanie (dekorowanie) funkcjonalności (obiektów). Aby korzystać ze wzorców trzeba je najpierw dogłębnie poznać - wielu niestety kończy tyko na czytaniu formułek nt. wzorców, a tutaj potrzebna jest praktyka.

Jeśli ktoś myśli, że po przeczytaniu kilku artykułów nt. jakiegoś wzorca tak po prostu się go nauczy, wtedy do końca życia będzie się zastanawiał jaka jest różnica pomiędzy jednym a drugim... wink.gif
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.