Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [ideologia] w jaki sposób napisac pluginy?, zastosowac wzorzec dekorator?
aleksander
post
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
Ociu
post
Post #2





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




Ja też ostatnio miałem taki problem. Postanowiłem połączyć mapper z Rules Api i tak oto powstał jakiś dziwny stwór który dzięki Bogu działa smile.gif
Go to the top of the page
+Quote Post
Ludvik
post
Post #3





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

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


Do mnie nie przemawia łączenie reguł z pluginami. Reguły służą do sprawdzenia poprawności danych, a pluginy mają na tych danych operować. Poza tym dekorator nie jest najlepszym wyjściem w tym przypadku, jeżeli już musisz tak zrobić. Wzorzec ma to do siebie, że nie zapewnia odpowiedniej kolejności wykonania. Więc możesz przez przypadek złe dane hashować. Ja bym to osobiście rozłączył w jakiś sposób.


--------------------
Go to the top of the page
+Quote Post
aleksander
post
Post #4





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

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


Cytat
Wzorzec ma to do siebie, że nie zapewnia odpowiedniej kolejności wykonania.

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

Poza tym może zajśc potrzeba kiedy najpierw należy jakies dane "zoperowac" a dopiero potem je zwalidowac. W przypadku rozdzielenia nie da się tego zrobic.
Go to the top of the page
+Quote Post
Ludvik
post
Post #5





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

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 Aktualny czas: 21.08.2025 - 11:55