Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Design patterns - opracowanie
Forum PHP.pl > Inne > Oceny
ziolo
http://mcreativo.pl/

Wzorce projektowe przykłady w Php, Java.
Wszystkie wzorce opisane(eng) z książki: "Design Patterns: Elements of Reusable Object-Oriented Software" (Wyjątek zamiana Singletona na DI)
Generalnie każdy wzorzec krok po kroku, podobne rozwiązanie jak tutorial z Angulara, wszystkie kody działają i można pobrać z: https://bitbucket.org/mcreativo/. Dla każdego kroku osobny branch: step1, step2 itd...

W przyszłości zamierzam jeszcze dodać komentarze(fb) do każdej strony bo wiadomo większy feedback lepsza jakość kodu.
nospor
Jak juz piszesz po angielsku, to trzymaj sie tego do konca
Cytat
1) Co zrobiliśmy

Dla ClassA stworzyliśmy interfejs który ma implementować - addObserver oraz removeObserver
dodająca i podłączająca obiekty Observer

Obiekty Observer implementują jedną metodę - którą wywołuje obiekt Obserwowany

2) Jakie są zalety tego rozwiązania ?

Teraz możemy dynamicznie podłączać wiele obserwatorów, łatwo możemy dodawać nowego obserwatora, nie zmieniając obiektu obserwowanego


ps: czy dobrze zrozumialem ze poprostu wziales teksty z ksiazki i wstawiles je na strone?
ziolo
Cytat(nospor @ 4.02.2016, 16:43:52 ) *
Jak juz piszesz po angielsku, to trzymaj sie tego do konca


ps: czy dobrze zrozumialem ze poprostu wziales teksty z ksiazki i wstawiles je na strone?


Ad 1) Nie, wszystkie przykłady i teksty sam wymyślałem. Książkę czytałem i wziąłem po prostu z niej listę wzorców.

Przykłady sa specjalnie abstrakcyjne i bardzo proste, żeby można było skoncentrować się na czym wzorzec polega i jak się zmienił kod.

Ad 2) Pierwsza wersja była pisana w 2014 w "PL" i tylko php. Teraz w styczniu przetłumaczyłem całość na en i napisałem przykłady w Javie 8.
Ad 3) Rozumiem, że ten tekst pl nie znalazłeś na stronie ?
Być może branch "master" który nie został updatowany.
Opublikowane na stronie są branche "stepX" i mam nadzieje, ze wszędzie już jest "en".

@Pyton_000, dzięki za sugestie z disqus(nie znałem), jak mi się będzie chciało i będę miał czas to dorobie jaśniejszą skórkę.
Pyton_000
tylko nie FB, wrzuć disqus, lepiej się sprawdza.

Co do strony super. Merytorycznie nieźle. Tylko może zrób wersję jasną i jakąś taką przystępniejszą.
Ta w prawdzie jest czytelna ale jakoś tak nie lubię ciemnych stron.

Tutaj liczy się merytoryka.
nospor
Cytat
Rozumiem, że ten tekst pl nie znalazłeś na stronie ?

Na bitbucket. Troche to byl szok jak czytalem arta po en a potem w bitbucket kody po pl wink.gif
Spawnm
http://mcreativo.pl/design-patterns-php/spawnm/step1 smile.gif

Cytat
Warning: file_get_contents(/home/mcmarcin/www/mcreativo/app/..//code/design-patterns-php/spawnm/step1/_desc): failed to open stream: No such file or directory in /home/mcmarcin/www/mcreativo/src/Mcreativo/FrontBundle/Controller/CodeController.php on line 25
ziolo
thx Spawnm - w koncu to fixnalem

+ dodalem Mediatora: jakos mi umknął po drodze
lukaskolista
Zajrzałem do wzorca strategia, bo akurat ostatnio go używałem i mam uwagę:
Strategia jest dynamiczna i zależna od kontekstu, a w Twoim przykładzie w php nie ma żadnego kontekstu, jest po prosty typowe proxy:
  1. class Context
  2. {
  3. /**
  4.   * @var StrategyA
  5.   */
  6. protected $strategyA;
  7.  
  8. /**
  9.   * @var StrategyB
  10.   */
  11. protected $strategyB;
  12.  
  13. /**
  14.   * @param StrategyA $strategyA
  15.   * @param StrategyB $strategyB
  16.   */
  17. function __construct(StrategyA $strategyA, StrategyB $strategyB)
  18. {
  19. $this->strategyA = $strategyA;
  20. $this->strategyB = $strategyB;
  21. }
  22.  
  23. public function doA()
  24. {
  25. $this->strategyA->doA();
  26. }
  27.  
  28. public function doB()
  29. {
  30. $this->strategyB->doB();
  31. }
  32. }


Moim zdaniem strategia wygląda mniej więcej tak:
  1. class Context implements BusinessContextInterface
  2. {
  3. /**
  4.   * @var StrategyA
  5.   */
  6. protected $strategyA;
  7.  
  8. /**
  9.   * @var StrategyB
  10.   */
  11. protected $strategyB;
  12.  
  13. /**
  14.   * @param StrategyA $strategyA
  15.   * @param StrategyB $strategyB
  16.   */
  17. function __construct(StrategyA $strategyA, StrategyB $strategyB)
  18. {
  19. $this->strategyA = $strategyA;
  20. $this->strategyB = $strategyB;
  21. }
  22.  
  23. public function do()
  24. {
  25. $rand = rand(0,1);
  26.  
  27. switch ($rand) {
  28. case 0:
  29. $this->strategyA->do();
  30. break;
  31.  
  32. case 1:
  33. $this->strategyB->do();
  34. break;
  35. }
  36. }
  37. }


W moim przykładzie obiekt kontekstu dynamiczne, adekwatnie do sytuacji dobiera konkretną strategię, a jego klient nie jest tego świadomy, wie jedynie, z jakiego interface'u skorzystać.
ziolo
Hmm sprawdziłem pierwsze dwa przykłady z google i "Strategia" nie polega na tym, że implementacja zależy od wewnętrznych stanów Context.
Zależy tylko od strategii którą wstrzykujemy. To prosty wzorzec projektowy.

http://www.oodesign.com/strategy-pattern.html
http://www.tutorialspoint.com/design_patte...egy_pattern.htm

Twój przykład bardziej pasuje pod wzorzec "State" zresztą to sa bardzo podobne wzorce.


A co do tego:
Cytat(lukaskolista @ 9.02.2016, 11:40:53 ) *
klient nie jest tego świadomy, wie jedynie, z jakiego interface'u skorzystać.


W moim przykładzie klienta jest uproszczenie, że może wydawać się,  że w jednym miejscu tworzymy "Context" i używamy go od razu.
Ale tak naprawdę w realnym świecie to będą najprawdopodobniej różne miejsca. I wtedy faktycznie powinno się do docelowego klienta przesłać jedynie informacje o typie(interfejs) i ten docelowy klient nie będzie wiedział jakie strategie były wstrzyknięte.

  1. Context context = new Context(new StrategyA1(), new StrategyB2());
  2.  
  3. // to poniżej może być w zupełnie innym miejscu
  4. context.doA();
  5. context.doB();


lukaskolista
W takim razie nie zrozumiałem uproszczenia, wygląda to dla mnie jak bardzo proste proxy. Mój przykład stanem na pewno nie jest, wzorce podobne, ale w stanie implementacją steruje właśnie klient obiektu, a w strategii kontekst.
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-2018 Invision Power Services, Inc.