Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [ideologia] w jaki sposób napisac pluginy?, zastosowac wzorzec dekorator?
aleksander
post 3.02.2006, 22:12:26
Post #1





Grupa: Przyjaciele php.pl
Postów: 742
Pomógł: 0
Dołączył: 14.12.2003
Skąd: Gdańsk, Trójmiasto

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


Piszę aplikacje obiektowych formularzy i natknąłem się na mały problem. OF moga miec klasy Rule które walidują pola formularza i pluginy które wykonują na nich operacje np md5 na polu po stronie klienta.

Na początku chciałem zrobic te dwie rzeczy oddzielnie ale pomyslałem sobie, że zastosuje takie samo API dla Rules i Pluginów i zrobie to za pomocą dekoratora np
  1. <?php
  2. new MD5hash( new IsNotNullRule( new isNumericRule( new Form() ) ) );
  3. ?>
Co Wy o tym myslicie?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Ludvik
post 4.02.2006, 15:06:37
Post #2





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


Cytat
Wszystko zależy do tego w jakiej kolejności utworzy się instancje (patrz kod wyżej).


To nie jest do końca prawdą. Nie mówię o wywołaniu metod, tylko wykonaniu czynności filtrów, a to jest duża różnica. Oto prosty przykład.

  1. <?php
  2. abstract class Decorator {
  3. public function __construct($nextDecorator = null) {
  4. if (!empty($nextDecorator) && $nextDecorator instanceof Decorator) {
  5. $this->next = $nextDecorator;
  6. }
  7. }
  8.  
  9. abstract public function dosmth($param);
  10.  
  11. protected $next;
  12. }
  13.  
  14. class Decorator1 extends Decorator {
  15. public function __construct($nextDecorator = null) {
  16. parent::__construct($nextDecorator);
  17. }
  18.  
  19. public function dosmth($param) {
  20. echo '<1>';
  21. if (!empty($this->next)) {
  22. $this->next->dosmth($param);
  23. }
  24. }
  25. }
  26.  
  27. class Decorator2 extends Decorator {
  28. public function __construct($nextDecorator = null) {
  29. parent::__construct($nextDecorator);
  30. }
  31.  
  32. public function dosmth($param) {
  33. if (!empty($this->next)) {
  34. $this->next->dosmth($param);
  35. }
  36. echo '<2>';
  37. }
  38. }
  39.  
  40. class Decorator3 extends Decorator {
  41. public function __construct($nextDecorator = null) {
  42. parent::__construct($nextDecorator);
  43. }
  44.  
  45. public function dosmth($param) {
  46. echo '<3>';
  47. if (!empty($this->next)) {
  48. $this->next->dosmth($param);
  49. }
  50. }
  51. }
  52.  
  53. $d = new Decorator1(new Decorator2(new Decorator3()));
  54. $d->dosmth('');
  55. ?>


Niestety dekorator wymaga trzymania porządku w kodzie i pozwala na takie przekłamania...

Ten post edytował Ludvik 4.02.2006, 15:07:08


--------------------
Go to the top of the page
+Quote Post

Posty w temacie


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 - 17:20